接下来我们为User类写一个测试isChinese方法的测试方法,叫做testIsChinese,测试用例具体如下:
UserTests.m
这样,你只要点击测试方法旁边的那个菱形的按钮就可以运行该测试方法啦!通过测试会变成绿色的对勾,失败会变成红色的叉叉。到这里测试用例你就会写了。也许你会在意那些断言,这样的断言有18个,如下:
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...)//判断相等,[a1isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过; XCTAssertNotEqualObjects(a1,a2,format...)//判断不等,[a1isEqual: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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过 |
UI测试
用代码写UI测试比较麻烦,但是苹果在Xcode中为我们提供了录制的功能。录制是怎么一回事呢?当你打开时这个功能时,测试代码会随着你在设备或模拟器上操作自动创建。这么一来就省事多了。现在,我们在TestDemoUITests.m文件中写一个方法testLogin作为测试登录流程操作的UI测试方法。然后把光标放在方法体内,然后点击红色的那个录制按钮,如下:
当你点击了录制后,程序就会自动启动,这时候你在程序的所有操作都会生成想用的代码在你所选择的方法体内。我录制了一个GIF,你可以看一下,非常的好用:
接下来我们看看里面的代码:
//XCUIApplication这是应用的代理,他能够把你的应用启动起来,并且每次都在一个新进程中。 XCUIApplication*app=[[XCUIApplicationalloc]init]; //XCUIElement这是UI元素的代理。元素都有类型和唯一标识。可以结合使用来找到元素在哪里,如当前界面上的一个输入框 XCUIElement*usernameTextField=app.textFields[@"username:"]; [usernameTextFieldtap]; [usernameTextFieldtypeText:@"xiaofei"]; XCUIElement*passwordTextField=app.textFields[@"password:"]; [passwordTextFieldtap]; [passwordTextFieldtap]; [passwordTextFieldtypeText:@"12345"]; [[[[[[[appchildrenMatchingType:XCUIElementTypeWindow]elementBoundByIndex:0]childrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementtap]; [app.buttons[@"login"]tap]; |
有了这些代码,我们就可以对它进行一些处理了,比如:
//XCUIApplication这是应用的代理,他能够把你的应用启动起来,并且每次都在一个新进程中。 XCUIApplication*app=[[XCUIApplicationalloc]init]; //XCUIElement这是UI元素的代理。元素都有类型和唯一标识。可以结合使用来找到元素在哪里,如当前界面上的一个输入框 XCUIElement*usernameTextField=app.textFields[@"username:"]; [usernameTextFieldtap]; [usernameTextFieldtypeText:@"xiaofei"]; XCUIElement*passwordTextField=app.textFields[@"password:"]; [passwordTextFieldtap]; [passwordTextFieldtap]; [passwordTextFieldtypeText:@"12345"]; [[[[[[[appchildrenMatchingType:XCUIElementTypeWindow]elementBoundByIndex:0]childrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementchildrenMatchingType:XCUIElementTypeOther].elementtap]; [app.buttons[@"login"]tap]; //登录成功后的控制器的title为loginSuccess,只需判断控制器的title时候一样便可判断登录是否成功 XCTAssertEqualObjects(app.navigationBars.element.identifier,@"loginSuccess"); |
如果你想一次跑完所有的测试方法,快捷键cmd+u即可。跑起来后的面板主要如下图所示:
总结
这只是苹果官方集成在Xcode中的简单框架,优点就是简单,缺点也是简单。当然它的用法也绝非如此,有很多还待开发。