继承XCTestCase,默认的方法有4个: 1. setUp(每个测试方法调用前执行, 在执行完父类方法后添加自定义配置); 2. tearDown(每个测试方法调用后执行,在执行父类方法前添加自定义配置); 3. textExample(一个示例); 4. testPerformanceExample(在measureBlock中放入需要测试性能的代码)方法。
测试用例命名必须以test开头,不可有参数且返回为void,不然无法识别为测试方法。测试用例类型有3种:普通测试,性能测试与异步测试。在后文中有详细介绍
如果代码未返回预测结果,则通过断言API打印错误。
// 1. 普通测试- (void)testExample { // This is an example of a functional test case. // Use XCTAssert and related functions to verify your tests PRoduce the correct results. NSLog(@"testExample"); int a = 0; XCTAssertTrue(a == 0, "断言a等于0,不等于则测试没通过");}常用断言如下所示(以下断言含义from ios UnitTest 学习笔记):
// 常用断言XCTAssert(expression, format...)当expression求值为TRUE时通过;XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;XCTAssertFalse(expression, format...)当expression求值为False时通过;XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;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发生异常时通过;反之不通过;(很变态)XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过// 非常用断言XCTFail(format…) 生成一个失败的测试;XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;ps: ?1. XCTAssert与XCTAssertTrue有什么区别
?2. XCTAssertEqualObjects和XCTAssertEqual有什么区别 [reply]XCTAssertEqualObjects(a1, a2, format…)的判断条件是[a1 isEqual:a2]是否返回一个YES。XCTAssertEqual(a1, a2, format…)的判断条件是a1 == a2是否返回一个YES,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES;如果a1和a2都是指针,那么只有a1和a2指向同一个对象才会返回YES。
定义一个或多个XCTestException(通过调用XCTestCase的expectationWithDescription:方法获取XCTestExpection), 异步代码执行完成调用XCTestException实例的fullfill方法通知异步测试满足条件。然后再通过调用类中的waitForExceptionsWithTimeout:handler方法设置异步测试超时时间,并通过handler设置超时行为。
// 3.异步测试- (void)testRequest { XCTestExpectation *requestExpectation = [self expectationWithDescription:@"send request"]; AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:@"https://baidu.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responSEObject) { NSLog(@"responseObject:%@", responseObject); XCTAssertNotNil(responseObject, @"返回错误"); [requestExpectation fulfill]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error:%@", error); XCTAssertNil(error, @"请求出错"); [requestExpectation fulfill]; }]; [self waitForExpectationsWithTimeout:3.0 handler:^(NSError * _Nullable error) { if (error) { NSLog(@"Timeout Error:%@", error.description); } }];}Luis Solano在Objc.io的一篇文章中《Bad Testing Practices 》总结了自动化测试的五个好处: 1. 使重构更为简单; 2. 避免代码恶化; 3. 提供可执行的说明和文档; 4. 减少创建软件的时间; 5. 减少创建软件的代价。 总的来说也可以通过Objc.io的另一篇文章《Real-World Testing with XCTest》中的一句话简述: 测试使我们的代码质量变的可靠,同时让我们重构或修改代码而不用担心修改是否破坏了其他部分。
[官方文档–Writing Test Classes and Methods] iOS 单元测试之XCTest详解(一) ios UnitTest 学习笔记
新闻热点
疑难解答