编写单元测试返回对象层次结构的函数

时间:2010-08-15 13:16:03

标签: python unit-testing readability

我有一个在输入向量列表上执行层次聚类的函数。返回值是对象层次结构的根元素,其中每个对象表示一个集群。我想测试以下内容:

  1. 每个群集是否包含正确的元素(也可能包含其他属性)?
  2. 每个群集是否指向正确的孩子?
  3. 每个群集是否指向正确的父级?
  4. 我这里有两个问题。首先,如何以可读格式指定预期输出。其次,我如何编写一个test-assertion接受我提供的预期数据的同构变体?假设预期层次结构中的一个群集有两个子节点AB。现在假设该集群由具有属性child1child2的对象表示。我不关心child1是否与群集AB相对应,只是它对应于其中一个,而child2对应于另一个。解决方案应该有点笼统,因为我会用不同的输入数据编写几个测试。

    实际上我的主要问题是找到一种以可读和易懂的方式指定预期输出的方法。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果存在同构结果,则应该有一个可以测试逻辑等效的谓词。这可能对您的代码单元有利,也有助于实现单元测试。

这是没有字符串中间体的Manoj Govindan答案的核心,因为你对字符串中间体(推测)不感兴趣,然后将它们添加到测试机制中将是一个不必要的错误来源。

关于可读性问题,您需要显示您认为不可读的内容,以便给出正确的答案。也许等价谓词可以避免这种情况。

答案 1 :(得分:0)

这是一个不受欢迎的建议。这也有点迂回。注意事项!

首先,编写一个函数来创建一个集群的字符串表示。您必须编写单元测试以确保此功能在所有情况下都能正常工作。格式可以是自定义的或XML(不完全是人性化的,但通常很容易使用分层数据)。您可以通过传入集群来调用此函数:string_representation(cluster)

其次,编写一个变体来生成相同的输出而不传入实际的集群。类似于util.test.generate_string_representation('child1', 'child2')

第三,修改单元测试断言,根据具体情况将string_representation(cluster)的输出与generate_string_representation('child1', 'child2')进行比较。

actual = string_representation(f(*args, **kwargs))
expected = generate_string_representation('child1', 'child2')
self.assertEqual(actual, expected)

确保两个字符串函数使用相同的机制来格式化其输出。你不想最终追逐字符串中的微小差异。

告诉你,这是非常hackish。我希望别人有更好的答案。

答案 2 :(得分:0)

感觉可能有一些空间可以将你的方法分成小块。 Ones专注于处理解析输入和格式化输出,可以与实际的聚类逻辑分开。这种方式测试您的聚类方法会更少,并处理容易理解和可测试的数据结构,如dicts和列表。