【问题标题】:How can I exclude lambda functions in properties from code coverage?如何从代码覆盖范围中排除属性中的 lambda 函数?
【发布时间】:2011-04-07 22:06:10
【问题描述】:

我正在尝试为我的 C# 应用程序收集一些好的代码覆盖率统计信息,但我想忽略生成的 SubSonic 类,因为收集这些函数的代码覆盖率统计信息没有真正意义。

我已经编辑了 ActiveRecord.tt 文件以在每个方法和属性上包含 [ExcludeFromCodeCoverage] 属性,这已经在我的代码覆盖率窗口中删除了大部分不相关的结果。然而,尽管有代码覆盖排除属性,属性中的 lambda 表达式被标记为未覆盖。举个例子:

[ExcludeFromCodeCoverage]
int GetValue
{
    get
    {
        this.SomeMethod(); // this is excluded
        return this.Find(x => x.Value == this._Value); // this.Find is excluded
                                                       // but x => x.Value == ...
                                                       // is not.
    }
}

这只发生在属性中。正如预期的那样,Lambda 表达式在方法中被忽略。

现在,对我来说,这很烦人,但不一定是致命的,因为我可以在浏览我的代码覆盖率列表时忽略这些表达式。但是,我们的客户要求我们的代码覆盖率要高于 95%。我不太可能让他们明白这个统计数据在很大程度上是无用的。

我可以自动生成单元测试以及 ActiveRecord.tt 文件,但这并不理想。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# unit-testing c#-4.0 code-coverage


    【解决方案1】:

    虽然我不确定您使用什么工具进行单元测试,但您可以尝试将属性移到 get 方法声明的顶部:

    int GetValue
    {
        [ExcludeFromCodeCoverage]
        get
        {
            this.SomeMethod();
            return this.Find(x => x.Value == this._Value);
        }
    }
    

    这是因为在编译时,GetValue 属性被转换为方法,签名为get_GetValue : int

    【讨论】:

    • 虽然这是个好主意,但它不起作用。但是,它确实可以编译,但我的代码覆盖率没有改变,并且 lambda 表达式仍被标记为未覆盖。
    • 顺便说一句,我正在使用 Visual Studio 2010 附带的单元测试工具,但我不确定这是否会影响任何事情。我的假设是,因为这些函数实际上并不是我定义的属性的一部分,所以它们不会被视为属性的一部分。所以也许我正在寻找一种将属性应用于 lambda 函数的方法。我只需要将它们应用到大约 5 个地方即可完成这项工作。
    【解决方案2】:

    [ExcludeFromCoverage] 属性添加到类而不是属性。类中的所有内容都将被排除,包括 lambda。

    【讨论】:

    • 不幸的是,这意味着我想要检查覆盖率的代码将不会被检查。不过,这可能对某些人有用,好主意。
    • 我也有同样的问题。我真的很想获得 100% 的覆盖率,这样我就可以监控新的未发现代码。我最终把有问题的代码放到了它自己的类中。我知道这很蹩脚,但它奏效了。我正在考虑的另一个选择是创建命名方法而不是 lambdas。
    【解决方案3】:

    想知道 C# 怎么样,但在 Java 中这可以通过使用内部类来完成

    class SuperTest {
    
        @ExcludeFromJacocoGeneratedReport
        public Object test() {
            return Optional.of(1)
                    .map(FunctionWrapper.mapFunction)
                    .orElseThrow();
        }
    
        @ExcludeFromJacocoGeneratedReport
        public static class FunctionWrapper {
    
            static Function<Object, String> mapFunction = String::valueOf;
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2021-02-12
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      相关资源
      最近更新 更多