【问题标题】:Any testable architecture or design pattern for a MFC application?MFC 应用程序的任何可测试架构或设计模式?
【发布时间】:2011-12-15 05:28:03
【问题描述】:

这个问题困扰了我一段时间。

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

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

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

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

【问题讨论】:

    标签: c++ design-patterns mfc mvp


    【解决方案1】:

    测试 GUI 的 ist 仍然是一项可怕的任务。有一些工具可以帮助您跟踪和回放交互式输入。我使用其中的一些 API(从 Perl 窃取的代码)将按键事件注入另一个应用程序(在 firefox 中打开一个新 url,而不总是打开一个新选项卡)。但这对于测试来说还不够好。

    高级工具的成本为数公斤,并附带外部脚本语言,可用性报告分为两部分。 http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

    GUI 测试有两个不同的领域。一种是使用用户选项填写对话框,另一种是模型/视图测试。

    第一个可以通过一些编码规则轻松解决。例如,对话框不会修改任何内容,而是获取并返回具有所有选项的类。在这种情况下,您可以简单地用您自己的代码替换对话框代码。这是简单的部分。在我的代码对话框中修改 ini 文件设置,然后通过一些提示通知模型发生了什么变化。

    测试视图和模型要困难得多。如果它是关于绘图的,您可以尝试使用 WM_PRINT 消息来捕获视图,然后运行测试并将其输出与之前捕获的数据进行比较。如果位图相同,则测试通过。我从来没有真正看到过这种技术在现实世界中的应用,除了在一个工具包中,它使用它来测试多个平台上的像素精确绘图。

    接下来是测试基于交互式代码的模型。如前所述,关键事件更容易模拟大多数直接转换为单独的命令处理代码,因此您只需测试命令而不是关键事件处理程序。鼠标选择和操作,例如画布上的对象选择要困难得多。要么使用承诺捕获和重放鼠标动作的测试工具之一,要么祈祷。

    根据您自己的代码库,有许多不同的方法,如果您从 MFC 中抽象出来足以使用模拟 GUI 对象而不是真正的 MFC 窗口。如果您已经嵌入了可以帮助您测试事物等的脚本语言。对不起,没有简单的模式。必须根据具体情况来决定。

    我自己的经验是,我根本不喜欢单元测试 GUI 和单元测试。这往往不值得花时间。我正在使用 Eiffel 和按合同设计(这意味着很多断言语句)并与客户进行广泛的 beta 测试并让客户找到剩余的错误。无论如何,大多数错误都是无法测试的可用性错误。

    【讨论】:

    • 感谢您的意见。我实际上也对单元测试 GUI 不感兴趣。但喜欢在将逻辑与 GUI 分离后对逻辑进行单元测试。这就是我正在寻找架构解决方案(或设计模式)的原因 您是否尝试过使用 MFC 应用程序的 MVP?
    • 如果您已将其与 GUI 隔离开来,它就像在任何其他程序中一样进行数据处理和测试。学习编程。我不明白这种关于模式的炒作。模式是在一个通用名称下共享的经验。如果您的问题域与“我如何测试程序?”一样大。唯一的模式是“具有编程技能”。因此,如果您想要任何“模式”,请更准确地询问。
    • 什么炒作?我只是在询问编码的良好实践。如果你不知道,请不要回答。不要给我被动攻击性的bs。
    【解决方案2】:

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

    编辑:添加: 至于测试能力,MFC 应用程序自带命令行处理。您可以在此基础上构建并从命令提示符向应用程序发送测试命令。

    【讨论】:

    • 不,MVP。模型视图演示器。
    • 神秘人是对的,我的意思是 MVP。但实际上在这种情况下它是 MVP 还是 MVC 并不重要。正如您所说,我认为 Doc/View 并不是真正的 MVC。我真正希望的是通过自定义模型类让 Doc 类充当 Presenter 或 Controller 类,然后通过单元测试 Doc 类来测试 UI 逻辑。
    【解决方案3】:

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

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

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

    【讨论】:

      最近更新 更多