我的代码中的计算经过了充分测试,但由于GUI代码太多,我的整体代码覆盖率低于我的预期。有关单元测试GUI代码的指南吗?它甚至有意义吗?

例如,我的应用中有图表。我无法弄清楚如何自动化测试图形。需要人眼AFAIK来检查图表是否正确。

(我正在使用Java Swing)

有帮助吗?

解决方案

像MVP和MVC这样的设计通常会尝试从实际的GUI中抽象尽可能多的逻辑。一篇非常受欢迎的文章是 Michael Feathers撰写的“The Humble Dialog Box”。就个人而言,我尝试将逻辑移出用户界面时遇到了不同的经验 - 有时候它的效果非常好,而有时它却比它的价值更麻烦。但这有点超出了我的专业领域。

其他提示

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

话虽这么说,很久以前我从一位同事那里听到,当SGI将OpenGL移植到新硬件时,他们进行了一系列单元测试,可以在屏幕上绘制一组灵长类动物,然后计算MD5的总和。帧缓冲区。然后可以将此值与已知良好的哈希值进行比较,以快速确定API是否按像素精确。

您可以尝试 UISpec4J 是基于Swing的Java应用程序的开源功能和/或单元测试库...

以下是一些提示:

尝试从GUI(拥有控制器和模型对象)中删除尽可能多的代码,这样您就可以在没有GUI的情况下测试它们。

对于图形,您应该测试您为生成图形的代码提供的值。

您可以尝试使用黄瓜 Swinger 用于为Swing GUI应用程序用简单的英语编写功能验收测试。 Swinger使用Netbeans的Jemmy库驱动应用程序。

Cucumber允许你编写这样的测试:

 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!"

看看这个 Swinger视频演示,看看它在行动。

Selenium RC ,它将自动测试基于Web的UI。它将记录动作并重放它们。您仍然需要完成与UI的交互,因此这对覆盖率没有帮助,但它可以用于自动构建。

测试是一种艺术形式。我同意逻辑应该尽可能地删除GUI。然后我们可以将重点放在那里。像其他测试一样,关于降低风险。你不总是需要测试所有东西,但很多时候最好的办法就是打破不同区域的不同测试。

另一个问题是你真正想要在UI层测试什么。 UI测试是最昂贵的测试,因为它通常需要更长的时间来创建,维护并且最脆弱。如果您在尝试绘制线之前测试逻辑以确定坐标是否正确,那么您具体测试的是什么?如果要测试带有红线的图形。你能给它一套预定的坐标并测试某些像素是红色还是不红色?正如上面提到的位图比较工作,Selenium但我主要关注的不是过度测试GUI,而是测试有助于创建UI的逻辑,然后关注UI的哪些部分中断或怀疑并集中一些测试那里。

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

我从您的问题中收集到的是,您正在寻找一种自动测试GUI行为的方法,您提供的示例是测试曲线是否实际绘制正确。

单元测试框架提供了一种自动化测试的方法,但我认为您要做的测试类型是复杂的集成测试,可以验证多个类的正确行为,其中包括GUI工具包/库的类,你不应该测试。

您的选择非常依赖于您使用的平台/工具包/框架:例如,使用Qt作为其GUI框架的应用程序可以使用Squish自动化其测试。验证测试结果一次,随后自动执行的测试将结果与验证结果进行比较。

Window Licker for Swing& Ajax的

据我所知,这很复杂,而且真的取决于语言 - 许多语言都有自己的GUI测试方式,但如果你真的需要测试GUI(而不是模型/ gui交互),那么你通常需要模拟实际用户点击按钮。例如,Eclipse中使用的SWT框架提供了 SWTBot JFCUnit ,Mozilla有自己的方式在XUL中模拟这个(以及我在他们的博客上看到的,这些测试似乎非常脆弱。)

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

如果您使用Swing, FEST-Swing 对于驱动您的GUI非常有用并测试断言。它可以非常简单地测试像这样的东西,如果我点击按钮A,对话框B应该显示“”如果我从下拉列表中选择选项2,所有的复选框应取消选择“

您提到的图表方案并不容易测试。只需创建和显示GUI组件(并且可能使用FEST驱动它们),就很容易获得GUI组件的代码覆盖率。然而,做出有意义的断言是困难的部分(没有有意义的断言的代码覆盖是一种自我欺骗的练习)。你如何测试图表是否被颠倒或过小?

我认为您必须接受GUI的某些方面无法通过自动化单元测试进行有效测试,并且您必须以其他方式测试它们。

测试GUI库不是你的工作。因此,您可以避免检查屏幕上实际绘制的内容并检查窗口小部件的属性,相信库可以准确地表示绘制的内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top