单元测试 - 最佳实践

Pit*_*erK 5 c# unit-testing mstest visual-studio-2010

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

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 用每个变量的assert语句编写一个测试?或写几个测试,并在每个测试中一次只检查一个变量?例如 :

 

[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);
}
Run Code Online (Sandbox Code Playgroud)
  • 我应该检查构造函数是否正确地将参数分配给私有字段?或者,如果有属性返回该私有字段,但它执行另一个操作,如触发器事件,日志操作等.

我找不到任何有关它的信息.所以你的建议将是最宝贵的.

And*_*bel 6

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

私有字段通常不通过单元测试进行测试.单元测试应该优先测试外部可见的行为和状态.

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