2017-01-07 109 views
0

我必须为Java“绘图”应用程序GUI(如ArgoUML/LaTeXDraw/etc)自动生成测试。我需要验证测试的应用程序的行为是否正确。在我给出的例子中,我需要检查Undo/Redo按钮是否正常工作=撤销将画布置于前置状态,并且重做将其重置为原来的状态。测试使用Java Swing编码的应用程序GUI:最佳方法?

我已经我将如何处理这个问题,但我想有经验的人的意见的想法:

  • 我应该使用机器人类的输入模拟到GUI?或者 有没有更简单的方法?
  • 我需要捕捉程序供以后分析的状态,看 如果程序的状态是一致的,我应该只是截图 窗口或者是有没有办法通过所有Jframe的 组件和捕获迭代他们的属性(它应该包括画布 状态)?

  • 更重要的是,我不知道如何找到在 接口上的每个按钮。告诉机器人一个给定的 按钮位于窗口中某个(x,y)位置的最简单方法是什么?我应该在按钮的.jpeg版本中搜索 像素吗?我是否应该手动定位界面上的每个 按钮(即为包含x,y属性的每个按钮 创建一个类)?

  • 最后,我从来没有“附加”一个机器人到一个给定的程序。可以 我只是加载我想测试的软件的.jar文件,并告诉 机器人在该窗口上运行?或者我需要使用原始项目中的所有 源文件?

谢谢你的时间,如果我的问题的任何部分似乎不够清楚,请告诉我,我会尽力解释它更清楚。

PS:关于我需要做的工作有什么建议,欢迎:)

+0

*“我必须自动生成JAVA测试”*这些测试有什么好处?是否真的测试*测试代码的行为*还是测试测试生成器是否正常工作?我不会依赖这样的测试。 –

+0

我刚刚编辑OP – LostReality

+0

您可以尝试使用ReTest(https://www.retest.de/en/),它带有一种有趣的新方法,用于功能性回归测试和基于ai的猴子测试。 – roesslerj

回答

1

我已经done你在explained你在其他答案的评论。

Robot可以为流程的各个部分有用的,但是,这取决于它是如何写的,遵循最佳测试实践的渴望,以及总体需求也可以得到有限的快。如果您没有编写它或者最佳编码实践使您无法访问或直接测试应用程序的各个方面,则需要其他方法。

我的经验让我通过使用反射来测试实际状态(如各种组件的文本值)来挖掘主入口点。 Robot只对我的情况执行key events有用。

最终,答案(S)取决于许多因素:

  1. 机器人? - 当然,只要它适合您的需求就使用它。
  2. 在满足要求的同时做最简单的事情。如果屏幕截图可以,请执行此操作(使用Robot)。如果你需要更多的信息,你可以get the componentsJFrameJPanel,并保存提供的任何属性。
  3. 这可以通过UI的调查以多种方式完成。找到该按钮并直接执行doClick,使用Robot移动鼠标并按下鼠标等。
  4. 当您实例化新的Robot时,它将链接到主设备。简单情况下不需要更多new Robot().keyPress(KeyEvent.VK_ENTER);

鉴于所有这些,有焦点等缺陷。最好启动你的模拟/测试,不要触摸机器外围的任何。另外,根据某些方法的运行时间,您可能想要Thread.sleep()(正如我们遗憾地做的那样)或使用连接的线程。

+0

非常感谢你的回答,这对我有很大的帮助。但我仍然没有得到第三个问题的解释。当你使用Robot时他怎么知道可以说“新文件”按钮位于JFrame上的位置(340,220)?您是否为每个按钮手动指定了几何坐标?这是我最大的担心...... – LostReality

+0

@LostReality,很高兴它的帮助。我工作了大约一年,所以我不确定你指的是什么。我不记得我们使用坐标来获取组件,而是通过测试套件和util代码进行扫描,但没有看到类似的东西。如果我们确实在某处通过调查应用程序代码来做到这一点。你能告诉我文件和行号吗? – ChiefTwoPencils

+1

@LostReality,如果我误解了最后一条评论,我们查看了应用程序的源代码。所以,我们知道有一个'SimEnvelopeAcceptor'在'Simulator.java'中扩展了'Button'。通过反射,我们可以通过变量名(''envelopeAcceptor“')获得该按钮。如果您无法访问应用程序源代码,仍然可以通过这种方式来完成,但是您不知道该名称,因此您必须将所有代码都弄清楚并弄清楚。此时,最好使用Robot的鼠标移动并进行模拟点击。这可以通过反复试验来完成。 – ChiefTwoPencils

0

您还没有添加任何代码,这样我就可以猜出:

如果你的代码如下MV(V)C模式你不需要通过GUI来测试。您可以直接测试处理重做/撤销的控制器方法,并验证它们是否正确地更改了模型并与撤销/重做堆栈进行通信(是我的世界中的模型的一部分...)。

+0

我愿意测试的软件不是我自己编写的,这个想法实际上是生成各种各样的测试用例,然后在GUI上执行它。在执行这些测试时,应该“记录”GUI的状态以检查应用程序是否具有所需的行为。即在画布上画一个矩形,然后画一个圆,然后撤消两次,然后重做=画布应该包含一个矩形。 – LostReality

相关问题