-
.Net单元测试框架: moq
-
如果项目目的Internal方法需要再单元测试项目中引用到测试,由于默认情况下,Internal只能在同一程序集中引用,这种情况下需要在AssemblyInfo.cs中添加 “[assembly: InternalsVisibleTo(“UnitTest项目名称”)]” 使得Internal类型和方法在项目之外的单元测试项目中也可以访问到
-
单元测试类或方法的DeploymentItemAttribute特性:指定随着运行单元测试一起部署的目录或文件,比如
[DeploymentItem(“sysconfig.unittest.config”)]
[DeploymentItem(“sysconfig.testdebug.locator”)]
[TestClass] 或者[TestMethod]
…… -
[AssemlyInitialize] 定义单元测试的程序集运行时的初始方法,在[TestInitialize]之前运行, 比如: 在测试项目中建如下测试类,在里面建如下[AssemlyInitialize] 初始化方法:
[TestClass]
public class Startup
{
[AssemlyInitialize]
public static void MyTestInit(TestContext testContext)
{
TestConfigure.Initialize();
}
} -
[ClassInitialize] :类似[AssemlyInitialize] 的作用,只是定义类的初始化方法
-
[TestInitialize]在测试类中指定每次单元测试方法运行之前都运行的“初始方法”(有2个DataRow或者带回2组测试参数DynamicData的单元测试方法2次运行前也都会2次分别先运行“初始方法”)
-
与以上3、4、5相对应的有[TestCleanup]、[ClassCleanup]、[AssemblyCleanup],用于测试方法执行之后执行,比如释放资源等操作
-
[Ignore]定义不执行的测试方法,比如临时未能跑通的测试方法暂时保存时很有用,而不用注释掉代码
-
结合多组参数数据对单元测试方法进行测试:
[DataTestMethod]
[DataRow(1,2,…,N)]
…带参数的单元测试方法 -
预料执行会抛出指定的异常的单元测试方法,(默认参数下AllowDerivedTypes = false,抛出“预料异常类的子类”不视为“预料异常”)
[ExpectedException(typeof(Exception类) , AllowDerivedTypes = false)]
……单元测试方法 -
也可以不通过特性,而通过Assert.ThrowsException<Exception类>(Action或Func)来预料执行会抛出指定的异常的单元测试方法
-
使用[DynamicData] 结合返回值的静态方法或属性,进行多种组合的参数化测试
比如:
- 例1:
[DynamicData(nameof(GetTestData), DynamicDataSourceType.Method)] //arrange
[TestMethod()]
public void TestMathOps(decimal a, decimal b, Func<decimal, decimal, decimal> calculatorOperation, decimal expectedValue)
{
//act
var actual = calculatorOperation(a, b);
//assert
Assert.AreEqual(expectedValue, actual);
}
And here’s the GetTestData test data generator method:
private static IEnumerable<object[]> GetTestData()
{
return new List<object[]>()
{
new object[]{ 1.2m, 2.3m, (Func<decimal, decimal, decimal>)Calculator.Add, 3.5m },
new object[]{ 1.5m, 0.5m, (Func<decimal, decimal, decimal>)Calculator.Subtract, 1.0m },
new object[]{ 1.5m, 2.0m, (Func<decimal, decimal, decimal>)Calculator.Multiply, 3.0m }
};
}
详见: 《C# – Use DynamicData attribute to pass functions and objects into parameterized tests》
https://makolyte.com/csharp-use-dynamicdata-attribute-to-pass-functions-and-objects-into-parameterized-tests/ - 例2:
[DataTestMethod]
[DynamicData(“TestPropVal”,DynamicDataSourceType.Property)]
public void TestCall(Class1, int expVal)
{
…
}
返回测试参数值的静态属性:
private static List<object[]> TestPropVal
{
get
{
return new List<object[]>(){
new object[]{new Class1(),0},
new object[]{new Class1(){…},2},
…
}
}
}