iOS关于单元测试的学习笔记还有本人在学的路上遇到的那些坑
前言
闲来没事本来想看看书的,但是上班时间在公司看书感觉不太合适,经过Noah前辈提点所以打算去研究下单元测试,研究了解了一部分并结合使用场景才觉得这是个非常厉害的东西.想想以前测接口返回数据是否正常,这边单元测试直接写几个case,不用页面点,直接设几个数据根据断言看后台返回的状态码就能够很直观的看出来,虽然功能不算特别丰富但感觉也省了不少事情,这边会上一些自己写的case,和几个自己遇到的坑.
本文学习自链接,当然我写的主要是这篇文章作者没写的地方.阅读我这篇文章前请先阅读该链接.
断言
我目前主要用到的是下面这两个,如果想看更具体的请移步链接
XCTAssertTrue(expression, ...)
expression为true时通过,否则测试失败。
expression接受boolean类型的参数。
XCTAssertFalse(expression, ...)
expression为false时通过,否则测试失败。
expression接受boolean类型的参数。
用法也很简单,前言地方作者链接里有,我这里也来一张图片吧
这里可以看到因为0和3不相等所以测试用例不通过,如果想通过把0改为3即可UI的单元测试
新建一个case,将光标放到方法内,点击那个红色的圆形按钮就可以开始录制脚本了(注意是UI的那个单元测试文件),点击以后在模拟器或者真机上操作,xcode会生成相应的代码,录制完自己想要执行的操作,点击那个红色的圆形按钮(此时已经变成了方形),就可以停止录制了,然后只要执行这个case他就会按照你录制的步骤去执行一遍.
这里其实有一个很深的坑,我到现在也没解决
看到上面那张图的报错了吗?点击的是底部的两个tabbar,tabbar的标题是中文,XCode给你录成了UTF-8,而这些东西首先编译器无法识别,你得转义不然编译都不成功,但你转义完成后却发现他会报错告诉你找不到地方.正确的解决办法是把那两个中文的UTF-8换成汉字就好了,这个问题目前只在OC上出现了,swift是正确无误的,如果各位有好的解决办法可以告诉我,其实UI的case用处不大,这里作者只是好奇所以搞了下.
代码的执行时间测试
如上图所示,这个方法是用来测试block内代码的执行时间的,我们可以通过打印很清楚的看到他其实执行了10次,用处也很宽广,比如想测试身份证的识别时间,请求的时间,转模型的速度等等都可以通过它来测试,这里只是举个简单的例子.
我们可以看下打印发现他确实是执行了十次.
case执行结果
再来看看左边的执行代码相关信息,这里由于打印"1"执行的太快无法看出效果,所以我将测试内容换成了使用for循环打印1-9999,看看他们的执行时间.
执行时间查看可以很清楚的看到,10次的平均时间是1.382秒,第一次时间是1.85秒,并且可以看到第一次执行时间超过了平均时间33%,这里的测试结果都是和机器性能有关系的.
测试方法
这里我主要用来测试请求用.异步的测试和其他普通的测试都有区别这里也搞了我好久,都搞得无奈了...后来终于搞定了
这里是我写的一个case这里面需要注意的是和其他普通测试的区别,我们后台的请求一般正常情况下都为000,若不正常的话这个case是执行不通过的,到时候查看就可以了,伪造数据也比较方便.
坑以及注意点
-
1关于case的方法名字,一定要以test开头并注意驼峰命名法,且不能加入参数,我们使用宏来代替.
#define TestFilterPerformance(filterid) - (void)testFilterPerformance_##filterid { \ [self measureBlock:^{ \ UIImage *filteredImage = [FilterTool filterImage:self.image withFilterId:filterid]; \ XCTAssertNotNil(filteredImage, @"滤镜效果图应该非空"); \ }]; \ }
-
2关于私有方法的测试,只能通过扩展来实现
-
3异步测试是个坑,需要谨慎解决...
-
4XCode录制OC的UI测试脚本不成功
目前只发现了这么多,欢迎补充.