【问题标题】:Best practices with Unit testing on Third Party software API's (AutoCAD)对第三方软件 API (AutoCAD) 进行单元测试的最佳实践
【发布时间】:2010-10-06 22:02:52
【问题描述】:

我们正在开发在 AutoCAD 中使用的应用程序。 基本上我们创建一个类库项目,并在 AutoCAD 中使用命令 (NETLOAD) 加载 .dll。

因此,我们可以使用命令、“调色板”、用户控件、表单等...

AutoDesk 通过一些 dll 提供 API,在它们的程序目录中运行。 引用这些 dll 时,您只能在运行时调用 dll,同时在 AutoCAD 中加载您的应用程序(这是 AutoDesk 的许可安全)。

对我们来说,在开发过程中,这不是问题,我们需要在 AutoCAD 的上下文中进行可视化测试,因此我们只需设置 Debug Properties 以便它们启动 acad.exe 并使用 acad 中的脚本加载我们的 dll .exe 参数。

问题是,当尝试对我们的代码进行单元测试时,NUnit 或 mstest 没有在 AutoCAD 上下文中运行,它们也无法启动它。 有一个工具叫 Gallio,它提供了与 AutoCAD 的接口,因此它可以通过 IPC 和 Named Pipes 运行单元测试。

但是,对我来说,这个解决方案太麻烦了。我希望能够快速编写测试,而不必离开我心爱的 IDE。

那么,从“良好的设计观点”来看,什么是解决这个问题的好方法?我想我基本上需要一个不引用 AutoCAD dll 的可测试代码库和一个引用不可测试 AutoCAD dll 的不可测试代码库。

我确信有办法让它工作:(IOC、DI、适配器模式,..)我只是没有深入了解这些原则,因此我不知道哪条路线最适合我的目的和目标。

【问题讨论】:

    标签: unit-testing design-patterns architecture autocad


    【解决方案1】:

    我写了……后来打破了……一个 AutoCAD 的测试运行器。它位于https://github.com/CADbloke/CADtest。如果您对它感兴趣,请轻推我,我会更快地修复它。我正在等待 NUnit v3 发布,然后再处理它。

    如果您重置到该仓库中的第三次提交(我认为)并从那里摆弄它应该运行。

    【讨论】:

      【解决方案2】:

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

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

      1. 您的代码用来实现某事(例如,加载绘图)的一组接口。

      2. 一组调用 AutoCAD dll 的接口的实现。

      3. 一组在 AutoCAD 上下文中尝试实现的类。只需创建一个带有几个按钮的小型 UI,您可以在其中运行此代码。它用于向自己保证您的模型做正确的事情。将方法参数和结果记录到某个文件中,以便您可以尝试 AutoCAD 的响应方式。如果模型损坏,您可以使用此代码来验证 AutoCAD 正在做什么,并且可以在开发模型时将其用作参考。

      4. 当您知道 AutoCAD 如何响应时,创建模型。在您的测试中,使用所需的结果(和错误,以便您也可以测试错误处理)来创建它们。因此,当您拥有boolean loadDrawing(File filename) 时,请创建一个模型,该模型返回文件名exists.dxftrue 和其他任何内容的false

      5. 使用工厂或 DI 告诉您的应用程序代码使用哪个实现。我倾向于拥有一个大型的全局配置类,其中包含许多公共字段,我只是在其中存储要使用的对象。我可以在一开始就设置它,它很快,很容易理解。如果您需要在运行时创建对象,则将工厂放在为您生成对象的配置类中,这样您就可以将它们交换出去。

      【讨论】:

      • 感谢您的回答。我会朝那个方向看。我确实对您的 3d 评论有疑问:因为我们不是简单地打开文件,而是使用事务、编辑对象等......那么我应该为每个 Acad 对象创建一个包装器吗?
      • @Bertvan:找到这个问题的答案:您有多确定您的代码会因每个 ACAD 对象而中断?如果不确定,请编写测试。当它变得无聊时,停止。当您发现新错误并再次不确定时,请添加更多测试。你必须找到你的最佳路径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多