一、说明
本次笔记所有的代码是在VS2013下运行的,使用的nunit.framework.dll版本为3.2.1.0,Reshaper版本为8.2.3
1.xUnit测试框架
大部分单元测试框架的名字中,开头通常是一个字母(代表实现它们的编程语言),如针对Java的JUnit
二、一个完整的例子
1.程序结构
2.编写LogAnalyzer.cs
namespace LogAn { public class LogAnalyzer { public bool IsValidLogFileName(string fileName) { if (!fileName.EndsWith(".SLF")) { return false; } else { return true; } } } }
3.编写LogAnalyzerTest.cs
说明:
[TestFixture]加在一个类上,标识这个类是一个包含自动化NUnit测试的类
[Test]加在一个方法上,标识这个方法是一个需要调用的自动化测试
测试方法的命名规范,一般包含三个部分:[被测方法]_[场景]_[预期行为]
注意:
NUnit测试方法的返回类型必须是void类型,并且不接受任何参数
namespace Manulife.LogAn.UnitTests { [TestFixture] public class LogAnalyzerTests { [Test] public void IsValidFileName_validFile_ReturnTrue() { //arrange(配置) LogAnalyzer analyzer = new LogAnalyzer(); //act(操控) bool result = analyzer.IsValidLogFileName("whatever.slf"); //assert(断言) Assert.IsTrue(result, "filename should be valid!"); } } }
4.运行所有测试查看结果
三、NUnit其他特性
[SetUp]会在每一次运行测试类中的一个测试方法之前都会执行setup方法
[TearDown]会在测试类中的每一个测试方法运行结束后,执行一次
[TestFixtureSetUp]运行在一个测试类中的所有测试运行之前设置状态
[TestFixtureTearDown]在测试运行结束后进行清理
重写测试类
namespace Manulife.LogAn.UnitTests { [TestFixture] public class LogAnalyzerTests { private LogAnalyzer analyzer = null; [SetUp] public void SetUp() { analyzer = new LogAnalyzer(); } [Test] public void IsValidFileName_validFileLowerCased_ReturnTrue() { //act(操控) bool result = analyzer.IsValidLogFileName("whatever.slf"); //assert(断言) Assert.IsTrue(result, "filename should be valid!"); } [Test] public void IsValidFileName_validFileUpperCased_ReturnTrue() { //act(操控) bool result = analyzer.IsValidLogFileName("whatever.SLF"); //assert(断言) Assert.IsTrue(result, "filename should be valid!"); } [TearDown] public void TearDown() { analyzer = null; } } }
执行过程
四、验证预期的异常
1.修改LogAnalyzer.cs
namespace LogAn { public class LogAnalyzer { public bool IsValidLogFileName(string fileName) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException("No filename provided!"); } if (!fileName.EndsWith(".SLF")) { return false; } else { return true; } } } }
2.测试类中添加以下
[Test] public void IsValidFileName_EmptyFileName_ThrowException() { Exception ex = Assert.Catch<Exception>(() => analyzer.IsValidLogFileName(string.Empty)); StringAssert.Contains("No filename provided!", ex.Message); }
五、忽略测试
修改以下方法
[Test] [Ignore("这个测试有问题")] public void IsValidFileName_validFileLowerCased_ReturnTrue() { //act(操控) bool result = analyzer.IsValidLogFileName("whatever.slf"); //assert(断言) Assert.IsTrue(result, "filename should be valid!"); }
六、设置测试类别
修改以下方法
[Test] [Category("运行快点测试")] public void IsValidFileName_validFileUpperCased_ReturnTrue() { //act(操控) bool result = analyzer.IsValidLogFileName("whatever.SLF"); //assert(断言) Assert.IsTrue(result, "filename should be valid!"); }
七、参数化重构单元测试
添加以下测试方法
[TestCase("somefile.slf")] [TestCase("somefile.SLF")] public void IsValidFileName_ValidExtensions_ReturnsTrue(string fileName) { bool result = analyzer.IsValidLogFileName(fileName); Assert.AreEqual(true,result); }