单元测试用户界面。什么是有效的方法?

时间:2010-05-17 15:05:37

标签: .net winforms unit-testing

我有一个会计&工资单客户端/服务器应用程序,其中有多个具有复杂数据验证规则的输入表单。我正在寻找一种有效的方法来执行用户界面的单元测试。

对于复杂的验证规则,我的意思是:

  • “如果我在文本字段Y中插入值,则禁用按钮X”
  • “如果我在文本字段中插入值,则启用组合框” ...... ......

我发现的最有希望的模式是M. Fowler(http://martinfowler.com/eaaDev/ModelViewPresenter.html)建议的。

您对用户界面的单元测试有什么经验吗?作为我正在使用的技术堆栈:.NET 3.5& Windows窗体小部件库。

5 个答案:

答案 0 :(得分:5)

我不会完全称之为“单元测试”,但我在使用WatiN在Web UI中运行自动化测试以及使用WatiN进行自动化测试方面取得了一定程度的成功。

假设您可以获得要测试的应用程序窗口的句柄,您应该能够编写大量C#代码来测试用户界面的功能。

许多人谴责尝试针对UI运行自动化测试的想法,因为有太多的东西你无法以这种方式进行测试。例如,没有自动化测试会注意到字体是丑陋的,或者某些文字令人困惑,或者按钮略微偏离中心。毫无疑问,对于这些类型的东西,你肯定需要一个聪明的人在看屏幕。

然而,除了这种类型的测试之外,肯定会有大量重复测试,可以自动执行并定期执行。大多数大型应用程序都有一整套回归测试脚本,必须在新版本发布时手动执行。这些测试通常是你可以训练猴子做的事情,只需点击此链接的说明列表,输入一些文本,点击此按钮,检查结果消息等。这些都是你QA测试人员的时间浪费,让他们痛苦,所以如果他们可以自动化,很棒。这些类型的测试应该能够每天由构建服务器自动运行,并且可以比任何手动测试更加彻底。

同样,它不会发现奇怪的意外事情,但它会给你一定程度的信心,你的小改变不会破坏你在应用程序另一端从未听说过的其他屏幕。

当然,这会为开发人员带来更多持续的工作,因为对应用程序的微小更改可能会因为任何自动化测试而愚蠢地破坏测试,但它应该为您节省大量的测试和调试时间。这对你来说是否值得你决定,但我认为这是一个不应该像你平常那样迅速被解雇的考虑因素。

答案 1 :(得分:3)

用户界面测试很难,通常最好在比单元测试更高的测试级别上完成。

使用Martin Fowler建议的MVC / MVP分离来测试控制器和逻辑是一个很好的开始,但是您经常需要使用WinRunner或QTP等自动化工具来增强这一点,以便以自动方式完全测试UI。

答案 2 :(得分:1)

根据定义,单元测试不太适合测试接口。单元测试应该测试单个实体的后端功能。对于功能测试,请获取这样做的框架。考虑像Mercury(现在的HP)Quality Center或Performance Center这样的东西。如果您的预算有限,请尝试使用Selenium。

功能测试是单元测试的一个步骤,不应该与彼此混淆。

答案 3 :(得分:1)

  

对于复杂的验证规则,我的意思是:

* "Disable button X if I Insert a value in textfield Y"

这些规则测试模型和视图,这就是让它们变得艰难的原因。相反,验证当您在文本字段Y中插入值时,模型将获取该值;具有空Y的模型具有X_ENABLED == false,而具有非空Y的模型具有X_ENABLED == true;并且,如果模型的X_ENABLED == true,则启用View的按钮。这些测试中只有两个涉及UI,它们应该非常简单,几乎不会失败。将复杂的逻辑放入容易测试的模型中。

答案 4 :(得分:0)

正如其他人所说的,Untit测试UI是一种痛苦。我只想补充一点,Team Foundation 2010的新Test & Lab Manager功能是一种很好的方法,既可以手动测试UI,也可以自动化后续测试。在运行测试时,它足够聪明地识别GUI结构,至少对于WinForms,WPF和网站来说。