如何在单元测试中验证Python/C中序列化的JSON是否正确?

2024-10-01 17:31:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一些代码,将C对象序列化为JSON,通过网络发送它并将JSON反序列化为Python对象。在

反之亦然,即将Python对象序列化为JSON,通过网络将其发送并将JSON反序列化为C对象。在

在C端,我使用ServiceStack JSON库。在Python中,我使用内置的json库。如果需要的话,C库可以很容易地更改,Python库则要少得多。在


// C#
var serializer = new JsonSerializer();
var json = serializer.SerializeToString(request);

// Python
// JsonCodec inherits from JSONEncoder and hooks to 'default' and just 
// returns obj.__dict__ where obj is the object to be serialized
actualSerializedResponse = JsonCodec().encode(response)

我用C编写了一个单元测试,以验证ServiceStack序列化的JSON是否如Python端所期望的那样。在测试中,创建一个Foo实例,用一些硬编码值填充,然后序列化。为了确保有效性,我将序列化的JSON与保存在文件中的JSON进行比较,其中文件的内容表示Python方面的期望。在

类似地,在Python中有一个单元测试来验证内置json库的序列化json是否如C端所期望的那样。同样,为了确保有效性,我将实际序列化的JSON与保存在文件中的某个JSON进行比较。在

在这两种情况下,我将序列化的JSON与保存在文件中的某个JSON进行比较,这意味着每次运行测试时,将属性序列化为JSON的顺序必须一致。在

我的问题:

  • 在C单元测试中,JSON中属性的顺序似乎与实例正在序列化的C类中定义属性的顺序相匹配。这是可靠的吗?

  • 在Python单元测试中,属性的顺序是一致的,但是是任意的。这是有意义的,因为它依赖于dict并且Python字典是无序的。但这能在任何时候/任何地方都可靠吗?

  • 有没有更好的方法来做这些?

提前致谢。在


Tags: and文件to对象网络json属性序列化
2条回答

关于Python方面:您可以向JSON解码器传递一个使用“有序字典”的选项(但是需要python2.7):

来自http://docs.python.org/library/json.html#json.load

object_pairs_hook is an optional function that will be called with the result of any object literal decoded with an ordered list of pairs. The return value of object_pairs_hook will be used instead of the dict. This feature can be used to implement custom decoders that rely on the order that the key and value pairs are decoded (for example, collections.OrderedDict() will remember the order of insertion). If object_hook is also defined, the object_pairs_hook takes priority.

你的前两个问题很容易回答。只要可以避免,就不应该依赖于未记录的、特定于实现的行为。我想你可以避免在这里这样做。为了使这个答案更充实一点,我将花一些时间回答你的最后一个问题。在

Is there a better way to do all this?

第一步是确认您当前所写的是not unit tests。在

具体来说:

A test is not a unit test if:

  • It communicates across the network
  • It touches the file system

你的测试同时完成了这两项任务。这并不是说你的测试毫无价值,但重要的是要注意它们不是单元测试。这些测试的工作级别是integration testing。集成测试是:

The phase in software testing in which individual software modules are combined and tested as a group. It occurs after unit testing and before validation testing

我认为你的问题是你试图混合集成和单元测试的任务。在

在编写单元测试时,您希望每个测试依赖尽可能少的组件,并尽可能针对特定的情况。在您的例子中,这意味着在C#和Python中的测试都不依赖于另一个的输出。在这两个程序中,让序列化代码处理您需要它处理的最简单的情况,并验证您是否获得了所需的JSON加载/转储。这可能意味着在单元测试代码中以字符串的形式手工编写JSON(您希望您的测试足够小,这样就不会很痛苦)。在

对于您的集成测试,您只需要检查当您的不同部分相互通信时,没有什么会爆炸。在这里,您不必担心序列化和读取是否正确,因为您已经在单元测试中讨论过了。太好了!在

然后,如果遇到bug,修复它们并用适当的测试用例记录它们。最后,您应该有单元测试和一个少数稍大的集成测试。在

相关问题 更多 >

    热门问题