一、前言:
UITest的单元测试能最大限度的解放测试妹妹的双手,当然也会给程序员带来巨大工作量,完整的测试代码估计是项目代码的两倍,另外大家可以自行百度 Xcode Coverage 查看测试代码覆盖率,这篇文章只讲如何在工程中用XCTest框架做单元测试。
其中主要介绍了,用六个按钮示意的UITests使用和性能测试、异步测试的。
二、创建工程:
先创建个名字为 XCTest 的示例工程:
这里要说明一下如果当初创建工程时未勾选上Include Unit Tests
和 Include UI Test
这两个复选框,可在项目工程根目录下手动创建 Tests 、UITests文件夹,如下图示例:
这里的”XC”是工程名字,XCTests,UITests这两个文件夹下的Info.plist 是一模一样的,里面包含的 key value 和app里的 Info.plist 是一样的,即:
![这里写图片描述](https://img-blog.csdn.net/20171125145636399?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
三、代码解释:
1、接下来看看具体代码:
我们可以在 XCTests.m XCUITests.m 中发现一些共同的方法:
- (void)setUp { … }
- (void)tearDown { … }
2、方法的意义:
将要开始执行测试代码时调用: - (void)setUp { … }
,
测试代码执行完后调用,测试失败不调用: - (void)tearDown { … }
,
其他任何方法都会在 - (void)setUp
和 - (void)tearDown
调用。
所有的测试类类名都以Tests结尾,同样类中所有的测试方法也都以- (void)test
开头。
3、获取app启动对象:
[[[XCUIApplication alloc] init] launch];
4、其他:
UI测试示例代码:
XCUIElement *button1 = [[XCUIApplication alloc] init].buttons[@"1111"];
XCTAssertTrue(button1.exists, @"'1111'按钮存在");
[button1 tap];
性能测试示例代码:
NSLog(@"性能测试");
[self measureBlock:^{
ViewController *vc = [[ViewController alloc] init];
[vc performanceExample];
}];
异步测试示例代码:
注意其中的“执行顺序1、2、3、4”
北京整形医院http://www.shkqmrw.com/
北京整形医院http://www.scytsa.com/
XCTestExpectation *expectation = [self expectationWithDescription:@"百度翻译 测试"];
NSLog(@"执行顺序:1");
NSMutableDictionary *paramer = [NSMutableDictionary dictionary];
[paramer setValue:@"apple" forKey:@"q"];
[paramer setValue:@"en" forKey:@"from"];
[paramer setValue:@"zh" forKey:@"to"];
[paramer setValue:@"2015063000000001" forKey:@"appid"];
[paramer setValue:@"1435660288" forKey:@"salt"];
[paramer setValue:@"f89f9594663708c1605f3d736d01d2d4" forKey:@"sign"];
[ViewController networkRequestWithAPI:@"https://api.fanyi.baidu.com/api/trans/vip/translate" requestMethod:@"POST" cachePolicy:NSURLRequestUseProtocolCachePolicy requestParamer:paramer Completion:^(NSDictionary * _Nullable result, NSURLResponse * _Nullable response, NSError * _Nullable error) {
[expectation fulfill];
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
XCTAssertTrue(httpResponse.statusCode==200, @"接口请求成功");
XCTAssertNotNil(result, @"json 对象不为空");
XCTAssertNil(error, @"请求没有出错");
NSLog(@"执行顺序:3");
}];
NSLog(@"执行顺序:2");
[self waitForExpectationsWithTimeout:30.f handler:^(NSError * _Nullable error) {
NSLog(@"执行顺序:4");
if (error) {
} else {
}
}];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
![这里写图片描述](https://img-blog.csdn.net/20171125150219470?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20171125151009559?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20171125151115126?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
四、图标解释:
1、测试前的图标:
这个图标出现在所有以 - (void)test
开头的方法前,这个是将要开始测试前的按钮状态图标,一旦点击就开始测试这个方法里的内容,或者我们也可以通过 command+U 的快捷键启动完整测试,完整测试会执行 Tests 和 UITests 下所有的测试类和类中所有的测试方法。
2、测试成功图标:
绿色代表测试成功,同时xcode 也会弹框提示,
![这里写图片描述](https://img-blog.csdn.net/20171125152910929?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3、测试失败:
表示某个测试方法测试失败,同时进程也会停在测试未通过的代码那。
![这里写图片描述](https://img-blog.csdn.net/20171125153105074?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdhbmcwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
五、断言注释:
XCTFail(format…)
XCTFail(@”Fail”);
XCTAssertNil(a1, format…)
XCTAssertNil(@”not nil string”, @”string must be nil”);
XCTAssertNotNil(a1, format…)
XCTAssertNotNil(@”not nil string”, @”string can not be nil”);
XCTAssert(expression, format…)
XCTAssert((2 > 2), @”expression must be true”);
XCTAssertTrue(expression, format…)
XCTAssertTrue(1, @”Can not be zero”);
XCTAssertFalse(expression, format…)
XCTAssertFalse((2 < 2), @”expression must be false”);
XCTAssertEqualObjects(a1, a2, format…)
XCTAssertEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return YES”);
XCTAssertEqualObjects(@”1″, @”2″, @”[a1 isEqual:a2] should return YES”);
XCTAssertNotEqualObjects(a1, a2, format…)
XCTAssertNotEqualObjects(@”1″, @”1″, @”[a1 isEqual:a2] should return NO”);
XCTAssertNotEqualObjects(@”1″, @”2″, @”[a1 isEqual:a2] should return NO”);
XCTAssertEqual(a1, a2, format…)
XCTAssertNotEqual(a1, a2, format…)
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format…) 判断相等,(double或float类型)
XCTAssertEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return YES”);
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format…) 判断不等,(double或float类型)
XCTAssertNotEqualWithAccuracy(1.0f, 1.5f, 0.25f, @”a1 = a2 in accuracy should return NO”);
XCTAssertThrows(expression, format…)
XCTAssertThrowsSpecific(expression, specificException, format…)
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format…)
XCTAssertNoThrow(expression, format…)
XCTAssertNoThrowSpecific(expression, specificException, format…)
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format…)
XCUIApplication:
launch():
terminate()
XCUIElement
.exist
descendantsMatchingType(type:XCUIElementType)->XCUIElementQuery
childrenMatchingType(type:XCUIElementType)->XCUIElementQuery
tap()
doubleTap()
pressForDuration(duration: NSTimeInterval)
swipeUp()
typeText(text: String)
XCUIElementAttributes协议
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
五、示例工程 地址:
如果大家觉得这篇文章和示例工程代码有用的话,点个赞,在github 上给个小星星,多谢。
https://github.com/wangzhengang/XCTest