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

时间:2009-02-11 14:01:31

标签: unit-testing design-patterns architecture autocad

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

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

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

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

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

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

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

我确信有办法让这个工作:(IOC,DI,Adapter Pattern,...)我只是不深入这些原则,因此我不知道哪条路线最适合我的目的和目标。

2 个答案:

答案 0 :(得分:8)

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

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

  1. 代码用于实现某些功能的一组接口(例如,加载图形)。

  2. 用于调用AutoCAD dll的所述接口集的一组实现。

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

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

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

答案 1 :(得分:0)

我写了...后来打破了...一个AutoCAD的测试运行器。它位于https://github.com/CADbloke/CADtest。如果你对它感兴趣的话,那就推动我,我会更快地解决它。在我解决之前,我正在等待NUnit v3发布。

如果您重置为该回购中的第3次提交(我认为)并从那里调整它应该运行。