zoukankan      html  css  js  c++  java
  • 读书笔记-单元测试艺术(二)-单元测试框架

    一、说明

    本次笔记所有的代码是在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);
     }
  • 相关阅读:
    IPSec (一)
    python 面向过程和面向对象
    一键修改 yum 源为 aliyun 阿里源 Shell 脚本
    第11组Alpha冲刺(6/6)
    第11组Alpha冲刺(5/6)
    第11组 Alpha冲刺(4/6)
    第11组Alpha冲刺(3/6)
    第11组 Alpha冲刺 (2/6)
    第11组 Alpha冲刺 (1/6)
    第11组(73)需求分析报告
  • 原文地址:https://www.cnblogs.com/kimisme/p/5562127.html
Copyright © 2011-2022 走看看