MFC应用程序的任何可测试架构或设计模式?

时间:2011-12-15 05:28:03

标签: c++ design-patterns mfc mvp

这个问题一直困扰着我。

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

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

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

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

3 个答案:

答案 0 :(得分: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测试,并让客户找到剩余的错误。无论如何,大多数错误都是不可测试的可用性错误。

答案 1 :(得分:1)

你的意思是MVC?它位于doc / view架构中,但控制器部分有些缺失。您仍然可以实现将GUI与数据分离的好东西,但是将模型与视图分离的真正优势在于您可以在其他地方使用它,但至少可以说doc / view并不容易。

修改:添加: 至于测试功能,MFC应用程序带有命令行处理。您可以构建它并从命令提示符向应用程序发送测试命令。

答案 2 :(得分:0)

我认为您可能不需要任何特殊的设计模式来将逻辑与UI分开。 MVP可以提供帮助,但实际上可能没有必要。如果您可以将逻辑分成单独的dll或静态库并使其可以从其他应用程序访问,那么分离就足以进行测试。这将是一个良好的开端,几乎可以让你的逻辑变得可测试。

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

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