结果与期望比对,是测试程序中最重要的一个步骤,就是用它来取代人眼比对,有关对象比对 91哥的文章有非常详细的介绍:
https://dotblogs.com.tw/hatelove/2014/06/06/how-to-assert-two-collection-equal
https://dotblogs.com.tw/hatelove/2016/03/28/compare-object-equality-with-expected-objects
当测试程序用的是复杂类型,会比对类型中的属性状态(值),用它来决定是否通过验证,最直接的方式就是跑循环一个一个比,这样做不是很聪明,也不够快,太费力
我会使用以下对象来完成我的工作
- FluentAssertions
- SpecFlow
在这里我分享我常用的比对方式...
开发环境
- Windows 10 Enterprise x64 CHT
- VS 2015 Update2 Eng
- FluentAssertions 4.9
- SpecFlow 2.1
FluentAssertions
Nuget 上的 FluentAssertions 提供了相当多的比对方式,其中复杂类型的比对可通过 ShouldBeEquivalentTo | ShouldAllBeEquivalentTo 方法实现
它可以
Anonymous Type Compare
Anonymous Collection Type Compare
Anonymous and Name Type Compare
[TestMethod] public void 具名类型集合和具名类型集合比较() { var expected = new List() { new Product { ID=1,Name="pen",Price=2.22m,Remark = "我爸的笔"}, new Product { ID=2,Name="book",Price=4.96m ,Remark = "我爸的书"}, }; var actual = new List () { new Product { ID=1,Name="pen",Price=2.22m,Remark = "我爸的笔"}, new Product { ID=2,Name="book",Price=4.96m ,Remark = "我爸的书"}, }; expected.ShouldBeEquivalentTo(actual); }
在某些情况下,我只比某些字段,其余字段不重要,我不要比,expected 没有 Remark 这个字段,测试仍然亮绿灯
[TestMethod] public void 匿名类型集合和具名类型集合比较() { var expected = new[] { new { ID=1,Name="pen",Price=2.22m }, new { ID=2,Name="book",Price=4.96m }, }; var actual = new List() { new Product { ID=1,Name="pen",Price=2.22m,Remark = "我爸的笔"}, new Product { ID=2,Name="book",Price=4.96m ,Remark = "我爸的书"}, }; expected.ShouldBeEquivalentTo(actual); }
FluentAssertions 只会比 expected 存在的项目,不理会 actual
[TestMethod] public void 匿名类型和具名类型比较() { var expected = new { ID = 1, Name = "pen", Price = 2.22m }; var actual = new Product { ID = 1, Name = "pen", Price = 2.22m, Remark = "我爸的笔" }; expected.ShouldBeEquivalentTo(actual); }比对单一对象用 ShouldBeEquivalentTo
比对集合对象用 ShouldAllBeEquivalentTo (也可比对单一对象)
?
SpecFlow
有关数据库的验证,我会采用 SpecFlow 来完成多字段的验证,而不是 FluentAssertions,它描述多字段需求,较容易阅读;验证时,也只会根据 Then 所描述的字段下去比对(部分比对)。
Scenario: SpecFlow比较部分属性 Given Product数据表应有以下数据 | ID | Name | Price | Remark | | 1 | pen | 2.22 | 我爸的笔 | | 2 | book | 4.96 | 我爸的书 | Then 我预期应在Product数据表得到以下数据 | ID | Name | Price | | 1 | pen | 2.22 | | 2 | book | 4.96 |
以下程序没有真的操作数据库,重点是 SpecFlow 的比对方法 table.CompareToSet(products)
[Given(@"Product数据表应有以下数据")] public void GivenProduct数据表应有以下数据(Table table) { var products = table.CreateSet比对单一对象用 table.CompareToInstance()(); ScenarioContext.Current.Add("products", products); } [Then(@"我预期应在Product数据表得到以下数据")] public void Then我预期应在Product数据表得到以下数据(Table table) { var products = ScenarioContext.Current.Get >("products"); table.CompareToSet(products); }
比对集合对象用 table.CompareToSet()
若有谬误,烦请告知,新手发帖请多包涵
2010~2017 C# 第四季
原文:大专栏 [Unit Test] 测试程序中的比对对象