DotCover结果显示:
NunitnamespaceCalculatorPkg.Tests
{
//添加TestFixture标识类是测试类
[TestFixture]
publicclassNUnitTest
{
//初始化
[SetUp]
publicvoidSetup()
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
calculator=newCalculator(feed);
Console.WriteLine(beforetest...);
}
//测试用例分类,跳过测试方法
[Test(Description=Add1with1.Expectedresultis2.)]
[Category(add)]
[Ignore(Methodisignored)]
publicvoidTC0_Add1With1()
{
intactualResult=calculator.Add(1,1);
intexpectedResult=2;
Assert.AreEqual(expectedResult,actualResult);
}
//带参测试方法
[Test()]
[Category(sub)]
[TestCase(0,1)]
[TestCase(1,1)]
[TestCase(2,1)]
publicvoidTC0_SUB(inta,intb)
{
intactualResult=calculator.Subtract(a,b);
intexpectedResult=a-b;
Assert.AreEqual(expectedResult,actualResult);
}
//测试divide方法,以及测试用例排序
[Test(Description=Divide9by3.Expectedresultis3.)]
[Category(divide)]
[Order(2)]
publicvoidTC1_Divide9By3()
{
Console.WriteLine(TC1_Divide9By3:+DateTime.Now.TimeOfDay.ToString());
doubleactualResult=calculator.Divide(9,3);
intexpectedResult=3;
Assert.AreEqual(expectedResult,actualResult);
}
//异常判断
[Test(Description=Divideanynumberbyzero.ShouldthrowanSystem.DivideByZeroExceptionexception.)]
[Category(divide)]
[Order(3)]
publicvoidTC2_DivideByZero()
{
Console.WriteLine(TC2_DivideByZero:+DateTime.Now.TimeOfDay.ToString());
Assert.That(()=calculator.Divide(9,0),Throws.TypeOfDivideByZeroException());
}
//mock实例
[Test(Description=Convert1USDtoRMB.Expectedresultis.)]
[Category(convert)]
[Order(1)]
publicvoidTC3_ConvertUSDtoRMBTest()
{
Console.WriteLine(TC3_ConvertUSDtoRMBTest执行时间:+DateTime.Now.TimeOfDay.ToString());
intactualResult=calculator.ConvertUSDtoRMB(1);
intexpectedResult=;
Assert.AreEqual(expectedResult,actualResult);
}
//后处理
[TearDown]
publicvoidTeardown()
{
Console.WriteLine(aftertest...);
}
}
} DotCover结果显示:
执行顺序结果:
图NUnit测试用例执行顺序验证
即执行情况符合规定的顺序。
XUnit.NETnamespaceCalculatorPkg.Tests
{
publicclassXUnitCal
{
//测试用例分类,跳过测试方法
[Fact(Skip=Methodisignored)]
[Trait(Category,add)]
publicvoidTC0_Add1With1()
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
ICalculatorcalculator=newCalculator(feed);
intactualResult=calculator.Add(1,1);
intexpectedResult=2;
Assert.Equal(expectedResult,actualResult);
}
//带参测试方法
[Theory()]
[Trait(Category,multi)]
[InlineData(0,1)]
[InlineData(1,1)]
publicvoidTC0_multi(inta,intb)
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
ICalculatorcalculator=newCalculator(feed);
intactualResult=calculator.Multipy(a,b);
intexpectedResult=a*b;
Assert.Equal(expectedResult,actualResult);
}
[Fact()]
[Trait(Category,divide)]
publicvoidTC1_Divide9By3()
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
ICalculatorcalculator=newCalculator(feed);
doubleactualResult=calculator.Divide(9,3);
intexpectedResult=3;
Assert.Equal(expectedResult,actualResult);
}
//异常判断
[Fact()]
[Trait(Category,divide)]
publicvoidTC2_DivideByZero()
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
ICalculatorcalculator=newCalculator(feed);
//doubleactualResult=calculator.Divide(9,0);
Assert.ThrowsDivideByZeroException(()=calculator.Divide(9,0));
}
//mock实例
[Fact()]
[Trait(Category,convert)]
publicvoidTC3_ConvertUSDtoRMBTest()
{
IMoneyExfeed=this.PrvGetMockExchangeRateFeed();
ICalculatorcalculator=newCalculator(feed);
intactualResult=calculator.ConvertUSDtoRMB(1);
intexpectedResult=;
Assert.Equal(expectedResult,actualResult);
}
}
} DotCover结果显示:
工具对比
本次调研重点研究的三款C#单元测试工具(MsTest、NUnit、XUnit.NET)来说,使用区别度并不是很大,具体如下:
MsTest作为内置的visualstudio测试工具来讲,操作简单,易于使用;另外,如果已经使用visualstudio作为编译器,不用做任何的安装即可使用,也是其较为明显的优点之一。但是其也存在在带参测试时不能同时支持异常判断,以及无法对测试用例排序等缺点。
NUnit作为比较成熟的C#单元测试工具,好处包括可以按名称空间进行测试分组,添加测试用例注释(使用相同的参数多次运行相同的测试)及对测试用例排序等功能,并且它与Opencover和ReportGenerator进行覆盖分析的效果很好。主要的缺点是它没有像MSTest那样集成,但是通过Nuget现在在visualstudio中使用NUnit已经成为一件比较容易的事情。NUnit还有一个不同于其它测试工具的特点是NUnit2中有自己的GUI,可以不通过VS来看单元测试结果,但是如上所说,GUI只在NUnit2中提供,而现在普遍使用的都是NUnit3。
XUnit.NET作为NUnit的进阶简化版,是一种和NUnit及其相似的简单现代的单元测试框架。XUnit.NET不同于其它测试工具的特点主要有两个:一是取消了单元测试框架中的前后处理方法,为每个测试方法都创建测试类的新实例,即提高了测试用例之间的隔离性;二是用断言替代了属性的方式来捕捉异常,不采用Attribute的方式来捕捉异常有两方面的好处:在代码中直接断言(Assert)能捕捉到更多种类的异常;遵守Arrange-Act-Assert(or3A)模式:即测试命名上“范围-作用-断言”规范。但是正是由于其简化的特性,其缺点也显而易见,即一些高阶的测试可能无法用XUnit完成,并且和NUnit一样,XUnit与VS的集成没有MsTest那么自然。
总结
本次调研重点测评了三款C#开源单元测试工具,对其特性及基本使用进行了介绍。其实在开源社区蓬勃发展的今天,众多开源工具之间的区别也通过很多次迭代渐渐在缩小,如本次重点调研的三款工具虽各有优势和劣势,但是差异已经不再那么明显,大家在使用时结合自身的业务背景来选择合适的工具即可。