我怎样才能testingGUI?

在我的代码中的计算是经过充分testing,但由于有这么多的GUI代码,我的整体代码覆盖率低于我想要的。 有unit testingGUI代码的指导吗? 这是否有道理?

例如,我的应用程序中有graphics。 我还没有弄清楚如何自动化图表的testing。 这需要人眼AFAIK来检查图表是否正确。

(我正在使用Java Swing)

像MVP和MVC这样的devise通常尽可能地从实际的GUI中抽象出尽可能多的逻辑。 一篇非常受欢迎的文章是Michael Feathers的“谦逊的对话框” 。 就我个人而言,我尝试将逻辑从用户界面中移出,这有着不同的经验 – 有时候它运行得非常好,而在其他时候,这样做的麻烦比它的价值更大。 虽然这在我的专业领域之外。

当然,答案是使用MVC并尽可能多地从GUI中移出逻辑。

话虽如此,我很久以前从一位同事那里听说,当SGI将OpenGL移植到新的硬件上时,他们进行了一系列的unit testing,在屏幕上绘制一组主元素,然后计算MD5的帧缓冲区总和。 然后可以将该值与已知的良好散列值进行比较,以快速确定API是否是每像素精确的。

您可以尝试UISpec4J是一个基于Swing的Java应用程序的开源function和/或unit testing库。

您可以尝试使用Cucumber和Swinger以纯英文为Swing GUI应用程序编写function验收testing。 Swinger使用引擎盖下的Netbeans Jemmy库来驱动应用程序。

黄瓜允许你写这样的testing:

Scenario: Dialog manipulation Given the frame "SwingSet" is visible When I click the menu "File/About" Then I should see the dialog "About Swing!" When I click the button "OK" Then I should not see the dialog "About Swing!" 

看看这个Swingervideo演示 ,看看它在行动。

这里有一些提示:

尝试从GUI中删除大部分代码(包含控制器和模型对象),这样您就可以在没有GUI的情况下testing它们。

对于graphics,您应该testing您提供给生成graphics的代码的值。

有Selenium RC ,它将自动testing基于Web的用户界面。 它会logging操作并重播它们。 您仍然需要浏览与您的用户界面的交互,因此这不会影响覆盖范围,但可以用于自动构build。

testing是一种艺术forms。 我同意这个逻辑应该尽可能的删除GUI。 然后我们可以把我们的unit testing集中在那 像其他任何testing一样,都是为了降低风险 你并不总是需要testing一切,但最好的事情是打破不同地区的不同testing。

另一个问题是你真的想在UI层testing什么。 UItesting是最昂贵的testing,因为它通常需要更长的时间来创build,维护,而且是最脆弱的。 如果在试图绘制线之前testing逻辑知道坐标是否正确,那么具体testing什么? 如果你想testing一个红线的graphics绘制。 你可以给它一个预定的坐标,并testing某些像素是红色还是不红色? 正如上面提到的位图比较工作,selenium,但我的主要重点不是过度testing的GUI,而是testing的逻辑,将有助于创build用户界面,然后专注于什么部分的用户界面打破或怀疑和集中一些testing那里。

您可以使用JFCUnit来testing您的GUI,但graphics可能更具挑战性。 我有几次拍摄了我的GUI的快照,并自动将它与以前的版本进行比较。 虽然这不提供实际testing,但如果自动构build未能产生预期的输出,它会提醒您。

我从你的问题中收集到的是,你正在寻找一种自动的方式来testing你的GUI行为的细节,你给的例子是testing曲线是否实际绘制正确。

unit testing框架提供了一种自动化testing的方法,但是我认为你要做的testingtypes是复杂的集成testing,它可以validation多个类的正确行为,其中你的GUI工具包/库类的类不应该想testing。

您的select很大程度上取决于您使用的平台/工具包/框架:例如,使用Qt作为GUI框架的应用程序可以使用Squish来自动化testing。 您一次validationtesting的结果,随后自动执行的testing将结果与validation的结果进行比较。

Swing&Ajax的Window Licker

从我所知道的,这是相当复杂的,真的取决于语言 – 许多语言有自己的GUItesting方式,但如果你真的需要testingGUI(而不是模型/ GUI交互),你经常不得不模拟实际用户点击button。 例如,Eclipse中使用的SWT框架提供了SWTBot , JFCUnit已经被提及,Mozilla在XUL中有自己的模拟方法(从我在他们的博客上看到的这些testing看起来非常脆弱)。

有时你必须截图,并testing像素完美的渲染(我相信Mozilla这样做是为了检查正确渲染的页面) – 这需要更长的设置,但可能是你需要的图表。 这样,当您更新代码并且testing中断时,如果失败是真实的,则必须手动检查图像,或者您改进了graphics渲染代码以生成更漂亮的graphics并需要更新屏幕截图。

如果您正在使用Swing, FEST-Swing对于驱动GUI和testing断言很有用。 它使得testing诸如“如果我点击buttonA,应该显示对话框B”“如果我从下拉列表中select选项2,所有checkbox应该被取消select”这样的事情变得非常简单。

你提到的图情景不是很容易testing。 通过创build和显示GUI组件来获得GUI组件的代码覆盖非常容易(也许可以用FEST来驱动它们)。 然而,做出有意义的断言是困难的部分(没有有意义的断言的代码覆盖是自欺欺人的行为)。 你如何testing这个图表是不是倒置的,还是太小?

我认为你只需要接受GUI的某些方面不能通过自动unit testing来有效地testing,而且你将不得不以其他方式进行testing。