unit testing - tipos - Mejores prácticas con pruebas unitarias en API de software de terceros(AutoCAD)
pruebas unitarias java (2)
Estamos desarrollando aplicaciones para su uso dentro de AutoCAD. Básicamente, creamos un proyecto de biblioteca de clases y cargamos el .dll en autoCAD con un comando (NETLOAD).
Como tal, podemos usar comandos, "paletas", controles de usuario, formularios, etc.
AutoDesk proporciona una API a través de algunos dll, ejecutándose en su directorio de programa. Al hacer referencia a estos dll, solo puede llamar al dll en tiempo de ejecución mientras carga su aplicación en AutoCAD (esta es una seguridad de licencia de AutoDesk).
Para nosotros, durante el desarrollo, esto no es un problema, tenemos que probar visualmente en el contexto de AutoCAD, así que simplemente configuramos las propiedades de depuración para que comiencen acad.exe y carguen nuestra dll con una secuencia de comandos en los parámetros acad.exe .
El problema es que, al intentar probar nuestro código en unidades, NUnit o mstest no se ejecutan desde el contexto de AutoCAD y tampoco pueden iniciarlo. Existe una herramienta llamada Gallio, que ha proporcionado una interfaz con AutoCAD, por lo que puede ejecutar la prueba unitaria a través de IPC con Canalizaciones con nombre.
Sin embargo, esta solución es, para mí, demasiado molesta. Quiero poder escribir pruebas rápidamente sin tener que abandonar mi querido IDE.
Entonces, ¿qué, desde una "buena vista de diseño" sería un buen enfoque para este problema? Estoy pensando que básicamente necesitaría una base de código comprobable que no haga referencia a los dll de AutoCAD y una no verificable que haga referencia a los dll de AutoCAD no comprobables.
Estoy seguro de que hay formas de hacer que esto funcione: (IOC, DI, Adapter Pattern, ...) Simplemente no conozco estos principios en profundidad y, por lo tanto, no sé qué ruta se adaptará mejor a mis propósitos y metas.
El primer paso es clasificar su código para las partes que necesitan AutoCAD y las partes que son realmente independientes. Cree pruebas unitarias para las partes independientes como lo haría normalmente.
Para las otras partes, necesitas maquetas que se comporten como AutoCAD. Hazlos lo más simples posible (por ejemplo, solo devuelve las respuestas correctas en los métodos sin hacer ningún cálculo). Ahora, necesitas varios conjuntos de clases:
Un conjunto de interfaces que utiliza el código para lograr algo (por ejemplo, cargar un dibujo).
Un conjunto de implementaciones para dicho conjunto de interfaces que llaman a los dlls de AutoCAD.
Un conjunto de clases que prueban las implementaciones dentro del contexto de AutoCAD. Simplemente cree una IU pequeña con un par de botones donde puede ejecutar este código. Se usa para asegurarte que tus maquetas hacen lo correcto. Registre los parámetros del método y los resultados en algún archivo para que pueda probar cómo responde AutoCAD. Si se rompe una maqueta, puede usar este código para verificar qué está haciendo AutoCAD y puede usarlo como referencia al desarrollar las maquetas.
Cuando sepa cómo responde AutoCAD, cree las maquetas. En sus pruebas, créelos con los resultados deseados (y errores, para que pueda probar el manejo de errores también). Entonces, cuando tenga
boolean loadDrawing(File filename)
, cree una maqueta que devuelvatrue
para el nombre del archivoexists.dxf
yfalse
para cualquier otra cosa.Use una fábrica o DI para indicarle a su código de aplicación qué implementación usar. Tiendo a tener una gran clase de configuración global con muchos campos públicos donde simplemente almaceno los objetos para usar. Puedo configurar esto desde el principio, es rápido, es fácil de entender. Si necesita crear objetos en tiempo de ejecución, coloque fábricas en la clase config que genere los objetos por usted, para que pueda intercambiarlos.
Escribí ... y luego rompí ... un corredor de pruebas para AutoCAD. Está en https://github.com/CADbloke/CADtest . Si estás interesado en eso, dame un empujoncito y lo arreglaré más rápido. Estoy esperando el lanzamiento de NUnit v3 antes de abordarlo.
Si restableces el tercer compromiso en ese repositorio (creo) y juegas con él desde allí, debería ejecutarse.