单元测试的目的自不必多说,项目时间因素单元测试用例在自己的项目的应用中还没有应用过,现将使用 XCTest 写单元测试的过程中遇到的问题记录一下:
环境:OS Catalina Xcode12.0.1
框架选型:XCTest + OCMock
XCTest 可以写单元测试用例,覆盖率作为评估单元测试的硬性指标,XCTest可以生成单元测试的覆盖率指标数据
单元测试的具体流程网上参考文章也不少,参考文章:
iOS单元测试从入门到应用
问题总结:
1. xxx file not found。在测试工程下导入主工程的目标测试类的头文件始终报错 file not found。这是一个小细节问题,网上的参考资料都是讲如何写test case,但是目标测试类头文件都无法导入如何进行测试,找了很久也没找到相关的资料,后来发现原因在于新建的测试文件或者是首次使用测试 target 的时候需要首先需要运行一下测试工程,看到测试工程是成功状态再继续后续操作。 不然导入的任何头文件都会报 file not found
2. 自建framework。我的主工程是使用了我自建的framework的, 自建的 framework 的话需要在测试工程的 target下 build setting --> search path --> framework search path 配置上使用的framework 的路径,否则会报找不到 framework 的头文件找不到的错误
3. 主工程使用了 pch 文件:需要在测试工程的 target下 build setting --> prefix header 添加上 pch 的文件路径
4. Failed to load the test bundle.测试工程需要关联主工程。测试工程 Targer --> Genaral --> Host Application 选项选项选择主工程。对于以前创建的工程此选项可能是 none,没有关联上主工程,测试 xcode 12 创建的项目此选项默认就是选择并且打勾上的。 此处需要选择主工程, 否则运行单元测试的时候会 Test Failed. 查看 log 看到 你自己的framework第三方库无法加载的系统错误,如下图:
5. unrecognized selector sent to class xxx. 需要勾选 allow testing host application apis,否则调用主工程测试类的方法的时候会报 unrecognized selector sent to class 找不到方法的错误,因为没有允许测试工程能够去访问主工程的API
6. 私有方法的测试。对于目标测试类的私有方法进行单元测试的时候,不能为了单元测试而破坏了目标测试类的封装性。可以目标测试类添加一个分类 目标测试类+test,将需要测试的接口放到这个分类的 .h 文件中,分类的 .m 文件可以删除,因为分类的.h 的文件中声明的方法.m 文件被删除没有实现所以会找到目标测试类中同样方法名的方法去执行,类似于多态。