【问题标题】:How do you Unit Test an .EXE with 3rd party dll?您如何使用第 3 方 dll 对 .EXE 进行单元测试?
【发布时间】:2009-02-03 03:00:33
【问题描述】:

我仍在学习 TDD 的黑暗艺术,最近 I've been trying to learn how to do TDD in VB6 我基本上将列表缩小到免费的 simplevbunit 和最昂贵的 vbunit3。

我的应用程序是一个包含大量 3rd 方 dll 的富文本编辑器,我在 Google 中四处寻找如何对这个 exe 文件进行单元测试。

所以我的问题是如何对 exe 文件进行单元测试?特别是在 VB6 的上下文中,如果你有任何关于 vbunit3 或 simplevbunit 的好例子,你只是一个救生员,因为我现在正沉浸在材料中,我仍然无法编写一个单元测试:(

编辑

实际上该应用程序由许多表单、模块和类模块组成,当我编译它时,它当然会变成很好的打包好的 .EXE 文件。为了让事情变得更复杂,还有很多全局变量。

但我的主要目的是对代码的所有或最易损坏的部分进行单元测试。而且我想确保我可以将测试和代码分开。所以我认为最好的方法是,以某种方式通过添加引用等方式直接测试 exe。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: unit-testing vb6 tdd simplyvbunit


    【解决方案1】:

    单元测试和集成测试是有区别的。您不对可执行文件进行单元测试。您可以对小型、独立的计算单元进行单元测试,例如方法或过程,具体取决于您使用的语言。集成测试将测试更大的组件,如 API、第三方组件甚至可执行文件,以确保它们对于给定的一组输入(好或坏)按预期工作。虽然您可以使用单元测试工具对 API 或插件组件进行一些集成测试,但我认为您不会找到很多用于测试可执行文件的单元测试工具。还有其他类型的测试工具会在这方面做得更好。简单地编写提供不同类型输入的脚本并检查它们的输出对于许多场景可能就足够了。

    如果您想了解有关 TDD 和单元测试的更多信息,您应该将其应用到 VB6 中的函数或过程中——不过,我推荐使用 VB.NET(或 C#)并进行面向对象的开发。这些工具通常面向 OO 风格的编程。

    【讨论】:

    • @tvan,但是我所有的函数都是在 exe 中编译的,那么我该如何测试 exe 中的那些函数呢?谢谢。
    • 编译前测试。当我编写一个程序时,我有一个项目,它是一个包含我所有功能的类库。我有另一个包含单元测试的项目。单元测试项目类使用单元测试工具中的测试运行器运行,并测试库类而不是 exe。
    • -1 没有回答他关于测试驱动开发的问题。这涉及到集成和单元测试的混合。不要那么教条。
    • @RS -- 鉴于标题,单元测试是什么似乎有些混淆。我选择尝试澄清而不是添加它。当然,使用 TDD 的项目中有很多非单元测试——验收测试、性能测试。只需先编写测试,推动开发。
    • 这种一般性的回答让他在寻找如何在 Visual BASIC 6 中使用 TDD 时走错了路。注意第一条评论重复了关于 EXE 的问题。
    【解决方案2】:

    VB 中的 ActiveX 控件非常节省时间,但它们是有效的测试驱动开发的祸根。

    为了在理想情况下有效地测试整个 VB6 应用程序,您需要设计一个 EXE 是 ActiveX DLL 之上的薄壳来完成所有工作的设计。表单实现了一个接口并在 DLL 中注册了它们自己。因此,如果您有 Order Entry Form,它将实现 IOrderEntryForm 接口,并且它的事件将调用位于 MyAppUI 对话框中的 OrderEntry 类上的方法。

    为了强调在 Visual Basic 6 中,FORMS 可以实现一个接口。然后表单在其 LOAD 事件中向 UI 类注册自身。表单的事件(如 MyButton_Click)调用 UI 类上的方法。 UI 类使用表单接口的方法来更改显示的内容。这是额外的工作,但它节省了大量的测试时间。还可以进行维护,因为只要实现的界面保持不变,您就可以更改表单的外观。

    这也意味着之前你有类似MYEXE->MyActiveXDLL 的东西会变成MYEXE->MyUIDLL->MyActiveXDLL。

    对于您的测试环境,您创建一个 ActiveX DLL,它通过创建实现各种表单界面的类来模拟 UI。 UI DLL 不知道其中的区别,您可以完全控制发送的输入和读取的内容。

    请注意,这种类型的设计模式是在here 讨论的。我用它作为开发和维护我公司的金属切削机床 CAD/CAM 应用程序的基础。

    第三方 ActiveX 控件是该方案的祸根。这是因为执行繁重工作的代码在控件本身内部。 ActiveX 控件越复杂,问题就越严重。我公司的趋势是减少对第三方控制的依赖,转而支持内部应用程序。

    但是,与任何算法和设计模式一样,这涉及到判断调用。在涉及富文本控件的软件领域中,您遇到了多少问题。如果数量不多,那么您可能可以使用手动或自动测试脚本(即向应用程序发送击键)并使用单元测试框架来完成其余部分。

    在整个应用程序中使用单元测试的关键是尽可能多地在接口后面填充它。只需做你现在能做的,并记下你在未来开发时想要改变的领域。如果您没有立即获得 100% 的覆盖率,甚至没有为明年提供保障,请不要绝望。

    【讨论】:

    • 听起来很有趣!希望我的新手 vb6 技能足以让我度过难关。谢谢。
    • 根据您在 tvan 中的 cmets 回答,我认为您在这方面做得很好。只需制作两个测试项目(EXE 和 ActiveX DLL),即可掌握在表单中使用 implements 关键字的窍门。
    【解决方案3】:

    另一种使用方法是让您的应用程序成为 ActiveX EXE。然后,您的单元测试应用程序可以引用您的应用程序,就好像它是一个 ActiveX DLL。自从我上次使用 VB6 以来,您需要进行大量研究才能使其正常工作,并且我确信有一些技巧可以使其正常工作。

    【讨论】:

    • 听起来很有趣,但我想我可能需要查看一些代码示例来了解如何执行此操作。现在是谷歌搜索时间。谢谢:)
    【解决方案4】:

    关于我可能能够提供的唯一有用的建议是拿起 Michael Feathers Working Effectively with Legacy Code。我认为您最大的挑战将是您的工具集,因为我知道用于 VB6 单元测试的工具并没有那么强大。

    您也可以尝试在TDD Yahoo! List 上提问,因为我知道那里至少有几个人在使用 vbunit3。

    【讨论】:

    • 也许链接到亚马逊或其他地方的书?
    • 完成。感谢您的建议。
    【解决方案5】:

    当然,您可以对单个 EXE 进行单元测试。看看有多少应用程序由多个 EXE 组成。

    对于第 3 方组件,您如何使用标准 VB6 组件进行测试?其他 MS 组件?第 3 方组件也是如此。

    【讨论】:

    • 我同意理论上 .exe 或 .out 文件是“单位”,您可以对其进行测试。我相信人们更希望执行脚本理论而不是“单元测试”,因为它有点与敏捷 xUnit 测试理念相冲突。
    【解决方案6】:

    让事情变得更多 复杂的有不少 飞来飞去的全局变量。

    第一个重构是将全局变量转移到 ActiveX DLL 中的类。该类的实例化属性需要设置为 GLOBAL MULTIUSE。将 EXE 设置为引用 ActiveX 时,变量仍然是全局变量,但是当您取出 EXE 以将其替换为测试工具时,工具可以访问全局变量。

    完成测试后,您可以进行进一步的重构以减少全局变量的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多