¿Cómo puedo hacer que "Copiar al directorio de salida" funcione con las pruebas unitarias?

123

Cuando construyo un proyecto de prueba unitaria antes de que se ejecuten las pruebas, el resultado de la prueba se copia en una carpeta TestResults y luego se ejecutan las pruebas. El problema que tengo es que no todos los archivos en el directorio Debug / bin se copian al proyecto TestResults.

¿Cómo puedo obtener un archivo que se copia en el directorio Debug / bin para que también se copie en la carpeta TestResults?

Eric Schoonover
fuente

Respuestas:

121

La forma estándar de hacerlo es especificando los elementos de implementación en el .testrunconfigarchivo, a los que se puede acceder a través del elemento Editar configuraciones de ejecución de prueba en el menú Prueba de Visual Studio o en la carpeta Elementos de solución .

Mark Cidade
fuente
15
En VS2010 esto es: Prueba / Editar configuración de prueba / local, luego en la lista, seleccione "Implementación", marque la casilla "Habilitar ..." y agregue los archivos.
Marcel
18
Es posible que deba cerrar su solución (o incluso Visual Studio) y volver a abrir antes de que este cambio surta efecto correctamente
RobV
RobV, me alegraste el día. ¡GRACIAS!
Ignacio Soler Garcia
2
Si usa el atributo [DeploymentItem] en el código, no necesita especificar los archivos en el cuadro de diálogo; consulte el código de @ tomfanning a continuación.
Patrick Szalapski
Esto no resuelve mi problema con la copia de la salida de configuración de la carpeta bin o release porque en tiempo de diseño no tengo información sobre si el archivo estará en la carpeta de depuración o lanzamiento y para mí ese es el archivo que no se está copiando la carpeta Out en los resultados de la prueba
Gurpreet
61

Puede especificar el atributo de implementación como un ejemplo que se muestra a continuación; También debe establecer la propiedad "Contenido" y "Copiar si es más reciente" (no hay documentación sobre la configuración posterior, pero la ha configurado para que funcione).

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
Sanjay10
fuente
3
Aún necesita habilitar esto. Como Mercel escribió en su comentario, en VS2010 esto es: Prueba / Editar configuración de prueba / local, luego en la lista, seleccione "Implementación", marque la casilla "Habilitar ...".
Patrick Szalapski
Estoy luchando con este problema en Visual Studio 2012 Express y debido a que es una edición limitada, fue difícil encontrar documentación clara. Muchas gracias por esta respuesta.
DavidHyogo
2
Funciona genial. De hecho, creo que este es el mejor método y respuesta, ya que documenta los archivos necesarios justo encima del método de prueba.
bu5hm4nn
1
Descubrí que el atributo DeploymentItem también funciona cuando se especifica en el nivel de clase de prueba (en lugar del nivel de método).
Jon Schneider
10

Tuve que activar "Habilitar implementación" Test -> Edit Test Settings -> Local -> Deploymentpara que el [DeploymentItem]atributo funcione.

tomfanning
fuente
Esto es cierto ... Lo acabo de habilitar y ahora el atributo funciona. ¡Gracias!
Miguel Angelo
Como mencioné en mi comentario a otra respuesta, estoy luchando con el mismo problema en Visual Studio 2012 Express y las 2 respuestas juntas finalmente me dieron la solución.
DavidHyogo
5

Las tres respuestas son correctas, según sus necesidades.

Agregar archivos para implementar en .testrunconfig (.testsettings en VS2010) copiará todos esos archivos en cada carpeta de salida de prueba, incluso para pruebas no relacionadas que se ejecutan de forma aislada. Si ejecuta una prueba, todos los archivos de datos de prueba enumerados en la sección de implementación de .testssettings se copiarán en la carpeta de salida de prueba.

En mis pruebas, necesito copiar un archivo XML esperado en la carpeta de salida de prueba para compararlo con el XML de salida de prueba real. Uso el atributo DeploymentItem para copiar solo el archivo XML relacionado con las pruebas que se ejecutan. En VS2010 tuve que habilitar la implementación en el archivo .testsettings (pero no agregar ninguna ruta) y luego hacer referencia a la ruta del archivo XML en relación con el TestProject en el DeploymentItem.

Espero que esto ayude.

GraehamF
fuente
2
Mi problema era la ruta relativa mencionada aquí, pensé que el Xml debería estar en el directorio en el que se encontraba la prueba, pero tenía que estar en la raíz del proyecto o estar precedido por el directorio en el que estaba.
Wes Grant
2

Tuve un problema similar, pero el mío tuvo que ver con señalar el archivo TraceAndTestImpact.testsettings en lugar del archivo Local.testsettings. Puede cambiar de uno a otro en el menú Prueba / Seleccionar configuración de prueba activa.

Simón
fuente
2

Me gustaría mejorar la respuesta aceptada mencionando una forma de implementarla específicamente para dll en lugar del método normal de usarla para datos o configuración, etc., para las circunstancias en las que CopyLocal no funciona:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
JamesDill
fuente
1

Lo siguiente funciona en VS2012 para proyectos de prueba incluidos en múltiples soluciones sin usar un archivo de configuración de prueba:

1) Organice los archivos y carpetas que desea implementar en una carpeta en el directorio del proyecto de prueba.

2) En las propiedades del proyecto, cree un paso posterior a la compilación

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)y $(TargetDir)son macros que serán interpretadas por VS y deben incluirse como tales.

<Project_Folder_Name> es el nombre de la carpeta creada en el paso 1.

<Deployment_Folder_Name>es el nombre de la carpeta en la que se implementarán los archivos de prueba y debe nombrarse de modo que sea único cuando se implementen varios proyectos de prueba en el mismo directorio, por ejemplo <Project_Name>_TestInputs.

Los archivos de prueba en ubicaciones compartidas también deben copiarse en la carpeta de implementación del directorio de destino para limitar las interacciones de prueba. Proporcione la ruta de origen relativa a la $(ProjectDir)macro. Por ejemplo "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Agregue una [DeploymentItem(source, destination)]propiedad a cada método de prueba que use un archivo de implementación (práctica recomendada) o a la clase de prueba (práctica más fácil para los perezosos o apresurados, y la forma más fácil de actualizar un proyecto, las rutas relativas utilizadas anteriormente o un archivo de configuración de prueba )

En un método de prueba, sourcees la ruta al archivo o directorio utilizado en el método de prueba en relación con el directorio de destino creado por xcopyy destinationes la ruta al directorio en el que se creará en relación con el directorio de implementación. Para que las pruebas se ejecuten de manera consistente en el directorio de destino o en un directorio de implementación. La ruta de destino debe ser la misma que la ruta de origen sin una referencia de archivo. Ejemplo: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. El DeploymentItemdebe incluirse en cada método que utiliza ese archivo o directorio.

En una clase, sourcey destinationson ambos el nombre de la carpeta creada en el directorio de destino por xcopy; esto copiará la carpeta completa al directorio de implementación cuando se ejecute cualquier prueba en la clase. Ejemplo:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) En los métodos de prueba, ahora puede acceder a archivos y directorios con la confianza de que estarán en el directorio de trabajo, independientemente de dónde Visual Studio haya decidido colocarlo ese día, por ejemplo File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
fuente
0

Pruebe la línea de comando del evento Post-Build desde Visual Studio (si está usando ese IDE).

Kasper
fuente
3
Lo estoy, pero eso parece un truco. Este tiene que ser un escenario bastante común y espero que haya alguna opción o propiedad que no esté configurando correctamente.
Eric Schoonover
0

En Visual Studio 2012 no necesita un atributo DeploymentItem para el caso simple. Mira mi respuesta aquí

acarlon
fuente
0
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
Nina
fuente
0

La respuesta aceptada es correcta y también lo son la mayoría de las otras respuestas. Sin embargo, a lo largo de los años, descubrí que el sistema Deploment de Visual Studio Unit Tests usa DeploymentAttribtue y Copy to Output es engorroso si tiene una gran cantidad de archivos de datos. He descubierto que mantener los archivos en su ubicación original funcionó mejor.

Detalles completos en mi otra respuesta aquí. https://stackoverflow.com/a/53004985/2989655

Espero que esto ayude.

Sau001
fuente