在我的代码的计算是经过严格测试的,但因为有这么多的GUI代码,我的总体代码覆盖率低于我想。 有没有对单元测试GUI代码的任何指引? 它甚至有意义吗?
例如,在我的应用程序图。 我一直无法弄清楚如何自动化图的测试。 它需要一个人的眼睛,据我所知,以检查图是正确的。
(我使用的Java Swing)
在我的代码的计算是经过严格测试的,但因为有这么多的GUI代码,我的总体代码覆盖率低于我想。 有没有对单元测试GUI代码的任何指引? 它甚至有意义吗?
例如,在我的应用程序图。 我一直无法弄清楚如何自动化图的测试。 它需要一个人的眼睛,据我所知,以检查图是正确的。
(我使用的Java Swing)
像MVP和MVC设计通常试图抽象尽可能多的逻辑从实际GUI成为可能。 这样做的一个非常受欢迎的文章是“谦卑对话框”由迈克尔羽毛。 就个人而言,我有好有坏的经验与尝试移动逻辑从UI的 - 有时它的工作非常出色,而在其他时候它已经更多的麻烦比它的价值。 这有点我的专业领域之外,但。
当然,答案是使用MVC和移动尽可能多的逻辑出了GUI尽可能的。
话虽这么说,我从同事听说很久以前,当SGI被移植的OpenGL到新的硬件,他们有一堆的单元测试将利用一组primatives的屏幕,然后计算帧缓冲区的MD5总和。 那么这个值可以与已知良好的散列值来快速确定API为每像素准确。
您可以尝试UISpec4J是基于Swing的Java应用程序的开放源代码的功能和/或单元测试库...
下面是一些提示:
尝试从GUI删除最代码,你可以(有控制器,和模型对象),这样你就可以测试他们没有GUI。
对于图形,你应该测试你提供给生成图形代码中的值。
你可以尝试用黄瓜和扫平了简单的英语编写功能验收测试的Swing GUI应用程序。 扫平使用引擎盖下NetBeans的Jemmy库驱动程序。
黄瓜可以让你写这样的测试:
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!"
看看这个扫平视频演示 ,看看它在行动。
有硒RC ,这将自动化测试一个基于Web的用户界面。 它会记录动作和重放。 您仍然需要通过与您的UI交互行走,所以这不会覆盖帮助,但它可以用于自动构建。
测试是一种艺术形式。 我同意逻辑应尽可能去除GUI越好。 然后,我们可以有专注于我们的单元测试。 像其他任何测试都是降低风险。 你不总是需要测试一切,但很多的时候最好的办法是打破在不同的地区不同的测试弥补。
另一个问题是,什么是你真正想要在UI层进行测试。 UI测试是最昂贵的测试,因为它通常需要更长的时间来建立,维护和它是最脆。 如果测试知道坐标的逻辑是企图拉拢你有什么具体测试线之前,是否正确? 如果你想测试一个红色的线图绘制。 你可以给它一组预定坐标和测试,如果某些像素是红色或不红? 作为建议上面位图比较工作,硒,但我的主要重点是,不要过度测试GUI而是测试,这将有助于创建UI逻辑,然后集中在UI上休息的哪一部分或者是嫌疑人,重点测试了一把那里。
您可以使用JFCUnit来测试你的GUI,但图形可能是更具挑战性。 我有一对夫妇的拍摄我的GUI的快照场合和自动比以前的版本。 虽然这并不提供实际的测试,但它如果自动生成未能产生预期的输出提醒你。
我从你收集的问题是,你正在寻找一个自动化的方式来测试您的详细GUI行为,你给的例子是测试是否曲线实际上是正确绘制。
单元测试框架提供了一种方式做自动化测试,但我想你想要做的测试那种复杂集成测试验证的大多数类中,正确的行为中,你的GUI工具包/库的类,你应该不想考。
您的选择在很大程度上取决于你用什么平台/工具包/框架:例如,使用Qt作为其GUI框架的应用程序可以使用挤流自动化的测试。 您确认您的测试结果一次,随后自动执行的测试比较对核实结果的结果。
窗口刺辊的摆动与阿贾克斯
据我所知,这是相当复杂的,实际上取决于语言 - 许多语言都有自己的测试GUI的方式,但如果你真的需要测试的GUI(相对于模拟/ GUI交互),你经常要模拟实际用户点击按钮。 例如,在Eclipse中使用的SWT框架提供了SWTBot , JFCUnit已经提到,Mozilla有自己的XUL模拟这种方式(从我读过关于他们的博客,这些测试似乎相当脆)。
有时你必须采取截图,并测试像素完美呈现(我认为Mozilla的这样做是为了检查是否有正确呈现页) - 这需要一个更长的设置,但可能是您所需要的图形。 这样,当你更新你的代码和测试发生时,您必须手动检查图像如果故障是真实的,或者你提高了图形渲染代码来生成漂亮的图表和需要更新的截图。
如果您使用的秋千, FEST-Swing的是驾驶你的GUI和测试断言是有用的。 这使得它非常简单的测试,比如像“如果我点击按钮A,对话框乙方应显示”或者“如果我从下拉列表中选择选项2,所有的复选框都应该成为取消”。
你提到的图形场景也不是那么容易测试。 这是很容易只是创建和显示他们(也许FEST车驾),以获得GUI组件的代码覆盖率。 然而,在作出有意义的断言是最困难的部分(并且没有有意义的断言代码覆盖率是自欺欺人的运动)。 你怎么测试的图形并没有绘制颠倒,或者过小?
我认为,你必须要接受的GUI的某些方面不能有效地通过自动化单元测试测试,你将不得不对其进行测试在其他方面。
这不是你的工作,以测试GUI库。 所以,你可以躲避责任检查什么是真正绘制在屏幕上,并检查小部件属性,而不是,相信他们准确地代表什么画库。