【问题标题】:Test an application GUI coded with Java Swing : best approach?测试使用 Java Swing 编码的应用程序 GUI:最佳方法?
【发布时间】:2017-01-07 16:17:37
【问题描述】:

我必须为 Java“绘图”应用程序 GUI(如 ArgoUML/LaTeXDraw/etc)自动生成测试。我需要验证测试的应用程序是否正确运行。在我给定的示例中,我需要检查 Undo/Redo 按钮是否正常工作 = Undo 将画布置于之前的状态,Redo 将其再次置于以前的状态。

我已经知道如何解决这个问题,但我希望得到有经验的人的反馈:

  • 我应该使用 Robot 类来模拟 GUI 上的输入吗?或者 有没有更简单的方法?
  • 我需要捕获程序的状态以供以后分析查看 如果程序的状态是一致的,我应该只是截图 窗口或者有没有办法遍历所有 JFrame 组件并捕获它们的属性(它应该包括画布 州)?

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

  • 最后,我从未将机器人“附加”到给定程序。能 我只是加载我要测试和告诉的软件的 .jar 文件 机器人在那个窗口上操作?还是我需要与所有 原始项目的源文件?

感谢您抽出宝贵时间,如果我的问题的任何部分似乎不够清楚,请告诉我,我会尽量解释得更清楚。

P.S: 欢迎任何关于我需要做的工作的建议:)

【问题讨论】:

  • “我必须为 JAVA 自动生成测试” 这样的测试有什么好处?他们真的测试了被测代码 的行为还是测试了测试生成器是否正常工作?我不会依赖这样的测试。
  • 您可以尝试使用 ReTest (retest.de/en),它为功能回归测试和基于 AI 的猴子测试提供了一种有趣的新方法。
  • 这个问题有几个版本——从现在开始,我将把人们推荐给这个Open source tools for automation of Java GUI application testing。它有很好的反响,我想鼓励 Thinking Q/A

标签: java swing user-interface testing


【解决方案1】:

在对另一个答案的评论中,我有 done 你的 explained

Robot 可用于流程的各个部分,但取决于它的编写方式、遵循最佳测试实践的愿望以及整体需求,它可能会很快受到限制。如果不是您编写的,或者最佳编码实践使您无法访问或直接测试应用程序的各个方面,那么其他方式是必要的。

我的经验使我使用反射来测试实际状态(例如各种组件的文本值),从而在主入口点下穿隧道。 Robot 仅对我的案例执行 key events 有用。

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

  1. 机器人? - 当然,根据您的需要使用它。
  2. 在满足要求的同时做最简单的事情。如果可以使用屏幕截图,请执行此操作(使用Robot)。如果您需要更多信息,您可以 get the componentsJFrameJPanel 并保存所提供的任何属性。
  3. 这可以通过对 UI 的调查以多种方式完成。找到按钮并直接在上面做doClick,用Robot移动鼠标并按下鼠标等等。
  4. 当您实例化一个新的Robot 时,它将链接到主设备。在简单的场景中没有什么比new Robot().keyPress(KeyEvent.VK_ENTER);更需要的东西了

鉴于所有这些,存在诸如专注之类的陷阱。最好开始您的模拟/测试,不要触摸机器的任何外围设备。此外,根据某些方法的运行时间,您可能想要Thread.sleep()(我们很遗憾地这样做了)或使用连接线程。

【讨论】:

  • 非常感谢您的回答,这对我帮助很大。但我仍然没有得到你对第三个问题的解释。当您使用 Robot 时,他是如何知道“新文件”按钮位于 JFrame 上的位置 (340,220) 的?您手动为每个按钮指定几何坐标?这是我最担心的......
  • @LostReality,很高兴它有帮助。自从我从事这项工作以来已经大约一年了,所以我不确定您指的是什么。我不记得我们使用坐标来获取组件,我扫描了测试套件和实用程序代码,没有看到类似的东西。如果我们确实在某个地方这样做,那将是通过调查应用程序代码。请告诉我文件和行号吗?
  • @LostReality,如果我误解了最后一条评论,我们查看了应用程序源。所以,我们知道有一个SimEnvelopeAcceptorSimulator.java 中扩展了Button。通过反射,我们能够通过变量名 ("envelopeAcceptor") 获得该按钮。如果您无法访问应用程序源,它仍然可以通过这种方式完成,但您不会知道名称,因此您必须获取所有这些并弄清楚。此时最好使用机器人的鼠标移动并进行模拟点击。这可以通过反复试验来完成。
【解决方案2】:

您没有添加任何代码,所以我只能猜测:

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

【讨论】:

  • 我愿意测试的软件不是我自己写的,真正的想法是生成大量的测试用例然后在GUI上执行。在执行这些测试时,应“记录”GUI 的状态以检查应用程序是否具有所需的行为。即,您在画布中绘制一个矩形,然后是一个圆形,然后撤消两次,然后重做 = 画布应该包含一个矩形。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多