我需要为其节点测试树实现和不同的“移动”操作。我的树保存到DB(在我们的例子中它是mongoDB,但它并不重要)。什么是最好的方法?我正在使用JUnit。
我的想法到目前为止:
创建内存中副本的原因是针对复杂树(每个级别的多个级别和节点)进行测试。否则,我必须为每个测试测试每个节点。
这有意义吗?任何更好的方法(或更好的方法:可以为我做这个的库)?
谢谢!
答案 0 :(得分:1)
你的方法听起来不错。我建议一个改变:代替数据库编写两个递归方法,生成给定树的字符串XML表示,并从给定的XML表示重新创建树。
您可以将初始树和期望树存储为每个测试用例的XML字符串,测试用例的断言是在一组操作之后树的XML表示形式是否等于()预期的XML字符串。
在视觉上检查各种XML字符串应该很容易,并且调试会更容易,因为当测试失败时,您可以看到实际的XML并在视觉上将其与预期的XML进行比较。实际上,您甚至可以在记录模式下运行测试用例,他们只需将结果XML写出来供您审核和批准。
答案 1 :(得分:0)
这种方法似乎相当公平 - 构建一个带有内存副本的树,现在开始移动被测树中的节点和内存实例,看看它们是否相同。
但我认为最重要的是使用两种预定义的用例 -
和另一个使用随机树的测试。
这可能会涵盖大多数情况,之后您应该对代码感到非常认可。
答案 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()而不会破坏测试。同样,字符串中的树构造方法可能是一个单独的类。