单元测试基础知识

    1. 单元测试概念:单元测试基础知识 

    2. 手动创建单元测试项目

      • 新建-添加项目,单元测试项目,命名规则:项目名+Tests
      • 项目右键添加引用 Microsoft.VisualStudio.TestTools.UnitTesting;
      • 新建类名,命名规则:要测试类的类名+Tests,并在顶部添加 using Microsoft.VisualStudio.TestTools.UnitTesting; 类名添加 [TestClass()]特性
      • 新建测试方法,命名规则:要测试类下的方法名+Tests,测试方法名添加[TestMethod()]特性
    3. 自动创建--使用VS (推荐使用

      • 右键类名或方法名,创建单元测试,自动生成测试项目以及测试文件,测试框架选择MSTestv2版本

        test1.png

      • 测试文件结构
        test2.png

        1.类名必须为TestClass特性, [TestClass] 属性表示包含单元测试的类

        2.测试方法名必须添加TestMethod特性,,[TestMethod] 属性指示方法是测试方法

        3.测试结果断言,来判别程序执行结果与预期结果是否相符

    4. 测试原则
      对 public 母函数完成单元测试,母函数入口参数数据必须进行单元测试(业务+技术)

      理想的单元测试步骤:

      第一步,应该对所有程序集中的公开类以及公开类里面的公开方法添加单元测试。

      第二步,对于构造函数和公共属性进行单元测试。

      第三步,添加全面单元测试。

    5. 测试用例

      编写单元测试一般遵循3A模式:

      Arrange(准备)。设置测试场景,准备测试数据
      Act(执行)。调用被测试代码
      Assert(断言)。验证被测代码的行为是否与预期相同

      单元测试场景:

      • 1.正面测试,即正常运行下返回的预期结果。
      • 2.负面测试,即入口参数不符合输入预期或返回结果不符合方法返回值预期。
        • a.边界条件数据,比如值类型数据的最大值、最小值、DBNull,或者是方法中所使用的条件边界,例如a>100那么100就变成了这个数据的边界。而且在测试的时候还必须把超出边界的数据作为测试条件进行测试。

        • b.空数据,一般空数据对应于引用类型的数据,也就是Null值。

        • c.格式不正确数据,对于引用类型的数据或者结构对象,类型虽然正确但是其内部的数据结构不正确的数据。例如一个数据库实体对象,数据库中要求其某个属性必须为非空,但是这时我们可以属于一个空。这样这个对象就属于一个不正确数据库。

      • 3.分支测试 ,针对方法内存在 if else 分支的情况,使用流程图,明确可能出现的每条分支,制造响应的数据进行覆盖,实现对被测对象的测试。
        test6.png test7.png

      单元测试命名规范:

      测试类的命名规则是:被测试的类+Tests 类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写,如MyIPTests。如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample。

      测试用例的命名规则是:用例操作+Test_状态后缀(状态后缀用于描述同一方法的不同测试场景)。 单词的约定与测试类命名相同。 比如要测试的用例是“输入字符串,判断是否为IP地址”,那么它的测试用例名称就是:IsIPTest_OK.....

      test9.png

    6. 函数特性

      函数功能
      [TestClass] 定义一个测试类,里面可以包含很多测试函数和初始化、销毁函数(以下所有标签和其他断言)。
      [TestMethod] 定义一个独立的测试函数。
      [ClassInitialize] 定义一个测试类初始化函数,每当运行测试类中的一个或多个测试函数时,这个函数将会在测试函数被调用前被调用一次(在第一个测试函数运行前会被调用)。
      [TestInitialize] 定义测试函数初始化函数,每个测试函数运行前都会被调用一次。
      [TestCleanup] 定义测试函数销毁函数,每个测试函数执行完后都会被调用一次。
      [ClassCleanup] 定义一个测试类销毁函数,每当测试类中的选中的测试函数全部运行结束后运行(在最后一个测试函数运行结束后运行)。
      [AssemblyCleanup] 定义测试Assembly销毁函数,当Assembly中所有测试函数运行结束后,运行一次。(在Assembly中所有测试函数运行结束后被调用)
      [AssemblyInitialize] 定义测试Assembly初始化函数,每当这个Assembly中的有测试函数被运行前,会被调用一次(在Assembly中第一个测试函数运行前会被调用)。
      [ExpectedException] 定义预期的异常类型
      [DataTestMethod] 表示执行相同代码,但具有不同输入参数的测试套件, 可以使用 [DataRow] 属性来指定这些输入的值。
      [DataRow] 传值测试
      [Ignore] 忽略测试用例。
      [DataSource] 外部文件或数据库的单元测试,可以提供OleDB数据源、XML或者CSV格式的文件作为数据源
      [DeploymentItem] 表示这个文件要和程序集一起部署到测试位置
      [TestProperty] 在测试中设置任意元数据。
      [TestCategory] 对测试用例或类进行分类。
      [Timeout] 超时时间
      Description 单元测试的描述信息

      Microsoft.VisualStudio.TestTools.UnitTesting Namespace 官方API接口  https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting?view=mstest-net-1.3.2 

    7. 断言

      函数功能
      AreEqual 验证值相等
      AreNotEqual 验证值不相等
      AreSame 验证引用相等
      AreNotSame 验证引用不相等
      Inconclusive 暗示条件还未被验证
      IsTrue 验证条件为真
      IsFalse 验证条件为假
      IsInstanceOfType 验证实例匹配类型
      IsNotInstanceOfType 验证实例不匹配类型
      IsNotNull 验证条件为NULL
      IsNull 验证条件不为NULL
      Fail 验证失败

      更多Assert方法 https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.visualstudio.testtools.unittesting.assert?view=mstest-net-1.3.2 

      更多CollectionAssert方法 https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.visualstudio.testtools.unittesting.collectionassert?view=mstest-net-1.3.2 

      更多StringAssert方法 https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.visualstudio.testtools.unittesting.stringassert?view=mstest-net-1.3.2 

    8. 接口Mock测试选择 Microsoft Fakes或Moq 接口以及外部依赖的模拟

    9. 运行测试结果 打开测试资源管理器:菜单栏-测试-窗口-测试资源管理器,运行全部测试或执行单个测试,运行后显示测试通过结果

      • 全部运行测试
        点击菜单栏-测试-运行-所有测试

      • 单个执行测试 右键方法-运行测试

        test8.png

    10. 相关参考链接

posted @ 2019-07-10 15:03  我脑壳疼胸口闷  阅读(264)  评论(0编辑  收藏  举报