iOS XCTest單元測試

一、概述

在Xcode中新建項目的時候會默認(rèn)勾選單元測試愕掏,勾選后每個XCode新建的iOS的項目中都有一個叫做”項目名Tests”的分組度秘,這個分組里就是XCTestCase的子類,XCTest中的測試類都是繼承自XCTestCase饵撑。當(dāng)我們?yōu)轫椖吭黾恿诵碌墓δ軙r敷钾,可以使用單元測試針對該模塊進(jìn)行測試。

二肄梨、單元測試的使用

1、常規(guī)測試

首先新建一個名為“MyDemo”的項目挠锥,我們會看到會自動生成如下的文件:

image1

MyDemoTests中代碼為:

#import <XCTest/XCTest.h>

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

@end

上面最重要的兩個方法為setUp和tearDown众羡,setUp方法在XCTestCase的測試方法調(diào)用之前調(diào)用。當(dāng)測試全部結(jié)束之后調(diào)用tearDown方法蓖租。上面的另外兩個方法是系統(tǒng)自動創(chuàng)建的功能測試用例的示例粱侣。我們可以自己創(chuàng)建測試方法,不過測試方法必須testXXX的格式蓖宦,且不能有參數(shù)齐婴,不然不會識別為測試方法。

setUp方法可以在測試之前創(chuàng)建在test case方法中需要用到的一些對象等稠茂。tearDown方法則在全部的test case執(zhí)行結(jié)束之后清理測試現(xiàn)場柠偶,釋放資源刪除不用的對象等情妖。

例如,我們?nèi)コ到y(tǒng)系統(tǒng)創(chuàng)建的兩個測試用例的示例诱担,我們自己創(chuàng)建一個方法:

#import <XCTest/XCTest.h>

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (void)setUp {
    [super setUp];
    NSLog(@"setUp-----------------");
}

- (void)tearDown {
    [super tearDown];
    NSLog(@"tearDown-----------------");
}

- (void)testMyFun{
    NSLog(@"testMyFun-----------------");
}

@end

按快捷鍵Command + U進(jìn)行單元測試毡证,打印結(jié)果(去除了其他暫不關(guān)注的打印):

2017-03-06 15:35:35.336 MyDemo[48088:5078800] setUp-----------------
2017-03-06 15:35:35.336 MyDemo[48088:5078800] testMyFun-----------------
2017-03-06 15:35:35.337 MyDemo[48088:5078800] tearDown-----------------
接下來我們新建一個類MyClass蔫仙,在MyClass中聲明和實現(xiàn)一個getNum的方法料睛,方法實現(xiàn)如下:

-(NSInteger)getNum{
    return 5;
}
然后在我們MyDemoTests的testMyFun寫相關(guān)單元測試代碼(代碼中用到了斷言,斷言的使用后面再講):

#import <XCTest/XCTest.h>
#import "MyClass.h"

@interface MyDemoTests : XCTestCase

@end

@implementation MyDemoTests

- (void)setUp {
    [super setUp];
    NSLog(@"setUp-----------------");
}

- (void)tearDown {
    [super tearDown];
    NSLog(@"tearDown-----------------");
}

- (void)testMyFun{
    NSLog(@"testMyFun-----------------");

    MyClass *myClass = [[MyClass alloc]init];
    NSInteger num = [myClass getNum];

    XCTAssert(num < 10,@"num should less than 10");
}

@end

上面加了斷言摇邦,只有當(dāng)num<10的使用才能通過測試恤煞,由于此時num=5,所以可以順利通過測試施籍。

按快捷鍵Command + U進(jìn)行單元測試居扒,結(jié)果如下:

image2

如果我們將getNum的返回結(jié)果改為15,則不會通過測試:

image3

如果測試方法比較多的時候也可以直接點(diǎn)擊方法后運(yùn)行的圖標(biāo)單獨(dú)測試某個方法法梯,Command + U是全部測試:

image4

2苔货、性能測試

剛開始的時候系統(tǒng)為我們創(chuàng)建的一個測試用例方法里有這么個方法:

 - (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

測試代碼

- (void)testPerformanceExample {
    NSLog(@"testPerformanceExample-----------------");

    [self measureBlock:^{

        MyClass *myClass = [[MyClass alloc]init];
        [myClass getNum];

    }];
}

按快捷鍵Command + U進(jìn)行單元測試,結(jié)果如下:

2017-03-06 16:42:01.403 MyDemo[51107:5178923] setUp-----------------
2017-03-06 16:42:01.404 MyDemo[51107:5178923] testPerformanceExample-----------------
/Users/lifengfeng/Desktop/Project/iOSProject/MyDemo/MyDemoTests/MyDemoTests.m:31: Test Case '-[MyDemoTests testPerformanceExample]' measured [Time, seconds] average: 0.422, relative standard deviation: 164.533%, values: [0.000053, 2.073384, 0.000010, 1.073334, 0.000013, 1.074108, 0.000016, 0.000005, 0.000004, 0.000003], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
2017-03-06 16:42:06.080 MyDemo[51107:5178923] tearDown-----------------

3立哑、常用的測試斷言

  • XCTFail(format) 生成一個失敗的測試;

  • XCTFail(@"Fail");

  • XCTAssertNil(a1, format…) 為空判斷夜惭, a1 為空時通過,反之不通過;

  • XCTAssertNil(@”not nil string”, @”string must be nil”);

  • XCTAssertNotNil(a1, format…) 不為空判斷铛绰,a1不為空時通過诈茧,反之不通過;

  • XCTAssertNotNil(@”not nil string”, @”string can not be nil”);

  • XCTAssert(expression, format…) 當(dāng)expression求值為TRUE時通過捂掰;

  • XCTAssert((2 > 2), @”expression must be true”);

  • XCTAssertTrue(expression, format…) 當(dāng)expression求值為TRUE時通過敢会;

  • XCTAssertTrue(1, @”Can not be zero”);

  • XCTAssertFalse(expression, format…) 當(dāng)expression求值為False時通過;

  • XCTAssertFalse((2 < 2), @”expression must be false”);

  • XCTAssertEqualObjects(a1, a2, format…) 判斷相等这嚣, [a1 isEqual:a2] 值為TRUE時通過鸥昏,其中一個不為空時,不通過姐帚;

  • XCTAssertEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return YES”);

  • XCTAssertNotEqualObjects(a1, a2, format…) 判斷不等吏垮, [a1 isEqual:a2] 值為False時通過,

  • XCTAssertNotEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return NO”);

  • XCTAssertEqual(a1, a2, format…) 判斷相等(當(dāng)a1和a2是 C語言標(biāo)量罐旗、結(jié)構(gòu)體或聯(lián)合體時使用,實際測試發(fā)現(xiàn)NSString也可以)膳汪;

  • XCTAssertNotEqual(a1, a2, format…) 判斷不等(當(dāng)a1和a2是 C語言標(biāo)量、結(jié)構(gòu)體或聯(lián)合體時使用);

  • XCTAssertEqualWithAccuracy(a1, a2, accuracy, format…) 判斷相等九秀,(double或float類型)提供一個誤差范圍遗嗽,當(dāng)在誤差范圍(+/- accuracy )以內(nèi)相等時通過測試;

  • XCTAssertEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return YES”);

  • XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format…) 判斷不等,(double或float類型)提供一個誤差范圍鼓蜒,當(dāng)在誤差范圍以內(nèi)不等時通過測試;

  • XCTAssertNotEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return NO”);

  • XCTAssertThrows(expression, format…) 異常測試痹换,當(dāng)expression發(fā)生異常時通過征字;反之不通過;

  • XCTAssertThrowsSpecific(expression, specificException, format…) 異常測試晴音,當(dāng)expression發(fā)生 specificException 異常時通過柔纵;反之發(fā)生其他異常或不發(fā)生異常均不通過;

  • XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format…) 異常測試锤躁,當(dāng)expression發(fā)生具體異常搁料、具體異常名稱的異常時通過測試,反之不通過;

  • XCTAssertNoThrow(expression, format…) 異常測試系羞,當(dāng)expression沒有發(fā)生異常時通過測試郭计;

  • XCTAssertNoThrowSpecific(expression, specificException, format…) 異常測試,當(dāng)expression沒有發(fā)生具體異常椒振、具體異常名稱的異常時通過測試昭伸,反之不通過;

  • XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format…) 異常測試,當(dāng)expression沒有發(fā)生具體異常澎迎、具體異常名稱的異常時通過測試庐杨,反之不通過;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夹供,隨后出現(xiàn)的幾起案子灵份,更是在濱河造成了極大的恐慌,老刑警劉巖哮洽,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件填渠,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸟辅,警方通過查閱死者的電腦和手機(jī)氛什,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匪凉,“玉大人枪眉,你說我怎么就攤上這事≡俨悖” “怎么了贸铜?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树绩。 經(jīng)常有香客問我,道長隐轩,這世上最難降的妖魔是什么饺饭? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮职车,結(jié)果婚禮上瘫俊,老公的妹妹穿的比我還像新娘鹊杖。我一直安慰自己,他們只是感情好扛芽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布骂蓖。 她就那樣靜靜地躺著,像睡著了一般川尖。 火紅的嫁衣襯著肌膚如雪登下。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天叮喳,我揣著相機(jī)與錄音被芳,去河邊找鬼。 笑死馍悟,一個胖子當(dāng)著我的面吹牛畔濒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锣咒,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼侵状,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毅整?” 一聲冷哼從身側(cè)響起趣兄,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毛嫉,沒想到半個月后诽俯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡承粤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年暴区,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛臊。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仙粱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彻舰,到底是詐尸還是另有隱情伐割,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布刃唤,位于F島的核電站隔心,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尚胞。R本人自食惡果不足惜硬霍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笼裳。 院中可真熱鬧唯卖,春花似錦粱玲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄碾,卻和暖如春卵沉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堪嫂。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工偎箫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皆串。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓淹办,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恶复。 傳聞我的和親對象是個殘疾皇子怜森,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 單元測試不是一個小工程,需要多用些時間才能做好谤牡,不要希望通過這個文章就能掌握單元測試副硅,這只是一個入門,需要自己動手...
    勇不言棄92閱讀 7,788評論 9 60
  • 前言 單元測試和UI測試大致步驟網(wǎng)上很多文章都有翅萤,如果會的可以忽略恐疲,關(guān)鍵是錯誤總結(jié),網(wǎng)上很少有文章提及到套么,感興趣的...
    _YGL_閱讀 5,149評論 20 23
  • 領(lǐng)導(dǎo)給的需求是: 關(guān)于單元測試的任務(wù)反饋: http://www.reibang.com/p/d15a7dea0c...
    SOI閱讀 4,005評論 1 34
  • 在計算機(jī)編程中培己,單元測試(英語:Unit Testing)又稱為模塊測試, 是針對程序模塊的最小單位來進(jìn)行正確性檢...
    iOS暮光閱讀 347評論 0 0
  • 轉(zhuǎn)自:http://www.reibang.com/p/009844a0b9ed 什么是單元測試?一聽到單元測試這...
    YYT1992閱讀 853評論 0 2