小言_互联网的博客

iOS Swift测试覆盖率实施方案

412人阅读  评论(0)

       先前调研覆盖率测试的时候,iOS是借助于XcodeCoverage插件来实现的,并且已经生成了覆盖率报告,但后来在实际项目中使用的时候,发现项目是使用Swift写的,XcodeCoverage又不支持swift覆盖率测试,后来调研了一下发现Swift项目通过一些配置,就可以生成覆盖率数据。

一,Swift覆盖率配置

     为了方便总结,我们从网上下载一个示例Demo:GitHub - ChinaArJun/shopping-cart-Demo: IOS购物车: 用Swift 写的购物车Demo, shopping cart , swift 4.0

项目非常很简单,直接进行编译就可以了。

1,配置Other Swift Flags

在项目的"Build Settings"--->"Other Swift Flags"--->"Debug", 双击后面的配置项

将这两个配置添加进去:"   ​​-profile-generate​​​ 和 ​-profile-coverage-mapping​​ ",注意不要改变原来的项目配置

2,设置覆盖率作用于所有的项目

     "Product"--->"scheme"---->"edit scheme....",在打开的对话框中,勾选"Gather coverage for all targets".

3,添加LLVM相关定义

在swift项目中添加头文件,如:InstrProfiling.h,内容如下:


  
  1. #ifndef InstrProfiling_h
  2. #define InstrProfiling_h
  3. #ifndef PROFILE_INSTRPROFILING_H_
  4. #define PROFILE_INSTRPROFILING_H_
  5. int __llvm_profile_runtime = 0;
  6. void __llvm_profile_initialize_file( void);
  7. const char *__llvm_profile_get_filename();
  8. void __llvm_profile_set_filename( const char *);
  9. int __llvm_profile_write_file();
  10. int __llvm_profile_register_write_file_atexit( void);
  11. const char *__llvm_profile_get_path_prefix();
  12. #endif /* PROFILE_INSTRPROFILING_H_ */
  13. #endif /* InstrProfiling_h */

创建一个 ​​module.modulemap​​ 文件并将所有内容导出为一个模块。


  
  1. module InstrProfiling {
  2.     header "InstrProfiling.h"
  3.     export *
  4. }

4,在Swift项目中调用OC内容

        事实上我们不能直接创建 ​module.modulemap​​​,首先创建一个 ​module.c​​​ 文件然后重命名为 ​module.modulemap​​​,它还可以帮助我创建一个 ShoppingCart-Bridging-Header​​ 文件。

(1) 创建module.c文件

(2)创建Bridging Header文件

本项目中,我们没有引用第三方的OC类,此文件中可以不写内容。如果有引用,在此文件中添加对第三类的头文件的引用。Swift文件中就可以使用oc的类及函数。

(3)设置Badging Header文件

找到Build Setting配置下的"Object-C Bridging Header"项,看后面的值是没有刚刚创建的文件,如:

如果没有,双击打开一个弹层,将左侧的Bridging文件拖过来,自动填写相应的路径。

5, 在项目中添加生成覆盖率的操作

通常我们会在应用进入后台的时候,生成覆盖率数据,所以在AppDelegate.swift下的applicationDidEnterBackground函数中,添加如下操作:


  
  1. let name = "test.profraw"
  2.         let fileManager = FileManager.default                
  3.         do {
  4.             let documentDirectory = try fileManager.url( for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
  5.             let filePath: NSString = documentDirectory.appendingPathComponent(name).path as NSString
  6.             __llvm_profile_set_filename(filePath.utf8String)
  7.             __llvm_profile_write_file()
  8.             print( "文件路径:"+(filePath as String))
  9.         } catch {
  10.             print(error)
  11.         }

此段代码,会在应用进入到后台时,在Documents目录下生成覆盖率数据文件,test.profraw.

二,执行测试并获取覆盖率数据

        经过上面的配置后,再配置一下证书,就可以将应用打包并安装到手机上。然后执行你需要的测试用例即可,然后将应用置入后台一会儿。

1,导出覆盖率数据:选择Xcode的"windows"---->"Devices and Simulators "在打开的对应框中选择手机设备;

2,选择应用,导出应用数据

选择『shoppingCart』---"Download container" 下载应用数据。

3,打开container,查找覆盖率数据

右击文件选择『显示包内容』--->AppData-->Doucuments--->就可以找到覆盖率数据文件。

将数据文件拷到指定的文件夹,就可以生成报告。

三,生成Swift覆盖率报告

1,收集生成覆盖率数据文件

(1)拷贝第二步生成的覆盖率数据文件,如:test.profraw;

(2)拷贝应用构建生成的可执行文件

路径:

 ~/Library/Developer/Xcode/DerivedData/shoppingCart-efmklxddypsuvfgiumzoyfnmnudr/Build/Products/Debug-iphoneos/shoppingCart.app/shoppingcart

2,生成覆盖率报告

(1)合并及转换覆盖率数据

xcrun llvm-profdata merge -sparse test.profraw -o test.profdata

(2)查看覆盖情况命令

xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata

(3)生成汇总报告

 

xcrun llvm-cov report ./shoppingCart -instr-profile=test.profdata

(4)生成HTML报告

xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata --format=html  -use-color --output-dir ./coverage_report 

(5) 生成XcodeCoverage报告

A, 生成info文件

xcrun llvm-cov export ./shoppingCart --instr-profile=test.profdata -use-color --format=lcov > ./newreport.info

B, 生成xcodecoverage报告

./lcov-1.14/bin/genhtml -o html ./newreport.info 

C, 报告样式如下:


转载:https://blog.csdn.net/lionking0318/article/details/125819124
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场