【问题标题】:OpenCover takes much longer to run than the nunit-consoleOpenCover 的运行时间比 nunit-console 长得多
【发布时间】:2014-10-06 10:35:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: unit-testing nunit opencover


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,感谢您的解释 :) 仅在单元测试而不是前后集成测试上运行似乎是个好主意。
    【解决方案2】:

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

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

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

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


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

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


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

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

    【讨论】:

    • 嗯,库实际上做了图像范围的修改(过滤器等)。所有的图像都在那里,因为每一个都是不同的:不同的格式、不同的嵌入式 ICC 配置文件、不同的颜色模式(RGB/YMCM/...)、不同的元数据等。所以实际上需要对所有图像运行测试。但也许它们应该只加载一次并保存在内存中......
    • 然后拆分测试,并硬编码 icc 配置文件、颜色模式等。例如,如果您想要一个过滤器来平均红色通道并从每个像素红色值中移除平均值,则将算法拆分为平均计算和像素操作,然后使用非常小的图像,应该足以测试
    • 是的,正如我所说,测试更多的是集成测试而不是单元测试(它们检查整个命令链是否得到尊重)。我仍然需要这些测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多