当前位置 : 主页 > 网页制作 > HTTP/TCP >

[Unit Test] 测试程序中的比对对象

来源:互联网 收集:自由互联 发布时间:2021-06-16
结果与期望比对,是测试程序中最重要的一个步骤,就是用它来取代人眼比对,有关对象比对 91哥的文章有非常详细的介绍: https://dotblogs.com.tw/hatelove/2014/06/06/how-to-assert-two-collection-e

结果与期望比对,是测试程序中最重要的一个步骤,就是用它来取代人眼比对,有关对象比对 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

当测试程序用的是复杂类型,会比对类型中的属性状态(值),用它来决定是否通过验证,最直接的方式就是跑循环一个一个比,这样做不是很聪明,也不够快,太费力

我会使用以下对象来完成我的工作

  1. FluentAssertions
  2. 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
  

 
  
  (); ScenarioContext.Current.Add("products", products); } [Then(@"我预期应在Product数据表得到以下数据")] public void Then我预期应在Product数据表得到以下数据(Table table) { var products = ScenarioContext.Current.Get 
 
  
    >("products"); table.CompareToSet(products); } 
   

 
比对单一对象用 table.CompareToInstance()
比对集合对象用 table.CompareToSet()

若有谬误,烦请告知,新手发帖请多包涵

2010~2017 C# 第四季

原文:大专栏  [Unit Test] 测试程序中的比对对象

网友评论