2012-07-29 95 views
0

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

我的想法至今如下:

  • 有一个创建一个树形结构,并将其保存到数据库
  • 让安装方法创建树的内存副本与一个安装方法以下每个节点的详细信息:父ID,位置,名称
  • 运行我想测试的每个测试函数。例如。将节点从A移动到B
  • 将内存与新的数据库内版本进行比较。传播各DIFF发现
  • 断言差异变化预计

原因创建一个在内存中的副本是测试对一个复杂树(几个层次和节点每级)。否则,我必须为每个测试测试每个节点。

这是否有意义?任何更好的方法(或更好的方法:可以为我做的图书馆)?

谢谢!

+0

你的意思是一个'JTree'即GUI组件或数据结构(非GUI)? – 2012-07-29 14:55:19

+0

非GUI(即数据结构) – checklist 2012-07-29 19:01:38

回答

1

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

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

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

+0

我觉得这个方法比我的大不一样。我喜欢(尤其是录音)。只需要看到它确实很简单。会给它一个镜头!谢谢! – checklist 2012-07-29 19:05:44

+0

我看到比差异更多的相似之处。你的测试策略和单个测试是一样的。这只是实际比较的不同表示。 – 2012-07-29 19:10:11

+0

呃..我实现了它,它太棒了!谢谢。 – checklist 2012-07-30 10:14:37

0

该方法看起来相当公平 - 使用内存副本构建树,现在开始移动测试中的树和内存中的节点并查看它们是否相同。

但我的事情,最重要的是同时使用预定义的使用情况下─

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

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

这可能会覆盖大部分的情况,你应该在代码之后相当合适。

0

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

出于测试目的,你可以考虑树的构建方法,它采用嵌套括号的字符串。添加一个toString方法到相同的格式,并且你有一个理想的测试和调试工具。

例如:

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

什么我已经显示为根,左,右等,实际上可能是你的实际结构更复杂的表述,如“{根,X,Y,名称,值}”。

的一点是使被快速创建和易于理解,让您花费更少的时间了解每一个测试,有时间可以创造足够的测试覆盖你的代码测试。

它从改变你的树数据隔离你的测试是非常重要的。为了推动这项工作,而不是使用的ToString(),您可以添加.toTestString()少勤换。这样你可以添加到你的树对象并改变.toString()而不破坏测试。同样,从字符串中构建树的方法可能是一个单独的类。