2

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

运行单元测试时,它们可能需要 1 或 2 分钟才能运行(它是一个图像处理库,我不希望它们快得离谱)。

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

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

我猜我做错了什么,但是什么?为什么 OpenCover 比 NUnit runner 花费更多时间?

4

2 回答 2

1

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

假设 OpenCover 需要 0.01 毫秒来检测一行代码(这也是纯粹的推测),您正在处理 1280*1024 图像并且每个像素需要 3 行代码(上限红色通道,异或绿色和蓝色,等等) ,你得到 1310720 * 0.01 * 3 = 大约 39 秒。对于一个测试。

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

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


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

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


由于测试是必要的,也许您可​​以探索OpenCover 选项以排除一些数据。也许通过仅检测算法的外壳来完善您的覆盖分析会有所帮助。看看过滤器,看看你可以隐藏什么以使其运行可接受。

或者,您可以只每天运行代码覆盖率,最好是在晚上?

于 2014-10-06T11:11:45.053 回答
1

OpenCover检测程序集的 IL(它可以为其找到 PDB 文件 - 因为这是保存文件位置信息的位置),然后检测每个序列点(考虑可以放置断点的位置)和每个条件分支路径将导致注册访问的操作(并增加访问计数)。

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

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

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

于 2014-10-06T21:15:53.680 回答