unit testing - unitarias - ¿Los elementos de implementación MSTest solo funcionan cuando están presentes en el archivo de configuración de prueba del proyecto?
unit test project c# (7)
En VS 2012, todo lo que necesita es hacer que el archivo log4net.properties (o el archivo de configuración para log4net) Copie si es más reciente. (haga clic derecho en el archivo log4net.properties para mostrar las propiedades y configurarlo)
Parece que no entiendo cómo se supone que se deben configurar los elementos de implementación de MSTest. He podido hacer que funcionen correctamente al modificar el archivo de configuración de prueba del proyecto, pero esto es menos que ideal: la configuración del elemento de implementación está separada de las pruebas individuales y las rutas de acceso de los archivos parecen almacenarse como rutas absolutas a menos que los archivos estén debajo de la carpeta de la solución.
¿No se supone que puedo agregar un elemento de implementación utilizando el atributo [DeploymentItem]
en [TestClass]
o [TestMethod]
sin tener que crear / modificar un archivo de configuración de prueba del proyecto? ¿Cómo logro esto?
(Francamente, no entiendo la necesidad de una configuración de elemento de despliegue por separado, ¿por qué no utilizar la configuración existente de ''Copiar en el directorio de salida'' para los archivos de proyecto que deberían ser elementos de implementación?)
En Visual Studio 2012, el directorio de salida es el directorio de trabajo, lo que significa que el atributo DeploymentItem no es necesario para el caso general (donde no tiene elementos específicos de implementación por prueba o por clase). Esto significa que si no necesita utilizar el atributo DeploymentItem si hay un conjunto de archivos que desea que utilicen todas las pruebas o si no es demasiado exigente con cada TestClass / TestMethod que tiene dependencias de implementación separadas.
Simplemente puede hacer clic en Proyecto | Mostrar todos los archivos e incluir las subcarpetas y archivos en Visual Studio con el atributo ''Copiar siempre'' o ''Copiar si es nuevo'' a su proyecto y los archivos se copiarán en su directorio de salida con la jerarquía intacta.
Lo mismo se aplica cuando se ejecuta vstest.console.exe desde la línea de comandos. Mira here para más detalles.
Actualizar
Hay casos en que el directorio predeterminado no será el directorio de salida. Específicamente, cuando elija Run All Tests
la ruta predeterminada estará en TestResults/Deploy_...
Lo mismo se aplica cuando se usa un archivo de runsettings
pruebas o las pruebas usan DeploymentItems
El directorio de salida será el directorio predeterminado cuando no esté utilizando DeploymentItems y:
- Haga clic con el botón derecho en la (s) prueba (s) en Visual Studio y elija ejecutar / depurar, o
- Se ejecuta desde la línea de comando usando vstest.console.exe.
En mi caso, agrego el atributo DeploymentItem, no puede entrar en vigencia inmediatamente. Tengo que cerrar y volver a abrir la solución, luego los atributos DeploymentItem configurados tendrán efecto.
Ok, esta publicación me ayudó a entender lo que necesitaba hacer SIN tener que agregar elementos manualmente al archivo .testsettings
.
Paso 1: habilite el atributo MS Test DeploymentItem
.
Primero, tenemos que activar / habilitar el atributo DeploymentItem
.
Goto TEST -> EDITAR CONFIGURACIÓN DE PRUEBA -> Configuración activa actual ... ej. :: Local (local.testsettings)
Ahora vaya a la opción de DESPLIEGUE y asegúrese de que la Activación de la implementación esté activada. (Por defecto, está apagado).
Paso 2 - Verifica las propiedades del archivo
Ahora debemos asegurarnos de que el archivo que desea usar en la prueba unitaria esté configurado para ser copiado al directorio BIN cuando compile. Solo los archivos que están en el directorio BIN se pueden usar en una prueba de unidad de prueba de MS. ¿Por qué? Porque cada vez que se ejecuta una prueba MS, debe hacer una copia de las fuentes ... y esto significa que hace una copia de los archivos actuales del directorio BIN (para la configuración actual).
Por ejemplo ... La Configuración actual es Depuración (en lugar de Versión).
Luego agrego mi archivo ... (tome nota de la estructura de carpetas en el Proyecto) ...
y luego asegúrese de que este archivo esté SIEMPRE copiado en el directorio bin cuando se compile el proyecto.
PRO SUGERENCIA: Copiar siempre también funcionará, pero siempre copie el archivo fuente sobre el archivo de destino ... incluso si son idénticos. Es por eso que prefiero Copiar si es más nuevo ... pero lo que sea que flote su barco
Ok señoras y caballeros, ¿todavía estoy conmigo? Wikid.
Cuando compilamos, el archivo debería existir ahora en el Bin dir ....
Paso 3: ahora usa el atributo DeploymentItem
Bien, ahora finalmente podemos usar el atributo DeploymentItem
en nuestro código. Cuando hacemos esto, esto le dice al MSTest que copie el archivo (desde la ubicación relativa al directorio bin) al nuevo directorio de MS Test ...
[TestMethod]
[DeploymentItem(@"Test Data/100LogEntries.txt", "Test Data")]
public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
{
// Arrange.
const string fileName = @"Test Data/100LogEntries.txt";
ILogEntryService logEntryService = new PunkBusterLogEntryService();
// Act.
var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);
// Assert.
Assert.IsNotNull(parsedLogEntries);
Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
// Snipped the remaining asserts to cut back on wasting your time.
}
Así que analicemos esto ...
[TestMethod]
Todos sabemos lo que es eso.
[DeploymentItem(@"Test Data/100LogEntries.txt", "Test Data")]
Comenzando en el directorio bin, vaya a la carpeta Test Data
y copie el archivo 100LogEntries.txt
a una carpeta de destino Test Data
, en el directorio de salida raíz de MS Test que MS Test crea cuando se 100LogEntries.txt
todas y cada una de las pruebas.
Así que esta es la estructura de mi carpeta de salida. (Disculpe todo el lío ...)
¡y voilá! tenemos archivos de despliegue, programáticamente.
PRO TIP # 2: si no utiliza un argumento de 2nd cadena en el atributo DeploymentItem
, entonces el archivo se copiará en la carpeta raíz OUT, de la prueba MS actual.
const string fileName = @"Test Data/100LogEntries.txt";
Ahora la ruta al archivo es relativa a la carpeta OUT
para la prueba MS actual. Como tal, explicité dijo que desplegar el archivo en un directorio llamado Test Data
... así que necesito asegurarme de que haga referencia a eso correctamente en mi código cuando quiero leer en el archivo.
Solo para confirmar -> la ruta completa de ese nombre de archivo se traduce a algo así como C:/lots of blah blah blah/My Solution/TestResults/PureKrome_PUREKROME-PC 2011-01-05 23_41_23/Out/Test Data
.. para ese MS actual Prueba.
HTH.
Ahora ten una foto de un Unicornio, por leer tanto :)
Parece que esto funciona de manera predeterminada en VS.NET 2012
Pensé que compartiría una forma en que encontré problemas con MSTest y elementos de implementación. Si depura / ejecuta su prueba una segunda o más veces desde la ventana "Resultados de la prueba", usa la configuración de una ejecución anterior. Sin embargo, si depura / ejecuta la misma prueba desde la ventana "Vista de prueba", usa la última configuración. Perdí una hora tratando de descubrir por qué los cambios a Local.testsettings no se estaban usando cuando seguí iniciando Debug en la misma prueba desde la ventana "Resultados de la prueba".
Esta es la ventana Resultados de la prueba (no [reinicie] las pruebas desde aquí después de realizar cambios a Local.testsettings):
Y esta es la ventana de Vista de prueba (DO comenzar pruebas desde aquí después de hacer cambios a Local.testsettings):
Espero que esto le ahorre a alguien un dolor de cabeza en el futuro.
Si necesita un elemento de implementación separado en casos de prueba individuales, siga adelante y use el atributo [DeploymentItem("string file path")]
en cada caso de prueba.