單元測試詳解

只有優(yōu)秀的程序員才關心產品,只有優(yōu)秀的程序員才在乎程序的性能,我們要具備性能測試和性能優(yōu)化的能力,今天開始我開始給大家寫一寫介紹性能方面的文章,今天寫單元測試.

單元測試簡介如下:

  1. 單元測試是以代碼測試代碼
  2. 紅燈/綠燈迭代開發(fā)
  3. 在日常開發(fā)中,數據大部分來自于網絡,很難出現所有的邊界數據!如果沒有測試所有條件就上架
    在運行時造成閃退!
  4. 自己建立測試用例(使用的例子數據卜壕,專門檢查邊界點)
  5. 單元測試不是靠 NSLog 來測試,NSLog 是程序員用眼睛看的笨辦法。

提示:

  1. 不是所有的方法都需要測試
    例如:私有方法不需要測試糊昙!只有暴露在 .h 中的方法需要測試!面向對象有一個原則:開閉原則谢谦!
  2. 所有跟 UI 有關的都不需要測試释牺,也不好測試!
    MVVM回挽,把 小的業(yè)務邏輯 代碼封裝出來没咙!變成可以測試的代碼,讓程序更加健壯千劈!
  3. 一般而言祭刚,代碼的覆蓋度大概在 50% ~ 70%

demo github地址 https://github.com/1271284056/Unit-test-Demo
希望大家多給點星星~~

  1. 創(chuàng)建項目時候勾選下面的Include Unit Tests


    屏幕快照 2016-10-24 10.08.08.png
  2. 如果創(chuàng)建項目時候沒勾選這個選項,通過下圖操作為項目添加單元測試.

1448355504907178.png
1448355510545176.png
  1. 在單元測試文件夾新建測試類
屏幕快照 2016-10-24 11.53.40.png
  1. 首先建立測試類Person類,建立它的初始化方法,以及異步方法.

Preson.h

import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic) NSInteger age;

  • (instancetype)personWithDict:(NSDictionary *)dict;
    /// 異步加載個人記錄
  • (void)loadPersonAsync:(void (^)(Person *person))completion;
    @end

Preson.m

import "Person.h"

@implementation Person

  • (instancetype)personWithDict:(NSDictionary *)dict {
    Person *obj = [[self alloc] init];
    [obj setValuesForKeysWithDictionary:dict];
    if (obj.age <= 0 || obj.age >= 130) {
    obj.age = 0;
    }
    return obj;
    }
  • (void)setValue:(id)value forUndefinedKey:(NSString *)key {}
  • (void)loadPersonAsync:(void (^)(Person *))completion {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [NSThread sleepForTimeInterval:1.0];
    Person *person = [Person personWithDict:@{@"name": @"z", @"age": @5}];
    dispatch_async(dispatch_get_main_queue(), ^{
    if (completion != nil) {
    completion(person);
    }
    });
    });
    }

單元測試方法名都以test開頭,寫完后左邊會有一個菱形,點擊菱形,運行變成綠色就是成功,紅色表示失敗.

  • (void)testNewPerson {
    [self checkPersonWithDict:@{@"name": @"zhang", @"age": @20}];
    [self checkPersonWithDict:@{@"name": @"zhang"}];
    [self checkPersonWithDict:@{}];
    [self checkPersonWithDict:@{@"name": @"zhang", @"age": @20, @"title": @"boss"}];
    [self checkPersonWithDict:@{@"name": @"zhang", @"age": @200, @"title": @"boss"}];
    [self checkPersonWithDict:@{@"name": @"zhang", @"age": @-1, @"title": @"boss"}];
    // 到目前為止 Person 的 工廠方法測試完成!
    }
    /// 根據字典檢查新建的 Person 信息
  • (void)checkPersonWithDict:(NSDictionary *)dict {
    Person *person = [Person personWithDict:dict];
    NSLog(@"%@", person);
    // 獲取字典信息
    NSString *name = dict[@"name"];
    NSInteger age = [dict[@"age"] integerValue];
    // 1. 檢查名稱,使用 斷言 來測試的墙牌,提前預判條件必須滿足涡驮!
    XCTAssert([name isEqualToString:person.name] || person.name == nil, @"姓名不一致");
    // 2. 檢查年齡
    if (person.age > 0 && person.age < 130) {
    XCTAssert(age == person.age, @"年齡不正確");
    } else {
    XCTAssert(person.age == 0, @"年齡超限");
    }
    }

異步單元測試

/**
蘋果的單元測試是串行的
setUp
testXXX1
testXXX2
testXXX3
tearDown
中間不會等待異步的回調完成
*/

/// 測試異步加載 Person

  • (void)testLoadPersonAsync {
    // Xcode 6.0 開始解決 Expectation 預期
    XCTestExpectation *expectation = [self expectationWithDescription:@"異步加載 Person"];
    [Person loadPersonAsync:^(Person *person) {
    NSLog(@"%@", person.name);
    // 標注預期達成
    [expectation fulfill];
    }];
    // 等待 10s 期望預期達成 10秒后如果執(zhí)行到[expectation fulfill]這里表面單元測試成功
    [self waitForExpectationsWithTimeout:10.0 handler:nil];
    }

性能測試

以前我們測試一個函數執(zhí)行時間,在開始時候定義起始時間
NSTimeInterval start = CACurrentMediaTime();
函數執(zhí)行完畢后計算時間
NSLog(@"%f", CACurrentMediaTime() - start);
單元測試為我們提供一個- (void)testPerformanceExample {}函數,在這個函數的 [self measureBlock:^{}] 中寫耗時操作, 相同的代碼重復執(zhí)行 10 次,統(tǒng)計計算時間喜滨,平均時間在控制臺打印出來捉捅!
// Performance 性能!

/*
性能測試代碼一旦寫好鸿市,可以隨時測試锯梁!
*/

  • (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
    // Put the code you want to measure the time of here.
    // 將需要測量執(zhí)行時間的代碼放在此處即碗!
    for (int i = 0; i < 10000; i++) {
    [Person personWithDict:@{@"name": @"zhang", @"age": @20}];
    }
    }];
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陌凳,隨后出現的幾起案子剥懒,更是在濱河造成了極大的恐慌,老刑警劉巖合敦,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初橘,死亡現場離奇詭異,居然都是意外死亡充岛,警方通過查閱死者的電腦和手機保檐,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔梗,“玉大人夜只,你說我怎么就攤上這事∷馄牵” “怎么了扔亥?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谈为。 經常有香客問我旅挤,道長,這世上最難降的妖魔是什么伞鲫? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任粘茄,我火速辦了婚禮,結果婚禮上秕脓,老公的妹妹穿的比我還像新娘柒瓣。我一直安慰自己,他們只是感情好吠架,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布嘹朗。 她就那樣靜靜地躺著,像睡著了一般诵肛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默穴,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天怔檩,我揣著相機與錄音,去河邊找鬼蓄诽。 笑死薛训,一個胖子當著我的面吹牛,可吹牛的內容都是我干的仑氛。 我是一名探鬼主播乙埃,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闸英,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了介袜?” 一聲冷哼從身側響起甫何,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遇伞,沒想到半個月后辙喂,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡鸠珠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年巍耗,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渐排。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡炬太,死狀恐怖,靈堂內的尸體忽然破棺而出驯耻,到底是詐尸還是另有隱情亲族,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布吓歇,位于F島的核電站孽水,受9級特大地震影響,放射性物質發(fā)生泄漏城看。R本人自食惡果不足惜女气,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望测柠。 院中可真熱鬧炼鞠,春花似錦、人聲如沸轰胁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赃阀。三九已至霎肯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榛斯,已是汗流浹背观游。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驮俗,地道東北人懂缕。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像王凑,于是被迫代替她去往敵國和親搪柑。 傳聞我的和親對象是個殘疾皇子聋丝,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現工碾,斷路器弱睦,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • 最近一朋友正準備跳槽,就從各處搜索整理一些基礎倚喂,便于朋友復習每篷,也便于自己復習查看. 1. 回答person的ret...
    smile麗語閱讀 1,747評論 0 7
  • 今天我想寫點什么呢? 也許有一天我可以改正拖延的壞毛病端圈。但絕不是今天焦读。
    海公子說閱讀 217評論 0 0
  • 我們認識這么久,每當我們說到以后舱权,你總是一次又一次的告訴我——來日方長矗晃,可是你有沒有想過,時間真的是個很可怕的東西...
    此去經年依舊少年閱讀 472評論 0 2
  • 路過學校門口的時候,看見一對小情侶鸵贬,女生長得很秀氣俗他,穿得也很漂亮,懷里還抱著一個毛茸茸的小布熊阔逼。男孩很瘦兆衅,個子不高...
    米婭麗雅閱讀 1,125評論 4 23