Tengo la costumbre de tratar siempre de diferenciar el código de nivel de aplicación del código de nivel de marco, por lo que me he encontrado con el problema que está describiendo con bastante frecuencia: generalmente desea que se pruebe todo el código de nivel de marco antes de que cualquier código de nivel de aplicación comience a probarse. . Además, incluso dentro del código de nivel de marco, tienden a existir algunos módulos de marco fundamentales que son utilizados por todos los demás módulos de marco, y si algo falla en los fundamentos, realmente no tiene sentido probar nada más.
Desafortunadamente, los proveedores de marcos de prueba tienden a tener ideas algo rígidas sobre cómo se deben usar sus creaciones, y son bastante protectores de esas ideas, mientras que las personas que usan sus marcos tienden a aceptar el uso previsto sin cuestionarse. Esto es problemático porque sofoca la experimentación y la innovación. No conozco a todos los demás, pero preferiría tener la libertad de intentar hacer algo de una manera extraña, y ver por mí mismo si los resultados son mejores o peores que los establecidos, en lugar de no tener la libertad de hacer las cosas a mi manera en primer lugar.
Entonces, en mi opinión, las dependencias de prueba serían algo increíble, y en lugar de eso, la capacidad de especificar el orden en que se ejecutarán las pruebas sería la mejor opción.
La única forma en que he encontrado para abordar el tema de ordenar pruebas es nombrando cuidadosamente, para explotar la tendencia de los marcos de prueba a ejecutar pruebas en orden alfabético.
No sé cómo funciona esto en Visual Studio, porque todavía tengo que hacer algo que implique pruebas exhaustivas con C #, pero en el lado de Java del mundo funciona de la siguiente manera: en la carpeta de origen de un proyecto, generalmente tenemos dos subcarpetas, uno llamado "main", que contiene el código de producción, y otro llamado "test", que contiene el código de prueba. En "principal" tenemos una jerarquía de carpetas que corresponde exactamente a la jerarquía de paquetes de nuestro código fuente. Los paquetes Java corresponden aproximadamente a espacios de nombres de C #. C # no requiere que haga coincidir la jerarquía de carpetas con la jerarquía de espacio de nombres, pero es recomendable hacerlo.
Ahora, lo que la gente suele hacer en el mundo de Java es que debajo de la carpeta "prueba" reflejan la jerarquía de carpetas que se encuentra debajo de la carpeta "principal", de modo que cada prueba reside exactamente en el mismo paquete que la clase que prueba. La razón detrás de esto es que, con bastante frecuencia, la clase de prueba necesita acceder a miembros privados del paquete de la clase bajo prueba, por lo que la clase de prueba debe estar en el mismo paquete que la clase bajo prueba. En el lado C # del mundo no existe la visibilidad local del espacio de nombres, por lo que no hay razón para reflejar las jerarquías de carpetas, pero creo que los programadores de C # siguen más o menos la misma disciplina en la estructuración de sus carpetas.
En cualquier caso, me parece que esta idea de permitir que las clases de prueba tengan acceso a los miembros del paquete local de las clases bajo prueba mal orientadas, porque tiendo a probar interfaces, no implementaciones. Por lo tanto, la jerarquía de carpetas de mis pruebas no tiene que reflejar la jerarquía de carpetas de mi código de producción.
Entonces, lo que hago es nombrar las carpetas (es decir, los paquetes) de mis pruebas de la siguiente manera:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Esto garantiza que todas las pruebas para "SomeSubsystem" se ejecutarán antes de todas las pruebas para "SomeOtherSubsystem", que a su vez se ejecutarán antes de todas las pruebas para "AndYetAnotherSubsystem", y así sucesivamente.
Dentro de una carpeta, los archivos de prueba individuales se nombran de la siguiente manera:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Por supuesto, es de gran ayuda que los IDE modernos tengan potentes capacidades de refactorización que le permiten cambiar el nombre de paquetes completos (y todos los subpaquetes, y todo el código que los hace referencia) con solo un par de clics y pulsaciones de teclas.