2011-12-15 49 views
4

这个问题一直在困扰我一段时间。MFC应用程序的任何可测试体系结构或设计模式?

我正在为MFC应用程序寻找可测试的体系结构设计模式。请不要告诉我MFC已经是MVC或类似的东西,因为只要我们无法测试应用程序,它就没有任何意义。

我明白的经验法则是使其视图/文档尽可能愚蠢, 使其他类可测试。但我想了解更多细节。我如何使View/Document尽可能愚蠢并将它们连接到其他可测试类?

首先,我想到了MVP,因为我在Windows .NET和Android应用程序方面取得了一些成功。但在这个MFC的情况下,我们也需要使文档变得愚蠢。这使事情变得复杂。

我需要一个可以长期维护的有效架构。任何有经验的开发人员的建议将不胜感激

回答

0

我不认为你可能需要任何特殊的设计模式来分隔UI的逻辑。 MVP可以提供帮助,但实际上可能并不需要。如果您可以将逻辑分为独立的dll或静态库,并使其可以从其他应用程序访问,则分离足以进行测试。这将是一个很好的开始,可以让你的逻辑可以测试。

但即使在那之前,我会为您的开发环境找到一个好的测试框架。我在Google测试框架或MFC的Boost测试方面取得了一些成功。

至于设计模式,它们非常好,可以使程序维护并最大限度地重用代码,但我不确定使用它们来使程序可测试是一个好习惯。可测试性是您程序的一个很好的属性,但它可能不是您设计的目标。

1

你是说MVC?它在doc/view体系结构中,但控制器部分有些遗漏。你仍然可以完成GUI和数据分离的好事,但将模型和视图分开的真正优点是你可以在其他地方使用它,但是用doc/view来说并不容易。

编辑:附加: 至于测试功能,MFC应用程序随附命令行处理。你可以建立它并从命令提示符发送测试命令到应用程序。

+0

不,MVP。模型视图演示者。 – 2011-12-15 16:29:35

+0

Mystere Man是对的我的意思是MVP。但实际上,在这种情况下它是MVP还是MVC并不重要。正如你所说,我不认为Doc/View真的是MVC。我真正希望的是让Doc类作为Presenter或者Controller类来定制模型类,然后通过单元测试Doc类来测试UI逻辑。 – 2011-12-15 16:41:35

3

测试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测试,并让客户找到剩余的错误。无论如何,大多数错误都是无法测试的可用性错误。