单元测试--最佳实践
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); }
- 避免多个断言(方法同上)
- 不需要对私有方法单独测试
SQL Server