Test Driven iOS Development

这是一本书的名字,书还没有时间看,借鉴下看过源码的那些轮子是如何写测试代码的

单元测试

AFNetworking

AFN 的单元测试分为 UIKit 测试(包含有 UIKit 调用的测试,如 UIImage/UIImageView/UIButton 等),还有接口测试。基本上每一个类对应一个测试类,每个类都保证创建后能返回非空,或者预期的值,具体代码省略。

CocoaLumberjack

使用了第三方库 expecta 使代码更易读。测试点类似 AFNetworking,具体代码省略。

Masonry

使用了 expecta,创建约束后,经过一些设置后,确认是否能获得预期的值,具体代码省略。

NullSafe

[NSNull null] 的 stringValue/ bytes 方法应当返回 nil

XCTAssertNil(result);

[NSNull null] floatValue 方法是否返回 0.0

XCTAssertEqualWithAccuracy(result, 0.0f, 0.0f);

[NSNull null] intValue 方法是否返回 0

XCTAssertEqual(result, 0);

创建 [NSNull null] 的类,类名是否 NSNull

XCTAssertEqualObjects(result, @"NSNull");

[NSNull null] description 方法是否返回

XCTAssertEqualObjects(result, @"<null>");

[NSNull null] range 方法是否和 (0,0)范围一致

NSRange compare = NSMakeRange(0, 0);
XCTAssertTrue(NSEqualRanges(result, compare), @"Range test failed");

NSNull 的 Category 创建的方法 NullTestMethod 返回非0数字后是否依然能按照 0 处理

XCTAssertEqualWithAccuracy(result, 0.0, 0.0);
JLRoutes

设置 route,添加各种可能性的设置,测试是否能够正常处理,具体代码省略

UI 测试

主要是录制一些操作,然后进行校验,忽略轮子中的测试方式

IQKeyboardManager

主要是界面中操作过程中录制测试,具体代码省略

DZNEmptyDataSet

Pod 引入了 FaceBook 的第三方 FBSnapshotTestCase,这个库目前已经更新为 iOSSnapshotTestCase

截图测试

DetailViewController *vc = [[DetailViewController alloc] initWithApplication:app];
FBSnapshotVerifyViewWithOptions(vc.view, app.displayName, FBSnapshotTestCaseDefaultSuffixes(), 0);

使用方式:在 setUp 中首先设置 recordMode 为 YES,进入录制模式,执行测试的上述方法,会生成截图,忽略结果,这时只是截图操作,生成的图片文件在 getReferenceImageDirectoryWithDefault 中指定的位置,以此截图为参考图片。修改 recordMode 为 NO,然后再执行测试方法,就会用快照和之前存在指定位置的参考图片做对比,如果两个图片不匹配的话,测试就会失败

参考文章

iOS 单元测试和UI测试教程

请我喝汽水儿