单元测试(二)测试系统状态的单元测试

  在 单元测试(一):我的第一个单元测试 中对结果为返回值的方法进行了单元测试,这篇文章编写一个没有返回值但改变了对象的状态的测试

  一.在产品代码中添加一个属性并在判断扩展名的方法中对该属性做修改,灰色背景为修改的代码,代码如下:

 1     public class FileVerify
 2     {
 3         public bool LastFileExtensionIsValid { get; set; }
 4 
 5         public bool IsValidFileName(string filename)
 6         {
 7             LastFileExtensionIsValid = false;//change status
 8 
 9             if (string.IsNullOrWhiteSpace(filename))
10             {
11                 throw new ArgumentException("filename has to be provided");
12             }
13             if (filename.EndsWith(".txt", StringComparison.CurrentCultureIgnoreCase))
14             {
15                 LastFileExtensionIsValid = true;//change status
16                 return true;
17             }
18             return false;
19         }
20     }

  二.在测试代码中添加测试

 1         [TestCase("test.txt",true)]
 2         [TestCase("test.too",false)]
 3         public void IsValidFileName_WhenCalled_ChangeLastFileExtensionIsValid(string fileName,bool expected)
 4         {
 5             FileVerify fileVerify = MakFileVerify();
 6 
 7             fileVerify.IsValidFileName(fileName);
 8 
 9             Assert.AreEqual(expected,fileVerify.LastFileExtensionIsValid);
10         }

     使用了两个TestCase来进行测试,一个为正验证,一个为反验证,这样才能确保测试逻辑的完整性

     TestCase在上篇文章中的一个参数对应测试方法中的一个参数 该测试中TestCase使用了两个参数对应测试方法的两个参数  必须一一对应

     命名问题:[工作单元]_[假设条件]_[预期行为] 

                       工作单元:因需调用IsValidFileName方法,所以用该方法命名

                       假设条件:就是我们调用该方法的行为

                       预期行为:定义的属性的值变化了

     单元测试中,测试方法的命名需要遵守一定的规则,而且在整个项目中需要统一,这样可读性很高

  三.介绍NUnit中的不常用的Attribute

       [Ignore]  作用是忽略当前的测试方法   使用场景:当前测试的结果为失败,但是需要将代码提交到主分支   在可持续集成中,当有代码提交时,代码管理工具会先将所有的测试都运行一遍,如果有失败,那么该Attribute会派上用场,但是不建议使用,应该去解决测试或产品代码的问题

       [SetUp]  测试类中每个测试运行完之前都会执行标注了该特性的方法

       [TearDown]  测试类中每个测试运行完之后都会运行标注了该特性的方法

       [TestFixtureSetUp]   测试类中所有测试运行之前执行

       [TestFixtureTearDown]  测试类中所有测试运行完成后执行

     

     其实在单元测试可以倒逼我们写出更好的产品代码,比如方法命名规范、方法的职责单一!

     如有错误之处,请指出!