【问题标题】:What should include in unit test code coverage?单元测试代码覆盖率应该包括什么?
【发布时间】:2017-09-26 09:52:35
【问题描述】:

我正在为一个类编写测试方法

例如:

class employee{

   public int ButtonID
        {
            get
            {
                return 
                function(GetValue("ButtonID"), 0);
            }
            set
            {
                SetValue("ButtonID", value);
            }
        }

    public function getEmployeeID()
    {somthing; }

    private function setEmployeeID()
    {somthing; }

    protected button_click(e)
    { somthing; }

}

这里我们计算代码覆盖率的时候也包括

  1. getter 和 setter 方法
  2. 按钮点击事件。
  3. 公共函数
  4. 私有函数

我应该看到以上四个的覆盖范围吗?

【问题讨论】:

  • 具体看以上四点
  • 一般建议是测试对象的公共接口。
  • 你能简单介绍一下第 1 点和第 2 点吗?

标签: c# asp.net .net unit-testing mstest


【解决方案1】:

具体到第 1 点和第 2 点:

测试 getter 和 setter 取决于这些访问器方法在做什么。如果它们是自动实现的,那么我不建议显式测试它们。我相信 .NET Framework 的实现。如果您正在寻找增加的代码覆盖率,请确保在其他测试期间同时使用 getset 属性,并且覆盖率将被计算在内。

如果属性访问器中发生了更复杂的事情,那么使用单元测试来帮助创建它(如果遵循测试优先的 TDD)或确保正确实现逻辑可能会很有用。

当涉及到特定于 UI 的代码时,不值得尝试使用单元测试对其进行测试。试图在单元测试中操作 UI 会导致测试不稳定、缓慢。如果您想在按钮单击处理程序中测试某些内容,请尝试将该功能提取到另一个可以更容易进行单元测试的类中。尽可能精简代码隐藏文件——将工作委派给您可以测试的其他类。

关于第 3 点和第 4 点:

正如评论者所指出的,公共方法为创建单元测试提供了丰富的目标区域。您希望确保您的类的公共 API 按预期执行,并且测试公共方法使您有机会了解使用被测试的类是多么容易。如果某些东西在测试中使用起来很尴尬,则可能表明需要进行设计更改。

仅通过您的公共方法测试您的私有方法。单元测试应该测试你的类的行为,而不是实现。从理论上讲,您应该能够通过您的公共方法来使用您的私有方法。

【讨论】:

  • Eric,感谢您的输入,这真的很有价值,也就是说,这意味着我可以从代码覆盖范围中排除那些不需要测试的代码部分。正确的?我可以通过 mstest 中的 .runsettings 文件排除那些 getter 和 setter 以及按钮单击事件。这样可以吗?
  • 真的,这完全取决于你。您是否希望覆盖率指标显示您对 80% 的代码有 90% 的覆盖率(另外 20% 是 UI 代码隐藏等)?还是您希望指标显示所有代码的 72% 覆盖率?
  • 好的,伙计。感谢您的投入!
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 2023-04-07
  • 1970-01-01
  • 2010-10-14
  • 2013-04-16
  • 2014-12-10
相关资源
最近更新 更多