测试框架 MSTest V2与单元测试

对于测试,其实不用顾虑那么多,随便选择吧,MSTest对VS的集成是最好的,而且也很容易上手,如果哪一天碰到它所无法解决的事情,切换到其他框架也非常简单,仅仅只是Nuget下个包,换下特性而已。

测试框架 MSTest V2与单元测试

测试用例组成

单元测试方法名应具有可读性,让整个测试方法在不需要注释说明的情况下可以被读懂。

<被测试方法名称>_<期望的结果>_<给予的条件>

一个完整的单元测试用例应该包含如下三个部分:

  • Arrange:准备当前测试场景的前置条件;
  • Action:执行被测试方法;
  • Assert:对被测试方法的执行结果进行断言判断。

代码覆盖率

代码覆盖率指的是运行单元测试时,产品代码的覆盖情况。
在测试资源管理器中,对选中的单元测试或者全部单元测试的代码进行覆盖率检查。
双击相应方法可以看到具体的代码覆盖情况:红色(未被覆盖),米色(未覆盖完全),浅蓝色(完全覆盖)。
测试框架 MSTest V2与单元测试
对于明确要求测试的公共方法,该方法的代码覆盖率要求100%。
对于指定排除在覆盖率之外的代码,可使用[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage()]。

基于返回值测试

using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass()]
public class ClassNameTests
{
    [DataTestMethod]
    [DataRow(1,2,3)]
    [DataRow(1,20,21)]
    public void AdditonMethodTest(int a , int b, int result)
    {
        Assert.AreEqual(result, a + b);
    }
}

测试用例

基于状态测试

无返回值的情况下,只需要验证更改前后是否符合预期即可。

[TestClass()]
public class LeetCodesTests
{
    [TestMethod()]
    public void HeadTailExchangeTest()
    {
        // arrange
        int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
        int[] nums2 = { 1, 7, 3, 5, 4, 6, 2 };
        var lc = new LeetCodes();

        // act
        var rslt = lc.HeadTailExchange(nums);

        // assert
        Assert.IsTrue(CommFunc.Comparar<int>.CompararArray(rslt, nums2));
    }
}

依赖外部对象的测试

单元测试需要能够快速独立运行,隔离掉对外部的依赖是非常必要的,比如文件系统、硬件数据、web服务等。可以引入“伪对象”。
流程逻辑:要对单元测试进行约束设计;提取接口,从对具体实现的依赖解耦为对接口的依赖。伪对象实现第三方方法;被测试类添加获取伪对象;派生类注入伪对象;在单元测试时,在派生测试类中测试即可。
隔离框架,一个能够在运行时新建和配置伪对象的可重用的类库,它让开发者不用为了伪对象而编写重复的代码。隔离框架可以替我们动态的生成需要的伪对象,节省很多精力。常用的模拟库,比如Moq

多线程测试

多线程测试

ILogger测试


测试用数据

AutoFixture 数据对象生成器