面向测试场景的简单序列化工具

在软件开发过程中,随着项目规模和复杂性的增加,自动化测试变得越来越重要。单元测试和集成测试是发现早期错误和回归的关键部分,但编写这些测试往往耗时且繁琐。为了缩短编写测试的时间,探索了一种新的方法:将接收到的对象与预先批准的标准对象进行比较。这种方法使用字符串形式的对象,易于理解和比较,并且有许多优秀的差异比较工具可供使用,无需手动编写断言。

尽管存在像Approval Tests这样的框架可以加速字符串表示形式的比较和批准,但发现仍然缺少一些东西:将对象转换为字符串形式仍然需要手动完成,需要选择正确的字段集合,并创建getString和ToString函数。对于复杂的对象,如树形结构,将其转换为字符串形式需要一些工作,并且需要为每个类重复这个过程。

因此,开始编写这个小项目,这是一个简单的序列化工具,用C#编写,以JSON的概念为基础:一切都可以用字典和列表来表示,对象只是一个字典。主要的一点是,完全控制输出序列化,并且输出是可读的,这样在进行差异比较时,变化会非常明显。

使用代码

尽量保持这个类的使用简单,只需一个简单的静态函数调用:

string result = TestObjectSerializer.SerializeToString(yourObject, SerializationType.Xml);

如果需要更多控制,可以传递一个额外的设置对象:

SerializationSettings settings = new SerializationSettings() { MaxDept = -1, IncludeFields = true, FieldInclusion = BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic }; string result = TestObjectSerializer.SerializeToString(yourObject, SerializationType.Xml, settings);

SerializationSettings对象包含以下属性:

  • MaxDept允许控制序列化器在对象图达到的深度。
  • IncludeFields允许包含字段(除了属性)。
  • FieldInclusion是一个BindingFlags枚举,允许完全控制包含哪些类型的字段。
  • PropertyInclusion是一个BindingFlags枚举,允许完全控制序列化哪些类型的属性。
  • OptIn是一个布尔值,用于在包含模式和排除模式之间切换(默认是OptOut,即所有属性都被包含,除非设置了排除属性)。

要排除属性,可以使用[TestSerializerOptOut]属性:

[TestSerializerOptOut] string YourProperty { get; set; }

要仅包含显式包含的属性,可以使用[TestSerializerOptIn]属性,同时在设置对象中传递OptIn=true设置(默认为false):

[TestSerializerOptIn] string YourProperty { get; set; }

序列化深度可以通过更改MaxDept设置来控制(-1表示无限制,默认值):

SerializationSettings settings = new SerializationSettings() { MaxDept = 3, };

现在,对象的比较就像比较整数和字符串一样简单,断言复杂情况的正确性现在只需要两行代码:

string result = TestObjectSerializer.SerializeToString(primitive1, SerializationType.Xml); Approvals.Verify(result);
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485