在iOS平台上使用gtest进行单元测试
为了保证算法在iOS平台上能运行准确需要进行单元测试。在此记录一下过程中遇到的一些问题
first step
首先是如何在iOS上跑C++代码,其实很好解决,将用C++写好的算法单元测试代码编译为静态库,并加入到iOS项目中,这样就可以在iOS上运行gtest单元测试代码。
second step
单元测试需要读入大量图片和视频,在Mac OS平台上可以直接挂载远程服务器上的资源,但是在iOS上无法这样做。需要像Android平台测试一样,将资源放到本地目录中。已知Android平台可以直接放到固定的路径目录下,测试代码就可以根据该路径获取到相应资源。
首先想到的是将图片资源放到相册中,然后将相册路径传入单元测试代码中去。但是苹果公司为了用户隐私,开发者是拿不到相册路径的,具体参考iOS - 获取系统相册照片名称,路径以及各项信息 和 What is the path of photos album on iPhone device?。
所以方法是将图片资源放在Document目录下。解决方法是可以通过iTunes将图片资源拷贝进去,具体步骤参考通过iTunes共享文件到Document目录。不过这又出现了一个新问题,资源放入Document目录下的路径会有一个加密的前缀,这是iOS为了安全性考虑所设计的。因此,这个路径不像Android平台那样是写死的,我们无法直接在单元测试代码中写死资源路径。
third step
这又有了一个新的问题,如何将这个string变量(资源路径)传入到单元测试代码。
首先,想到的是传参。如果gtest可以像普通函数那样将参数传入,那样问题就解决了。但是查询后发现,gtest只能获取到固定的几个命令行参数,可以参考How to pass parameters to the gtest,这个方法是行不通的。最后想到的办法是将在单元测试代码中所使用的资源路径(string类型)在其头文件中声明为extern变量,同时头文件中还定义了一个inline函数set_path(string& path)
用来设置新的值。这样,在iOS上定义和初始化这个变量,然后在拿到Document路径后将变量设置为这个新的值。至于如何获取Document路径可以参考What is the documents directory (NSDocumentDirectory)?。