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);
     }
  • 相关阅读:
    转:Unity3D的四种坐标系
    在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
    Unity3d 引擎原理详细介绍、Unity3D引擎架构设计
    vs2010打开vs2012的sln文件
    Unity3d不支持vistual studio2012?用vs2012打开unity c#脚本进行编码的方法。
    C#学习笔记15:字符串、文件、目录的操作方法
    C#学习笔记14:面向对象继承的特点和里氏转换
    C#学习笔记13:静态方法、方法重载和ref、out参数
    C#学习笔记12:枚举、结构、数组基础学习
    C#学习笔记11:C#中的顺序结构、分支结构、循环结构
  • 原文地址:https://www.cnblogs.com/kimisme/p/5562127.html
Copyright © 2011-2022 走看看