0

我需要为其节点测试树实现和不同的“移动”操作。我的树保存到 DB(在我们的例子中是 mongoDB,但它并不重要)。最好的方法是什么?我正在使用 JUnit。

到目前为止,我的想法如下:

  • 有一个创建树结构并将其保存到数据库的 setUp 方法
  • 让 setUp 方法创建树的内存副本,每个节点包含以下详细信息:父 ID、位置、名称
  • 运行我要测试的每个测试功能。例如将节点从 A 移动到 B
  • 将内存中的内存与新的数据库内版本进行比较。传播找到的每个差异
  • 断言差异变化是预期的

创建内存中副本的原因是针对复杂树(多个级别和每个级别的节点)进行测试。否则,我必须为每个测试测试每个节点。

这有意义吗?有什么更好的方法(或更好的:可以为我做的图书馆)?

谢谢!

4

3 回答 3

1

你的方法听起来不错。我建议进行一项更改:编写两个递归方法来代替数据库,它们生成给定树的字符串 XML 表示,并从给定的 XML 表示重新创建树。

您可以将初始树和预期树存储为每个测试用例的 XML 字符串,并且测试用例的断言是在一组操作之后的树的字符串 XML 表示是否等于()预期的 XML 字符串。

应该很容易直观地检查各种 XML 字符串并且调试会更容易,因为当测试失败时,您可以看到实际的 XML 并将其与预期的 XML 进行直观比较。事实上,您甚至可以在记录模式下运行测试用例,它们只需写出生成的 XML 供您审查和批准。

于 2012-07-29T15:05:25.300 回答
0

这种方法似乎很公平——用内存中的副本构建一棵树,现在开始在被测树和内存实例中移动节点,看看它们是否相同。

但我认为最重要的是使用两个预定义的用例-

  • 空树
  • 只有右/左儿子
  • 递归移动
  • 叶动
  • ...

和另一个使用随机树的测试。

这可能会涵盖大多数情况,之后您应该对代码充满信心。

于 2012-07-29T15:04:48.623 回答
0

理想情况下,为树提供持久性的代码应该独立于操作它的代码。这样您就可以独立地测试和修改它们。

出于测试目的,您可以考虑采用嵌套括号字符串的树构造方法。将 toString 方法添加到相同的格式,您就有了理想的测试和调试工具。

例如:

Tree sut( "(root,left,(right,a,b))" );
ASSERT_EQUALS( "(root,(left,c,),(right,a,b))", sut.methodUnderTest(c).toString());

我所显示的根、左、右等实际上可能是您的实际结构的更复杂表示,例如“{root,x,y,name,value}”。

关键是要让测试快速创建且易于理解,这样您就可以减少理解每个测试的时间,并有时间创建足够的测试来覆盖您的代码。

将测试与树数据的更改隔离开来很重要。为了促进这一点,您可以添加更改频率较低的 .toTestString(),而不是使用 .toString()。这样您就可以添加到您的树对象并更改 .toString() 而不会破坏测试。同样,您从字符串构建树的方法可能是一个单独的类。

于 2012-07-29T15:09:29.480 回答