¿Existe algún marco de prueba unitario .NET que pueda probar no ensamblados (DLL)?

He usado NUnit durante años, pero siempre me ha molestado que se vea obligado a mover todas sus funciones probables a un ensamblaje separado (DLL) para que pueda escribir / ejecutar pruebas en ellas. Por ejemplo, tengo un proyecto de Windows Forms (estoy usando MyProgram en este ejemplo) que tiene varias clases que me gustaría probar. Con NUnit, tendría que extraer esas clases en otro proyecto de ensamblaje (DLL) para que se puedan ejecutar las pruebas. Entonces mi proyecto, que solía contener un solo proyecto, MyProgram, ahora requiere 3 proyectos:

  1. MyProgram (aplicación de Windows Forms)
  2. MyProgramLib (Ensamblaje para ser probado en unidad, era parte de MyProgram)
  3. MyTestLib (ensamblado de prueba NUnit)

Podría preguntar por qué esto es un problema. Tengo un par de razones:

  1. Construir complejidad: Ahora necesito crear y probar un nuevo ensamblaje en el proyecto.
  2. Velocidad de desarrollo: A los desarrolladores les lleva tiempo cambiar a un proyecto diferente para agregar / editar métodos que tengan un sentido más lógico en la aplicación principal.
  3. Difícil de manejar: Es difícil administrar el código. Los desarrolladores terminan escribiendo métodos que son muy largos y detallados para describir qué es lo específico que el código está tratando de lograr.

Sé que las pruebas ya funcionan así con Java y Maven. Puedo simplemente escribir las pruebas unitarias y no necesito crear el proyecto MyProgramLib.

¿Alguno de los otros marcos de prueba de unidades .NET (xUnit, MSTest, MbUnit, etc.) admite la escritura de pruebas sin el requisito de MyProgramLib?

preguntado el 08 de noviembre de 11 a las 16:11

3 Respuestas

Es muy posible usar NUnit para probar exe proyectos así como dll. Un exe en .Net es realmente un poco diferente a un dll y es posible hacer referencia a un exe a partir de una dll or exe proyecto. Esto significa que puede crear un proyecto NUnit, hacer que haga referencia al exe y escriba sus pruebas unitarias contra los tipos definidos en el exe

respondido 08 nov., 11:20

Gracias por la respuesta. No sé cómo se podría lograr esto con ninguno de los marcos mencionados anteriormente. ¿Conoce algún ejemplo? - Brent Matzelle

@BrentM Ninguno en la web. Aunque he hecho esto muchas veces con NUnit. Por lo general, debe agregar una referencia al EXE compilado directamente frente al proyecto, pero después de eso funciona bien: JaredPar

Hace mucho tiempo que asumí que los EXE no son ensamblajes y eso me desvió totalmente del camino. ¡Gracias por la buena respuesta! - Brent Matzelle

En mi humilde opinión

  • Complejidad de construcción: tal vez un poco. Ha agregado otra parte móvil.
  • Dev Speed: en lugar de cambiar al proyecto exe, cambia al proyecto lib.
  • Difícil de administrar ... eso no tiene nada que ver con este esquema de partición. Parece un problema de conciencia o habilidad.

El patrón se debe al hecho de que históricamente no se podía hacer referencia a ejecutables solo a bibliotecas. También tiene sentido de alguna manera; la aplicación y las pruebas necesitan usar / compartir el código de producción (bibliotecas), por lo tanto, lo trasladamos a un proyecto común. Este es en realidad un patrón con nombre Humilde ejecutable.

respondido 09 nov., 11:10

He usado NUnit durante años, pero siempre me ha molestado que se vea obligado a mover todas sus funciones probables a un ensamblaje separado (DLL) para que pueda escribir / ejecutar pruebas en ellas.

Como han dicho otros, NUnit carga asambleas, no DLL. Los ex también son asambleas, y cualquier público visible [TestFixture] aparecerá en NUnit si carga su ensamblaje en el corredor de prueba.

Podría preguntar por qué esto es un problema. Tengo un par de razones:

  • Construir complejidad: Ahora necesito crear y probar un nuevo ensamblaje en el proyecto.

Si piensa en todo el ciclo de vida del proyecto, esto podría cambiar la forma en que aborda el problema.

Por ejemplo, podría pensar en ensamblajes en términos de lo que versiona y envía por separado, o en términos de lo que implementa y prueba por separado.

Si puede decir "es solo una solución de la interfaz de usuario, todo lo que tengo que volver a implementar es el sitio web" o "Hice un cambio en este ensamblaje. Puedo simplemente agregar pruebas de unidad e integración para este y ensamblajes relacionados, y ejecutar este pruebas de regresión del área "estás en un buen lugar.

Si debe decir "Debo volver a implementar toda la aplicación" o "Debo volver a ejecutar toda nuestra suite de regresión", entonces tiene más problemas.

  • Velocidad de desarrollo: A los desarrolladores les lleva tiempo cambiar a un proyecto diferente para agregar / editar métodos que tengan un sentido más lógico en la aplicación principal.

Quizás el problema es que crees que tienes una "aplicación principal".

Si está escribiendo una sola aplicación que se comunica con un servidor fuera de su control, y la única pieza es una interfaz de usuario delgada, entonces esto tiene sentido. Pero incluso allí probablemente tenga algunas abstracciones y conceptos potencialmente cruzados de proyectos que deberían separarse.

Si hace que esta separación sea más obvia, los desarrolladores podrán navegar rápidamente, independientemente de la cantidad de ensamblajes.

  • Difícil de manejar: Es difícil administrar el código. Los desarrolladores terminan escribiendo métodos que son muy largos y detallados para describir qué es lo específico que el código está tratando de lograr.

Este es realmente un problema aparte. Se gestiona mejor sin pensar en los ensamblajes.

Realmente parece que debería trabajar más en el diseño de su software. los Principio de responsabilidad única así como de otros SOLID Los principios de OO lo ayudarán más aquí que preocuparse por los ensamblajes.

Descubrí que a menudo es más fácil navegar por una mayor cantidad de ensamblajes cuando no son solo grandes cantidades de código. La división realmente ayuda cuando se relaciona bien con el software que estamos escribiendo. Pero, de nuevo, he estado atascado en .Net durante la última media década, así que YMMV :)

respondido 09 nov., 11:10

Gracias por la respuesta. No me di cuenta de que los archivos EXE eran ensamblados, por lo que no es necesario agregar un programa "Lib" adicional para NUnit. Eso alivia las tres razones anteriores. - Brent Matzelle

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.