单元测试最佳实践

1、测试方法的命名

  • 被测试方法_测试方案_调用方案的预期行为
public  class StringCalculator
{
    public object Add(string v)
    {
        return int.Parse(y);
    }
}

测试代码

[Fact]
public void Add_SingleNumber_ReturnsSameNumber()
{
    var stringCalculator = new StringCalculator();
    var actual = stringCalculator.Add("0");
    Assert.Equal(0, actual);
}

2、单元测试模式

  • Arrange 安排测试对象,准备测试数据
  • Act执行测试行为
  • Assert断言逾期行为
[Fact]
public void Add_EmptyString_ReturnsZero()
{    // Arrange   
    var stringCalculator = new StringCalculator();
     // Act    
    var actual = stringCalculator.Add("");
     // Assert    
    Assert.Equal(0, actual); 
}

3、测试方法论

  • 编写测试时需要将重点放在行为上
  • 对于魔幻字符串,一种很好的方法是将这些值赋给常量
[Fact]
void Add_MaximumSumResult_ThrowsOverflowException()
{
    var stringCalculator = new StringCalculator(); 
    const string MAXIMUM_RESULT = "1001";
    Action actual = () => stringCalculator.Add(MAXIMUM_RESULT);
    Assert.Throws<OverflowException>(actual);
}
  • 避免手动字符串串联和逻辑条件,例如 if 、 while 、 for 和 switch 等等
// Bad Test
[Fact]
public void Add_MultipleNumbers_ReturnsCorrectResults()
{
    var stringCalculator = new StringCalculator();
    var expected = 0;
    var testCases = new[] { "0,0,0", "0,1,2", "1,2,3" };
    foreach (var test in testCases)
    { 
        Assert.Equal(expected, stringCalculator.Add(test)); 
        expected += 3; 
    }
}

//Good Test
[Theory]
[InlineData("0,0,0", 0)]
[InlineData("0,1,2", 3)]
[InlineData("1,2,3", 6)]
public void Add_MultipleNumbers_ReturnsSumOfNumbers(string input, int expected)
{
    var stringCalculator = new StringCalculator();
    var actual = stringCalculator.Add(input);
    Assert.Equal(expected, actual);
}
  • 避免多个断言(方法同上)
  • 不需要对私有方法单独测试

猜你喜欢

转载自www.cnblogs.com/zlgan/p/12180235.html