测试GUI的仍然是一个可怕的任务。有工具可以帮助您跟踪和重放交互式输入。我使用了一些此API(从Perl中盗取的代码)将keypress事件注入到另一个应用程序中(以在firefox中打开一个新的url,而不总是打开一个新的标签)。但是这对测试来说不够好。
先进的工具成本多千美元,并与外部脚本语言和可用性报告分开来。 http://en.wikipedia.org/wiki/List_of_GUI_testing_tools
GUI测试有两个不同的区域。一个是用用户选项填写对话框,另一个是模型/视图测试。
第一个可以用几个编码规则轻松解决。例如,对话框不会修改任何内容,但可以使用所有选项并返回类。在这种情况下,您可以简单地用自己的代码替换对话框代码。这是简单的部分。在我的代码对话框中,修改ini文件设置,然后通过一些提示通知模型有什么变化。
测试视图和模型非常困难。如果是关于绘图,则可以尝试使用WM_PRINT消息来捕获视图,然后运行测试并将其输出与先前捕获的数据进行比较。如果位图相同,则测试通过。我从来没有真正看到这种技术在现实世界中的应用,除了在一个工具包中用于测试多个平台上的像素精确绘图。
接下来是基于交互式代码测试模型。正如之前提到的,关键事件更容易模拟大多数直接转换为分离的命令处理代码的代码,因此您只需测试命令而不是关键事件处理程序。鼠标选择和操作,例如画布上的对象选择要困难得多。可以使用承诺捕获和重放鼠标动作或祈祷的测试工具之一。
取决于您自己的代码库,有很多不同的方法,如果您从MFC抽象得足够好,可以使用模拟GUI对象而不是真正的MFC窗口。如果你已经嵌入了脚本语言,可以帮助你测试的东西等。我很抱歉没有简单的模式。必须逐案决定。
我自己的经验是,我不喜欢单元测试GUI和单元测试。这往往不值得。我使用了Eiffel和Design by Contract(这意味着大量断言),并且与客户进行广泛的beta测试,并让客户找到剩余的错误。无论如何,大多数错误都是无法测试的可用性错误。
不,MVP。模型视图演示者。 – 2011-12-15 16:29:35
Mystere Man是对的我的意思是MVP。但实际上,在这种情况下它是MVP还是MVC并不重要。正如你所说,我不认为Doc/View真的是MVC。我真正希望的是让Doc类作为Presenter或者Controller类来定制模型类,然后通过单元测试Doc类来测试UI逻辑。 – 2011-12-15 16:41:35