测试用JavaSwing编码的应用程序GUI:最佳方法



我必须自动为Java"绘图"应用程序GUI(如ArgoUML/LaTeXDraw等)生成测试。我需要验证测试的应用程序是否正确运行。在我给出的例子中,我需要检查Undo/Redo按钮是否工作良好=Undo将画布置于预处理状态,Redo将其重新置于以前的状态。

我已经知道我将如何处理这个问题,但我想得到经验丰富的人的反馈:

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

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

  • 最后,我从未将机器人"附加"到给定的程序中。可以我只是加载了我想测试的软件的.jar文件并告诉它机器人在窗户上操作?还是我需要与所有原始项目的源文件

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

第页。S: 任何关于我需要做的工作的建议都是受欢迎的:)

我已经完成了您在对另一个答案的评论中解释的内容。

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

根据我的经验,我使用反射来测试实际状态(比如各种组件的文本值),从而找到了主要的切入点。Robot只对我的案例执行关键事件有用。

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

  1. 机器人?-当然,只要它适合你的需要就用它
  2. 在满足要求的同时做最简单的事情。如果可以进行屏幕截图,请进行(使用Robot)。如果您需要更多信息,可以获取JFrameJPanel的组件,并保存所提供的属性
  3. 通过对UI的调查,可以通过多种方式实现这一点。找到按钮并直接在其上执行doClick,用Robot移动鼠标并进行鼠标按压等
  4. 当您实例化一个新的Robot时,它将链接到主设备。在简单的场景中,只需要new Robot().keyPress(KeyEvent.VK_ENTER);

考虑到这一切,也存在像焦点这样的陷阱。最好开始模拟/测试,不要触摸机器的任何外围设备。此外,根据某些方法的运行时间,您可能想要Thread.sleep()(遗憾的是,我们已经这样做了)或使用联接线程。

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

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

最新更新