啥是单元测试
单元测试,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
更详细内容请看百度百科
iOS中的单元测试 XCTestCase
XCTestCase
用于定义测试用例、测试方法和性能测试的主要类。
XCTestCase中有一系列的相关方法,在测试方法执行前后,会分别执行
setup
:提供在测试用例开始之前自定义初始状态的机会。
teardown
:提供在测试用例结束后执行清理的机会。
- (void)setUp {
[super setUp];
NSLog(@"初始化");
}
- (void)tearDown {
[super tearDown];
NSLog(@"销毁清除");
}
如何开始测试
在我们创建工程时,底下红框内的选项是默认勾选的,看名字也知道,选了这两个就可以用他们来做测试。
image.png
工程创建之后,就会有这两个文件夹,里面的.m文件就是我们测试的操作对象了。
image.png
先看UnitTestTests.m
,我在这个文件中新添加了一个方法
会发现在代码的左边行数的地方,多了很多绿色打钩图标,代表这些方法是测试通过的,在后面还会展示没有测试通过的案例。
我们先看看log日志
可以看到,在每个测试方法执行前后,都分别执行了
setup teardown
好了,基本方法有了一定的了解,继续往下
XCTestCase运用
新建,注意图中选项是Unit Test Case Class
image.png image.png
然后我们在原ViewController中写几个方法.h里面也声明一下方法
-(int)getSum:(int)a b:(int)b{
return a+b;
}
//异步回调
- (void)loadData:(void (^)(id data))dataBlock{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:2];
NSString *dataStr = @"回调字符串";
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"刷新UI");
dataBlock(dataStr);
});
});
}
//耗时操作
-(void)forFunction{
for (int i = 0; i<1000; i++) {
NSLog(@"这是耗时操作");
}
}
然后在ViewControllerTests中调用测试
逻辑测试
image.png通过给定条件进行测试,判断是否达到预期
XCTAssertEqual()
中传入的三个参数分别为
第一个参数:方法调用结果
第二个参数:给与期望值
第三个参数:测试没通过的警告
这里给一个测试没通过的例子
image.png
性能测试
测试方法执行效率
在testPerformanceExample
中执行上面的耗时操作
灰色代表没有设置一个baseline做评定标准,设置一下,再跑一遍 image.png
当我们的基准线耗时低于当前的耗时时,就会提示测试未通过。
image.png
反之测试通过的结果
image.png
注意:测试案例必须以test作开头
UI测试
开始UI测试之前
在开始UI测试之前,有几点得先说
1.不是录制了就立马能用了
2.输入内容需要自行操作如果按照录制内容,很容易就崩,不能好好玩
3.录制代码自动补全主要还是辅助功能,不能完全满足需求。
1. 先command+R 运行项目
然后在文件对应的tests.m文件中,选择一个test开头的方法。如下图。
我们当前的期望是这样的,两个输入框分别输入,然后点击按钮查看结果,显示在label上。
image.pngimage.png
我们这里先把原本已经录制的代码删除,反复触发控件,代码将会开始自己补全。
image.png
但是这些参数并不顶用,我们这里需要的是这几个参数
XCUIApplication *app
XCUIElementQuery *buttonElementsQuery
XCUIElement *textField
XCUIElement *textField2
XCUIElement *button
获取到我们想要的内容后,需要自己开始组织,这里提供一份组织好的...我也不知道该怎么写了,就看代码吧
- (void)testExample {
XCUIApplication *app = [[XCUIApplication alloc] init];
XCUIElementQuery *buttonElementsQuery = [app.otherElements containingType:XCUIElementTypeButton identifier:@"Button"];
//要拿到控件,记得反复点。。直到他出现
//拿到textfield
XCUIElement *textField = [[buttonElementsQuery childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:0];
XCUIElement *textField2 = [[buttonElementsQuery childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:1];
//拿到button
XCUIElement *button = app.buttons[@"Button"];
//UI操作
[textField tap];
//输入操作得手动写,录制的那个不靠谱
[textField typeText:@"123456"];
[textField2 tap];
[textField2 typeText:@"123"];
[button tap];
}
注意:UI测试必须在程序是执行状态中,才能执行否则将会报错如下图
image.pngUI测试原理思路
程序运行起来之后,我们可以通过下图查看当前界面的图层结构,以及左侧的层级关系。UI测试也是类似的。
image.png
回到刚刚那份测试案例。
通过打断点,打印app来看
image.png
由上图,便可以很清楚的找到创建的4个控件。
UI测试参数说明
XCUIApplication
:可以启动和终止的应用程序的代理。
XCUIElementQuery
:可以定位UI元素的查询类
XCUIElement
:程序的UI元素,在iOS中,提供手势交互,如tap、press按压、swiping滑动、pinching挤压和rotating旋转。
网友评论