对于测试,其实不用顾虑那么多,随便选择吧,MSTest对VS的集成是最好的,而且也很容易上手,如果哪一天碰到它所无法解决的事情,切换到其他框架也非常简单,仅仅只是Nuget下个包,换下特性而已。
测试用例组成
单元测试方法名应具有可读性,让整个测试方法在不需要注释说明的情况下可以被读懂。
<被测试方法名称>_<期望的结果>_<给予的条件>
一个完整的单元测试用例应该包含如下三个部分:
- Arrange:准备当前测试场景的前置条件;
- Action:执行被测试方法;
- Assert:对被测试方法的执行结果进行断言判断。
代码覆盖率
代码覆盖率指的是运行单元测试时,产品代码的覆盖情况。
在测试资源管理器中,对选中的单元测试或者全部单元测试的代码进行覆盖率检查。
双击相应方法可以看到具体的代码覆盖情况:红色(未被覆盖),米色(未覆盖完全),浅蓝色(完全覆盖)。
对于明确要求测试的公共方法,该方法的代码覆盖率要求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测试