使用JUnit测试树实现

时间:2012-07-29 14:53:11

标签: java testing junit tree qa

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

我的想法到目前为止:

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

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

这有意义吗?任何更好的方法(或更好的方法:可以为我做这个的库)?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

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

这可能会涵盖大多数情况,之后您应该对代码感到非常认可。

答案 2 :(得分:0)

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

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

例如:

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

我以root,left,right等方式显示的内容实际上可能是对您的实际结构的更复杂的表示,例如“{root,x,y,name,value}”。

关键是要进行快速创建和易于理解的测试,以便您花费更少的时间来理解每个测试,并有时间创建足够的测试来覆盖您的代码。

将测试与树数据的更改隔离开来非常重要。为了方便这一点,您可以添加更少频繁更改的.toTestString(),而不是使用.toString()。这样,您可以添加到树对象并更改.toString()而不会破坏测试。同样,字符串中的树构造方法可能是一个单独的类。