我正在编写一个android应用程序,在其中我使用opencv for android进行图像处理。我应该如何为使用opencv的函数编写单元测试?基本上,我的函数从相机中获取一些图像(输入是图像),并对其进行一些处理(输出也是图像)。我想进行单元测试,读取一些样本图像并检查结果。首先,我需要写一个单元测试还是android仪器测试?第二,我应该把我的测试图像文件放在哪里,以便测试可以访问它们?
我正在开发一些具有扩展功能的OCR库包装器,目标是Android+iOS+WinPhone库,重用大多数核心源代码,只有API包装器是特定于平台的。
所以我在linux下用C++进行开发,这也是我运行测试的方式。我将UnitTest++与U++框架一起使用(仅用于测试,可移植库是用纯C++编写的)。
对于源代码版本控制,我使用git,这也是我存储测试图像的地方。
这可能是我的设置中最糟糕的一点,虽然git通常非常好,性能也很好,但大多数漂亮的扩展都是用脚本语言编写的一些web应用程序,他们不喜欢有几个MiB差异的二进制提交。此外,为每个新开发人员克隆存储库也有点麻烦,目前的repo是4+GiB。
因此,如果我再从头开始做一次,我会在git中只放入非常基本的图像来验证基本功能。其他用于QA测试和培训的图像,我会放入一些二进制.zip文件中,并将其上传到一些带有历史记录和备份的云档案中。由于它们不会经常更新,但当它们更新时,会对git的其余使用产生一些影响。
我肯定会致力于编写低级别的函数,只使用数据和opencv,所以你不需要android API做任何事情。并将它们作为JUnit测试或C++测试来运行。仅在Android API不可避免的测试中使用Android仪器,因为它非常慢,并且您必须连接一些设备(或者模拟器,或者roboelectric,无论哪种方式,与即时C++编译相比,您的开发模式都慢10-100倍)。
随着Android Studio和gradle的开发(我指的是性能),我实际上正在尽可能避免Android的开发,所以我很高兴我制作了原生C++库,我只需要Android的东西在设备上进行最终测试。
所以。。。YMMV,这是我的经验,对此持保留态度。
编辑:给出一些更具体的答案对于android插入指令的单元测试,你可以将图像放入/testAndroid/目录的资产中?或者创建自定义构建安装步骤,该步骤将通过adb将文件复制到目标设备,并从本地项目文件复制到某个公共目录。
使用JUnit测试,您可以在runner的配置中设置工作目录,所以我通常将它们保存在/test/目录中的某个位置,所以我也将它们置于git控制之下。
这与任何其他环境(C++/linux)都是一样的,如果你找到了正确的配置开关或文件,总有一种方法可以设置几乎所有的东西,这样你就可以随心所欲地组织项目。
android Studio中android项目的当前模板(src/分支到test/main/…,/build/*在所有内容之外)非常好,我的C++项目也使用了类似的设置,没有注意到任何严重的缺点,通常它自然适合我的所有需求。