首页 文章

如何对GUI进行单元测试?

提问于
浏览
140

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

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

(我正在使用Java Swing)

12 回答

  • 3

    以下是一些提示:

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

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

  • 6

    像MVP和MVC这样的设计通常会尝试从实际的GUI中抽象尽可能多的逻辑 . 一篇非常受欢迎的文章是Michael Feathers的"The Humble Dialog Box" . 我个人've had mixed experiences with trying to move logic out of the UI - sometimes it'工作得非常好,有时候它是值得的's been more trouble than it' . 但这有点超出了我的专业领域 .

  • 3

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

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

  • 5

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

  • 0

    您可以尝试使用CucumberSwinger以简单的英语为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 video demo就可以看到它的实际效果 .

  • 32

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

  • 6

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

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

  • 2

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

  • 5

    我从你的问题中收集的是你正在寻找一种自动测试你的GUI行为的方法,你给出的例子是测试曲线是否实际绘制得正确 .

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

    您的选择很大程度上取决于您使用的平台/工具包/框架:例如,使用Qt作为其GUI框架的应用程序可以使用Squish自动化其测试 . 您可以验证测试结果一次,然后自动执行的测试将结果与验证结果进行比较 .

  • 63

    Window Licker for Swing&Ajax

  • 0

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

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

  • 10

    如果您使用的是Swing,FEST-Swing对于驱动GUI和测试断言非常有用 . 这使得测试像"if I click button A, dialog B should be displayed"或"if I select option 2 from the drop-down, all the checkboxes should become deselected"这样的东西非常简单 .

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

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

相关问题