2014-10-06 123 views
2

我试图单元测试添加到项目:https://github.com/JimBobSquarePants/ImageProcessorOpenCover花费更长的时间比NUnit控制台运行

当运行单元测试,他们采取可能1或2分钟来运行(这是一个图像处理图书馆,我不指望他们疯狂地快)。

的问题是,当我在这些测试运行OpenCover,他们采取类似20分钟运行。

当前单元测试的要点是,有一串测试图像,并且每个单元测试(更像集成测试,实际上)读取每个图像,并且运行一束在其上的效果。

我在猜测我做错了什么,但是什么?为什么OpenCover比NUnit runner需要更多时间?

回答

1

OpenCover仪器IL你的程序集(它可以找到一个PDB文件 - 因为这是保存文件位置信息的地方),然后对每个序列点(考虑放置断点的地方)以及每个条件分支路径都会引起一个操作来注册访问(并增加访问计数)。

对于算法代码,您会发现运行覆盖率较高的集成测试将是一个性能问题,因此请确保您仅在紧密集成测试或单元测试中运行覆盖。在你的情况下,也许使用小图像(如先前建议的),可以测试你的代码的正确性。

你还没有描述过你是如何运行OpenCover的(或者哪个版本 - 我会假设最新的),但是确保你已经排除了测试程序集并且只是测试目标程序集。

最后,OpenCover使用了一些队列和线程,但是如果由于循环等原因而在其上抛出大量数据,则需要时间来处理数据,以便在具有4个或更多内核的计算机上运行得更好。当你运行你的测试时,请看看任务管理器,看看发生了什么。

+0

好的谢谢你的解释:)只运行在单元测试,而不是前后整合测试似乎是一个好主意。 – thomasb 2014-10-07 07:09:10

1

这是炒作,因为我不使用OpenCover,但覆盖分析工具应该仪器穿过的所有行。由于您正在进行图像处理,因此每个像素肯定会触发OpenCover对匹配的代码行进行一些分析,并且您有很多像素

假设OpenCover需要0.01ms来测量一行代码(这也是纯粹的猜测),你正在处理1280 * 1024的图像,并且每个像素需要3行代码(红色通道,xor绿色和蓝色,无论如何),你会得到1310720 * 0.01 * 3 =约39秒。对于一个测试。

我怀疑你只有一个测试,因此通过测试的量乘以本;你可能有一个想法,为什么它很慢。

你或许应该尝试在小范围内测试你的算法:除非你是做图像范围内的操作(​​我看不出哪些?)你的代码不需要整体形象上下工夫。或者使用较小的图像?


编辑:我(又一个,不知道OpenCover本身)看了一下这里的测试套件,可以说,这个问题是来自所有正在测试的数据; evey单个图像被加载和处理以进行相同的测试,这不是您想要单元测试的方式。

测试加载每个图像类型成的lib Image类,然后测试从图像类一个旋转,一个大小操作等,不要每次测试一切!


由于测试是必要的,也许您可​​以探索OpenCover options以排除某些数据。也许只通过检测算法的外壳来改进覆盖率分析会有所帮助。看看filters看看你能隐藏什么,以便让它可以运行。

或者你只能每天运行的代码覆盖率,preferently晚上?

+0

那么,库实际上是图像范围的修改(过滤器等)。所有图像都存在,因为每个图像都是不同的:不同的格式,不同的嵌入式ICC配置文件,不同的颜色模式(RGB/YMCM/...),不同的元数据等。因此,测试实际上需要在所有图像上运行。但也许他们应该只加载一次,并保存在内存中...... – thomasb 2014-10-06 11:50:56

+0

然后拆分测试,然后硬编码icc配置文件,颜色模式等。例如,如果你想要一个过滤器来平均红色通道,并删除每个像素的平均值红色值,将算法分成平均计算和像素操作,然后使用非常小的图像,应该足以测试 – samy 2014-10-06 12:09:33

+0

是的,正如我所说的,测试比单元测试更集成测试(它们检查整个命令链是尊敬的)。我仍然需要这些测试。 – thomasb 2014-10-06 13:04:18

相关问题