gpt4 book ai didi

.net - 是否有任何代码覆盖工具可以让我按行排除代码?

转载 作者:行者123 更新时间:2023-12-04 18:02:52 28 4
gpt4 key购买 nike

我想要的,来自 .NET 覆盖工具,但未能找到...

能够运行单元测试,并跟踪哪些代码行已被哪些单元测试执行,哪些代码行根本没有执行。能够生成交互式报告,允许用户按程序集、文件、命名空间、类等查看覆盖率的统计摘要;并深入到源代码级别以准确查看哪些行被覆盖,哪些行未被覆盖。

能够运行测试并从 Jenkins 生成报告,并将报告包含在 Jenkins 为每个构建显示的信息中。能够按行将源代码标记为不需要覆盖。能够让报告清楚地表明每一行源代码都已被覆盖或标记为不需要覆盖。

我一直在寻找免费的覆盖工具,但并不满意。我最近开始阅读有关 dotCover 的文章,看起来它确实提供了我需要的更多内容。但根据我在文档中阅读的内容,它提供了按文件、类或函数从覆盖要求中排除代码的机制。但如果它提供了按行从覆盖范围中排除代码的功能,我就错过了。

本质上,我正在寻找的是通过-失败。 90% 的覆盖率,或 80% 的覆盖率,或 95% 的覆盖率对我来说毫无意义。 80% 的覆盖率可能意味着 20% 的代码不需要覆盖,99.9% 的覆盖率可能意味着只有一个迫切需要测试的关键功能没有被测试。

我的看法分为三类:

  1. 已被测试覆盖的代码
  2. 已标记为不需要测试的代码
  3. 没有被测试覆盖,也没有被标记为不需要测试的代码

我想要的是,在单元测试运行之后,如果类别 3 中没有代码则通过,如果有则失败。

而且我需要能够将代码标记为不需要按行测试,而不仅仅是按函数进行测试,因为当我查看覆盖率报告中的函数时,对我来说很典型地会看到某些控制流通过测试未执行的功能。最常见的是异常或错误处理。有时,创建将生成测试这些控制流所需的错误或异常的测试所需的工作量可能很大,而有时测试揭示问题的可能性很小。

在这种情况下,我希望能够将代码标记为已经过检查,并且已确定不需要测试。当我以这种方式标记代码时,我希望代码未被测试覆盖这一事实不会导致构建失败。

有人知道执行此操作的任何 NET 覆盖工具吗?

最佳答案

OpenCover将允许您按行(序列点)跟踪覆盖范围,如果您使用 -coverbytest您可以确定命中该行时正在运行的测试。

没有按行排除功能,因为 OpenCover 会在您的程序集运行时对其进行检测,并且不知道实际的代码行。您可以编写自己的工具来删除您希望通过解析代码排除的行的结果,然后在使用类似 ReportGenerator 生成报告之前从结果中删除任何序列点。 .

然而,有人会争辩说没有代码是不可测试的,您只需要以不同的方式重组它。通常这种代码是人们所说的他们无法测试的代码,因为他们无法强制异常。

public void Method()
{
try
{
// do something
}
catch (Exception ex)
{
// respond to exception
}
}

但是要测试这个,你需要做的就是把它分解成更小的部分

internal void TryCatch<T>(Action doAction, Action<T> catchAction) where T : Exception { 
try { doAction(); } catch (T ex) { catchAction(ex); }
}

internal void DoMethod() {
// do something
}

internal void CatchMethod(Exception ex){
// respond to exception
}

public void Method() {
TryCatch<Exception>(DoMethod, CatchMethod);
}

现在,如果您愿意,每个部分都可以单独测试,而无需隐藏任何代码。例如在 TryCatch<T>() 的情况下你可以测试一下,如果 doAction抛出异常 catchException操作被调用,或者您可以将该方法从覆盖范围中排除,因为它太微不足道了。

除非我真的需要测试在特定条件下调用的 catch block ,否则我很少采用这种模式方式。

关于.net - 是否有任何代码覆盖工具可以让我按行排除代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012879/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com