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