宽容他人,放过自己。

单元测试XCTest

Posted on By anchoriteFili

相关链接


单元测试面向的对象是单元,这个专有名词源自编译器领域的术语“编译单元”。在面向过程中,指的是函数,而在面向对象中,指的通常就是“类”。因而,每个功能类都应该提供对应的单元测试。

单元测试简单理解


1. xcode本身默认带有单元测试这一框架

752372-20160624140645860-1934317062.png

752372-20160624145800563-1745163141.png

2. 创建相关创建AudioManager功能类的测试类AudioManagerTests,用来测试功能类中的方法

2.1> 功能类公用方法
// 对外单例
+ (instancetype)defaultManager;

// 播放音乐
- (AVAudioPlayer *)playingMusic:(NSString *)filename;
- (void)pauseMusic:(NSString *)filename;
- (void)stopMusic:(NSString *)filename;

// 播放音效
- (void)playSound:(NSString *)filename;
- (void)disposeSound:(NSString *)filename;
2.2> 创建单元测试类

752372-20160624150348297-2131566422.png

2.3> 在单元测试类中对功能类公用方法进行测试
/**
 测试 - (AVAudioPlayer *)playingMusic:(NSString *)filename 方法是否可以正常播放音乐
 */
- (void)testPlayingMusic {
    self.player = [[AudioManager defaultManager] playingMusic:fileName];
    XCTAssertTrue(self.player.playing, @"出现异常,没用播放音乐");
}
#pragma mark 测试开始时启动方法 - 设置好要测试的方法
- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

#pragma mark 测试后启用方法 - 卸载掉正在测试的方法
- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

#pragma mark  默认创建的一个简单的实例
- (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.
    }];
}

3. 单元测试执行方法

3.1> 直接command + U 运行全局测试
3.2> 单个方法测试

752372-20160624151626094-114147129.png

752372-20160624151653391-805399984.png

752372-20160624151716047-1590710942.png

752372-20160624151748485-1490257850.png

断言:

XCTFail(format) //生成一个失败的测试;
 
XCTAssertNil(a1, format...) //为空判断,a1为空时通过,反之不通过;
 
XCTAssertNotNil(a1, format) //不为空判断,a1不为空时通过,反之不通过;
 
XCTAssert(expression, format...) //当expression求值为TRUE时通过;
 
XCTAssertTrue(expression, format...) //当expression求值为TRUE时通过;
 
XCTAssertFalse(expression, format...) //当expression求值为False时通过;
 
XCTAssertEqualObjects(a1, a2, format...) //判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
 
XCTAssertNotEqualObjects(a1, a2, format...) //判断不等,[a1 isEqual:a2]值为False时通过;
 
XCTAssertEqual(a1, a2, format...) //判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
 
XCTAssertNotEqual(a1, a2, format...) //判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);
 
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...) //判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;
 
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) //判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;
 
XCTAssertThrows(expression, format...) //异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) //异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;
 
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...) //异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
 
XCTAssertNoThrow(expression, format) //异常测试,当expression没有发生异常时通过测试;
 
XCTAssertNoThrowSpecific(expression, specificException, format...) //异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
 
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...) //异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
 
 
 
// 特别注意下XCTAssertEqualObjects和XCTAssertEqual。
 
XCTAssertEqualObjects(a1, a2, format...) //的判断条件是[a1 isEqual:a2]是否返回一个YES。
 
XCTAssertEqual(a1, a2, format...) //的判断条件是a1 == a2是否返回一个YES。对于后者,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES。