unit-testing - 在第三方软件 API (AutoCAD) 上进行单元测试的最佳实践

标签 unit-testing design-patterns architecture autocad

我们正在开发在 AutoCAD 中使用的应用程序。
基本上我们创建一个类库项目,并使用命令 (NETLOAD) 在 AutoCAD 中加载 .dll。
因此,我们可以使用命令、“调色板”、用户控件、表单等......
AutoDesk 通过在其程序目录中运行的某些 dll 提供 API。
引用这些 dll 时,您只能在运行时在 AutoCAD 中加载应用程序时调用 dll(这是 AutoDesk 的许可安全性)。
对我们来说,在开发过程中,这不是问题,我们需要在 AutoCAD 的上下文中进行可视化测试,所以我们只需设置 Debug Properties 以便它们启动 acad.exe 并在 acad.exe 参数中使用脚本加载我们的 dll .
问题是,当尝试对我们的代码进行单元测试时,NUnit 或 mstest 没有在 AutoCAD 上下文中运行,它们也无法启动它。
有一个叫做 Gallio 的工具,它提供了一个与 AutoCAD 的接口(interface),因此它可以通过带有命名管道的 IPC 运行单元测试。
然而,这个解决方案对我来说太麻烦了。我希望能够快速编写测试而不必离开我心爱的 IDE。
那么,从“好的设计观点”来看,什么是解决这个问题的好方法?我想我基本上需要一个不引用 AutoCAD dll 的可测试代码库和一个引用不可测试的 AutoCAD dll 的不可测试代码库。
我确信有办法让它发挥作用:(IOC、DI、适配器模式……)我只是没有深入了解这些原则,因此我不知道哪条路线最适合我的目的和目标。

最佳答案

第一步是对需要 AutoCAD 的部件和真正独立的部件的代码进行分类。像往常一样为独立部分创建单元测试。

对于其他部分,您需要行为类似于 AutoCAD 的模型。使它们尽可能简单(例如,只在方法中返回正确答案而不进行任何计算)。现在,您需要几组类:

  • 您的代码用来实现某事(例如,加载绘图)的一组接口(interface)。
  • 一组用于调用 AutoCAD dll 的接口(interface)集的实现。
  • 一组在 AutoCAD 上下文中尝试实现的类。只需创建一个带有几个按钮的小型 UI,您就可以在其中运行此代码。它用于让自己放心,您的模型做正确的事情。将方法参数和结果记录到某个文件中,以便您可以尝试 AutoCAD 的响应方式。如果模型损坏,您可以使用此代码来验证 AutoCAD 正在做什么,并且您可以在开发模型时将其用作引用。
  • 了解 AutoCAD 的响应方式后,即可创建模型。在您的测试中,使用所需的结果(和错误,以便您也可以测试错误处理)创建它们。所以当你有 boolean loadDrawing(File filename) , 创建一个返回 true 的模型对于文件名 exists.dxffalse对于其他任何事情。
  • 使用工厂或 DI 告诉您的应用程序代码使用哪个实现。我倾向于拥有一个包含许多公共(public)字段的大型全局配置类,我只是在其中存储要使用的对象。我可以在开始时设置它,它很快,很容易理解。如果您需要在运行时创建对象,那么将工厂放在为您生成对象的配置类中,以便您可以将它们交换出去。
  • 关于unit-testing - 在第三方软件 API (AutoCAD) 上进行单元测试的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/536895/

    相关文章:

    c# - wcf 决定 : one service multiple contracts or many services

    swift - 连续的单元测试失败,尽管它们单独成功

    swift - UI 测试包标识符和代码覆盖率

    design-patterns - 将主体映射到观察者 - 观察者模式 GoF 书籍

    c# - 静态事件的更好替代方案

    android - x 分钟后自动重新打开 android/ios 应用程序

    Android 架构问题

    python - 在 Django 自定义管理命令中测试输入消息文本和答案

    javascript - 单元测试javascript代码风格

    java - 创建给定格式的三角形序列...为什么我的三角形不会显示