如何对GUI进行单元测试?

Ste*_*eod 151 unit-testing code-coverage

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

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

(我正在使用Java Swing)

Jon*_*eet 67

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

  • 镜像:[简陋的对话框](http://web.archive.org/web/20110721175855/http://www.objectmentor.com/resources/articles/TheHumbleDialogBox.pdf) (16认同)
  • 仍然,表示逻辑将在GUI中.有时,这可能远非微不足道 (14认同)

dic*_*oce 37

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

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

  • @ SyntaxT3rr0r:在这种类型的非安全相关应用程序中,您会推荐哪种哈希函数,与MD5相比,可以获得什么样的性能提升? (24认同)
  • danatel你错过了这一点.OpenGL是一种像素精确的图形渲染API.像Qt这样的GUI应用程序框架将高度依赖于系统镶边,因此散列帧缓冲区不是一个好方法. (7认同)
  • 我喜欢这种方法.设置和维护繁琐,但它会给我我需要的回归测试功能. (3认同)

CMS*_*CMS 10

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

  • 我已经开始使用UISpec4J一个月左右来对Java Swing GUI进行需求验证测试.到目前为止,我一直很喜欢它. (2认同)

Dem*_*ema 7

您可以尝试使用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!"
Run Code Online (Sandbox Code Playgroud)

看看这个Swinger视频演示,看看它的实际运行情况.


Pat*_*ins 6

以下是一些提示:

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

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


Dav*_*ins 6

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


小智 6

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

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