【问题标题】:Unit Testing - best practice单元测试 - 最佳实践
【发布时间】:2011-07-21 09:22:46
【问题描述】:

我使用带有 MSTest 框架的 Visual Studio 2010 Professional 来执行单元测试。我有讨厌的生产代码要测试。第一个问题是有问题的代码在构造函数中。我将展示示例:

class ClassToTest
    {
        public SomeEnum UpperBorder;
        public SomeEnum LowerBorder;
        public int var1;
        private readonly SomeEnum2 _ethnicGroup;
        private readonly double _age;
        public int DataStart;
        public int DataEnd;
        public double[] DarkRedDarkYellow;
        public double[] DarkYellowGreen;
        public double[] GreenLightYellow;
        public double[] LightYellowLightRed;

        public ClassToTest(SomeEnum upperBorder, SomeEnum lowerBorder, int var1, SomeEnum2 ethnicGroup, int age)
        {
            UpperBorder = upperBorder;
            LowerBorder = lowerBorder;
            BscanIndex = bscanIndex;
            _ethnicGroup = ethnicGroup;
            _age = age;
            DataStart = 0;
            DataEnd = 0;
            DarkRedDarkYellow = null;
            DarkYellowGreen = null;
            GreenLightYellow = null;
            LightYellowLightRed = null;
        }
}

我的问题是:

  • 为每个变量编写一个带有断言语句的测试?或者编写几个测试,在每个测试中一次只检查一个变量?例如:

 

[TestMethod()]
public void ClassToTest_Constructor_upperBorder_PTest()
{
    //ACT
    var ob = new ClassToTest(SomeEnum.bor1, SomeEnum.bor2,10,SomeEnum2.Asian,10);
    //ASSERT
    Assert.IsNotNull(object);
    Assert.AreEqual(ob.upperBorder,SomeEnum.bor1);
}
  • 我是否应该检查构造函数是否正确地将参数分配给私有字段?或者,如果有属性会返回该私有字段,但它会执行一些其他操作,例如触发事件、日志操作等。

我找不到任何关于它的信息。因此,您的建议将是最宝贵的。

【问题讨论】:

  • 很抱歉,最佳实践问题不是天生主观的吗?

标签: c# visual-studio-2010 unit-testing mstest


【解决方案1】:

我会编写一个包含许多断言的测试。我知道有些人反对它,但我认为在一次测试中测试一种方法并验证该方法的所有相关后置条件是可以的。否则你会有大量的测试方法。

私有字段通常不通过单元测试进行测试。单元测试最好测试外部可见的行为和状态。

我认为一个好的规则是为单元测试争取尽可能完整的代码覆盖率。如果构造函数和对字段的分配有错误,那么如果它们具有适当的覆盖率,则应该在其他更高级的测试中捕获。我看到为类的私有部分编写测试的唯一原因是如果很难触发某些场景,例如错误处理例程。在处理线程时,还可能有理由在执行测试之前获取某些私有锁,以模拟特定的调度场景。

【讨论】:

    【解决方案2】:

    为每个变量编写一个带有断言语句的测试得到我的投票:

    您正在测试构造函数是否正确分配给它的值。

    如果您有多个具有不同数量参数的构造函数,那么我建议为每个构造函数编写单独的测试。

    如果构造函数还设置了私有字段,那么您可以也测试这些 - 有些人不喜欢在单元测试中检查私有成员。事实上,对于精心设计的代码,这应该是不必要的。

    但是。就我个人而言,我经常发现,在设计时未考虑单元测试的遗留代码,偶尔测试私有成员可能是实现良好测试覆盖率的最简单方法。

    查看this 文章,了解实现此目的的简单方法。

    【讨论】:

      【解决方案3】:

      我为此类问题找到的最佳解决方案是:

      1. 将构造代码移动到受保护的初始化方法中,该方法从构造函数中调用。让您的构造函数使用相同的参数,并且不要创建默认(无参数)构造函数。
      2. 为您的测试,创建一个继承的可测试版本,它应该具有以下内容:
        • 默认构造函数,什么都不做(甚至不调用初始化程序)
        • 受保护初始化程序的公共重载
        • 您要验证的任何私有/受保护值的公开属性

      此时,您可以像测试任何其他方法一样测试初始化​​程序。如果您的初始化程序所做的只是将值填充到成员变量中,那么一个测试,断言所有值就足够了;但如果您的初始化程序有任何条件逻辑,请确保编写足够的测试来执行该逻辑。

      【讨论】:

        【解决方案4】:

        在编写单元测试时需要考虑一些要点,如图所示

        1. 用于单元测试的单独项目。
        2. 一类用于在一类主代码中编写函数单元测试。
        3. 在函数中覆盖条件
        4. 测试驱动开发 (TDD)

        如果您真的想了解更多(通过示例),请查看本教程

        单元测试 c# - 最佳实践 https://www.youtube.com/watch?v=grf4L3AKSrs

        【讨论】:

        • 链接失效
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        相关资源
        最近更新 更多