【问题标题】:Code coverage in Testing测试中的代码覆盖率
【发布时间】:2013-10-03 09:59:01
【问题描述】:

我最近开始使用 TDD,或者您可以说是为我的项目进行测试,在那里我发现了一些新事物(对我来说是新事物),称为“代码覆盖率”,它显示了您的代码在测试过程中被覆盖了多少。据我所知,大多数老年人常说不可能有 100% 的代码覆盖率,或者获得 100% 的代码覆盖率并不是一个好的做法。这件事让我想知道这个代码覆盖率是如何工作的,我的意思是它们覆盖了哪些基础的代码?请说说Testing的主要用途。

我附上这个问题的代码覆盖率图片。

【问题讨论】:

    标签: c# .net testing tdd code-coverage


    【解决方案1】:

    实际上,100% 的代码覆盖率是可能的,但取决于语言:

    • 有时 import 或 include 语句不会被考虑在内,因此 100% 是不可能的
    • 这主要取决于使用的工具(如上面的行是否被忽略)
    • 如果由于未测试异常而未达到 100%,那么这并不好。还应进行恶劣天气测试

    关于 100% 代码覆盖率的有用性:

    • 当然,越高越好
    • 至少应测试所有行,尤其是在 Python 等较弱类型的语言中。在 C/C# 等中,编译器会发现更多,但即便如此,也欢迎高代码覆盖率

    即使 100% 的代码覆盖率也不意味着代码是完美的:

    • 测试一行并不意味着执行了整行(就像 'if x && y' 中的 if 语句只有一半...如果 x 结果为 False,则不再检查 y。李>
    • 由于循环和程序流程的顺序,变量的值可能不同,从而导致异常。 因此,检查值的组合也很重要。

    加法:

    如果不希望 100% 的代码覆盖率(因为一切都需要时间,因此需要金钱),请首先关注代码中的高风险区域。首先跳过琐碎的方法,从复杂/高风险的功能开始。

    使用设计模式或代码结构来“帮助”单元测试也很重要:

    • 从逻辑代码中拆分 (G)UI。 (G)UI 代码大多难以进行单元测试。
    • 使用小函数,以简化单元测试(并进行清晰的设计)。
    • 使代码尽可能松散地连接。这样可以实现清晰的设计,还有助于轻松进行单元测试(无需使用大量存根)。
    • 考虑一个测试“框架”,例如使用存根,包括向存根注入值来测试好天气和坏天气情况。

    【讨论】:

    • 100%可能,但通常不实用。与所有工程任务一样,存在投资与回报的问题。真正的重点是 0% 的覆盖率应该吓死管理层;除了“乔说他以某种方式对其进行了测试”之外,没有任何迹象表明 任何东西 都有效。较高的覆盖率表明测试的彻底性。
    • 确实如此......但是,根据软件使用情况,需要很高的百分比。在我的工作中,我们的目标是 100%,至少对于具有高风险的代码。
    • 瞄准 100%,同意。但一般不是100%。并且 100% 的 one 覆盖可能无法为您提供经过良好测试的真实演示,因为覆盖有多种形式(考虑“文件覆盖 [每个源文件都应用了一些测试]”,线路覆盖率、stmt 覆盖率、决策覆盖率、MC/DC、变量覆盖率、路径覆盖率……人们提出了数百种“覆盖率”措施,但都不能保证你已经完全测试了程序。所以最后几个百分比无论您使用什么测试覆盖方案,都不太可能获得回报。
    • @IraBaxter 我同意在大多数项目中 100% 是不切实际的,尤其是与 UI 相关的项目。我主要是在谈论代码覆盖率(最常用)。要应用其他代码覆盖方面,通常需要更多的努力。
    【解决方案2】:

    首先,为了了解代码覆盖率的价值,您必须了解您想用它实现什么。代码覆盖率可帮助您确定程序代码的质量,例如它是否健壮或容易出错,是否具有凝聚力或是否具有隐藏的依赖关系,是否易于更改等。

    代码覆盖率高的代码往往是更好的代码,但并不能保证它就是好代码。这是因为代码质量很大程度上取决于您的测试用例的构建程度,例如如果您正在测试您的预期行为,或者错误或破坏性输入,极端情况或其他特殊情况等。 如果您的测试套件写得不好,您仍然可以实现高(或 100%)的代码覆盖率,但您的代码质量会很差。

    其次,大多数有经验的开发人员会告诉您 100% 的测试覆盖率不是必需的甚至是不好的做法的原因是,您需要投入的时间来使代码覆盖率 100% 更好地投入到更完整的测试套件上。通常,使用编写不佳的测试套件比使用设计良好的测试套件更容易实现 100% 的代码覆盖率。

    第三,因为你(几乎)永远不会有一个完整的测试套件,只是因为我不知道有很多人可以考虑代码可能出错的所有可能情况,你应该迫切地修改你的测试套件持续地(不是无限地)而不是满足于完全代码覆盖的错误感觉。

    我希望这个关于代码覆盖率的观点可以帮助你使它对你更有用。

    【讨论】:

    • 我想补充一下 Jesko R.,行业标准可能需要代码覆盖类型(分支、条件、决策)和目标百分比,特别是对于关键应用(航空航天或航空领域的 DO 178 ISO 26262 汽车)。重要的是要解释覆盖率为基于需求的测试带来了价值,在这种测试中,您测试需求而不是测试代码。它有助于确定您的测试是否足以满足您的软件设计要求。
    【解决方案3】:

    代码覆盖率很重要,越高越好,因为它表明您的单元测试是彻底的并且已经覆盖了该代码区域,从而减少了错误。

    您的应用程序可能不会达到 100% 的代码覆盖率,因为 MSTest 不提供分支、状态覆盖率和测试 void 方法可能很困难。您看到的统计信息基于语句/函数覆盖率。

    【讨论】:

      【解决方案4】:

      好吧,我发现代码覆盖率很重要,但它不是 100% 运行的必要条件。如果你得到了大约 70% 的代码覆盖率,那么它也很好,如果你得到 100% 的代码覆盖率,那么你的代码也没有必要 100% 正确

      【讨论】:

        猜你喜欢
        • 2012-01-18
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        相关资源
        最近更新 更多