读书笔记-单元测试艺术(二)-单元测试框架

一、说明

本次笔记所有的代码是在VS2013下运行的,使用的nunit.framework.dll版本为3.2.1.0,Reshaper版本为8.2.3

1.xUnit测试框架

大部分单元测试框架的名字中,开头通常是一个字母(代表实现它们的编程语言),如针对Java的JUnit

二、一个完整的例子

1.程序结构

image

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.运行所有测试查看结果

image

三、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;
        }
    }
}
View Code

执行过程

image

四、验证预期的异常

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;
            }
        }
    }
}
View Code

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);
 }
原文地址:https://www.cnblogs.com/kimisme/p/5562127.html