运行OpenCover比nunit-console需要更长的时间

时间:2014-10-06 10:35:12

标签: unit-testing nunit opencover

我正在尝试为此项目添加单元测试:https://github.com/JimBobSquarePants/ImageProcessor

运行单元测试时,它们可能需要1或2分钟才能运行(它是一个图像处理库,我不认为它们非常快)。

问题在于,当我在这些测试中运行OpenCover时,它们需要20分钟才能运行。

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

我猜我做错了什么,但是什么?为什么在OpenCover上花费的时间比NUnit跑步者多呢?

2 个答案:

答案 0 :(得分:1)

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

假设OpenCover花费0.01毫秒来修改一行代码(这也是纯粹的推测),你正在处理1280 * 1024个图像,每个像素需要3行代码(封顶红色通道,xor绿色和蓝色) ,无论如何),你得到1310720 * 0.01 * 3 =大约39秒。一次测试。

我怀疑你只有一个测试,所以乘以测试的数量;你可能知道为什么它很慢。

您应该尝试在较小规模上测试您的算法:除非您正在进行图像范围操作(我看不到哪些?)您的代码不需要整个图像来处理。或者使用较小的图像?


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

测试将每个图像类型加载到lib的Image类中,然后从Image类中测试一个旋转,一个调整大小操作等。不要测试所有内容每次!


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

或者你可以每天只运行代码覆盖,优先在晚上运行?

答案 1 :(得分:1)

OpenCover检测程序集的IL(可以找到PDB文件 - 因为这是保存文件位置信息的位置),然后是每个序列点(想想你可以放置的地方)点)并且每个条件分支路径将导致一个操作来注册访问(并增加访问次数)。

对于算法代码,您会发现重度集成测试的运行覆盖率将是一个性能问题,因此请确保您只对紧密集成测试或单元测试执行覆盖,例如在您的情况下,可能会使用可以测试代码正确性的小图像(如前所述)。

您尚未描述如何运行OpenCover(或哪个版本 - 我将假设最新版本),但请确保您已排除测试程序集并仅检测目标程序集。

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