【C#】单元测试入门(XUnit 测试框架)
本文示例环境
- Visual Studio 2019
- XUnit 2.9.2 单元测试框架
- xunit.runner.visualstudio 2.2.0 测试运行工具
为什么要写单元测试
一个项目中,可能比较庞大。所以,使用测试,可以减少耦合,提升代码的质量。也可以让后续开发人员,快速了解代码。
至于不写测试代码的原因有很多:比如,没必要;懒;不会。我属于不会的。
新写一个功能,重启一个项目,或者另外用main方法调用测试代码,很奇怪,测试起来效率低下。所以,简单入个门,把不会变为会。
框架选型
至于框架的选型。其实本人并不了解也没写过单元测试,这算是第一次真正接触吧。在不了解的情况下怎么选型呢?那就是看哪个最火、用的人多就选哪个。起码出了问题也容易同别人交流。
这里使用了XUnit 。
目标
发现,测试的概念有很多。现在,我需要实现的目标:1. 判断结果是不是自己想要的。2。将需要的结果输出。
开始前准备
- 新建一个空项目 UnitTestingDemo
- 新建类库 TestDemo (用于编写被测试的类)
- 新建类库 TestDemo.Tests (用于编写单元测试)
- 对类库 TestDemo.Tests 用nuget 安装XUnit 、xunit.runner.visualstudio 。
- 添加 TestDemo.Tests 对 TestDemo 的引用
简单断言测试
新建一个方法。两个数相加的方法。
1 public class Arithmetic 2 { 3 public int Add(int nb1, int nb2) 4 { 5 return nb1 + nb2; 6 } 7 }
测试代码如下:
1 public class Arithmetic_Tests 2 { 3 [Fact]//需要在测试方法加上特性Fact 4 public void Add_Ok() 5 { 6 Arithmetic arithmetic = new Arithmetic(); 7 var sum = arithmetic.Add(1, 2); 8 9 Assert.True(sum == 3);//断言验证 10 } 11 }
(测试之前,可以开启Live Unit Test)。我们可以启用它进行实时的测试。也就是我们编辑单元测试,然后保存的时候,它会自动生成自动测试,最后得出结果。(我在工具那里没找到。暂时不影响后续继续使用)
点击待测试的项目,或者按【Crlt+R】+ 【Crlt+T】运行。
运行后,可以看到绿色的狗,表示通过。
带输出的测试
上述代码,我们只能知道,结果是否正确。比如,你断言1+2的结果为3。如果运行错误,(比如结果为2),你只知道错了,但不知道错的结果是什么(当然,你可以加断点看),如果能直接将运行结果输出,是否更好? Console.WriteLine(sum); 没有报错,但没有输出。
于是,我们重构测试方法。
1 private readonly ITestOutputHelper _output; 2 3 public ArithmeticTest(ITestOutputHelper output) 4 { 5 _output = output; 6 }
修改测试代码为:
1 [Fact] 2 public void Add_Ok() 3 { 4 Arithmetic arithmetic = new Arithmetic(); 5 var sum = arithmetic.Add(2,2); 6 _output.WriteLine(sum.ToString()); // 输出将会被捕获并显示在测试结果中 7 Assert.True(sum == 4); 8 }
这样,返回结果中就有输出了。
带参数的测试
注意到测试代码中的参数和结果都写死了。如果我们要对多种情况进行测试,岂不是需要写多个单元测试方法或者进行多次方法执行和断言。这也太麻烦了。在XUnit框架中为我们提供了Theory特性。使用如下:
1 [Theory] 2 [InlineData(2, 3, 5)] 3 [InlineData(2, 4, 6)] 4 [InlineData(2, 1, 3)] //对应测试方法的形参 5 public void Add_Ok_Two(int nb1, int nb2, int result) 6 { 7 Arithmetic arithmetic = new Arithmetic(); 8 var sum = arithmetic.Add(nb1, nb2); 9 Assert.True(sum == result); 10 }
参考地址
https://zhuanlan.zhihu.com/p/517412127