2008-10-22 19 views
114

Cuando construyo un proyecto de prueba de unidad antes de que se ejecuten las pruebas, la salida de prueba se copia en una carpeta TestResults y luego se ejecutan las pruebas. El problema que estoy teniendo es que no todos los archivos en el directorio Debug/bin se copian en el proyecto TestResults.¿Cómo puedo obtener "Copiar en el directorio de salida" para que funcione con las pruebas unitarias?

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

Respuesta

119

La forma habitual de hacer esto es mediante la especificación de la deployment items en el archivo .testrunconfig, que se puede acceder a través de la edición de prueba Ejecutar configuraciones elemento en el prueba menú de Visual Studio o en la solución Artículos carpeta.

+15

En VS2010 esto es: Probar/Editar configuración de prueba/local, luego en la lista, seleccione "Implementación", marque la casilla "Habilitar ..." y agregue el archivo (s). – Marcel

+17

Es posible que tenga que cerrar la solución (o incluso Visual Studio) y volver a abrir antes de que este cambio entre en vigor correctamente – RobV

+0

RobV, usted hizo mi día. ¡GRACIAS! –

0

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

+2

Lo soy, pero parece un poco hackeo. Este tiene que ser un escenario bastante común y espero que solo haya alguna opción o propiedad que no estoy configurando correctamente. –

54

Puede especificar el atributo de implementación como un ejemplo que se muestra a continuación; También es necesario establecer "contenido" & "Copia si es más nuevo" propiedad (no hay documentación de los ajustes posteriores, pero que ha configurado los de hacer que funcione.

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



} 
+2

Aún necesita habilitar esto. Como Mercel escribió en su comentario, en VS2010 esto es: Probar/Editar configuración de prueba/local, luego en la lista, seleccionar "Despliegue", marcar la casilla "Habilitar ...". –

+0

Estoy luchando con este problema en Visual Studio 2012 Express y, como es una edición limitada, es difícil encontrar documentación clara. Muchas gracias por esta respuesta. – DavidHyogo

+2

Funciona muy bien. 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

5

Las tres respuestas son correctas, dependiendo de sus necesidades.

Adición de archivos de desplegar en el .testrunconfig (.testsettings en VS2010) copiará todos los archivos en cada carpeta de salida de prueba, incluso para las pruebas relacionadas 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 resultados 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. Utilizo el atributo DeploymentItem para copiar solo el archivo XML relacionado con la (s) prueba (s) que se está (n) ejecutando. En VS2010 tuve que habilitar la implementación en el archivo .testsettings (pero no agregué ninguna ruta) y luego hacer referencia a la ruta del archivo XML relativa a TestProject en DeploymentItem.

Espero que esto ayude.

+2

Mi problema era la ruta relativa mencionada aquí, pensé que el Xml debería estar en el directorio donde estaba la prueba, pero tenía que estar en la raíz del proyecto o estar precedido por el directorio en el que estaba. –

9

Tuve que activar "Activar implementación" en Test -> Edit Test Settings -> Local -> Deployment para que funcione el atributo [DeploymentItem].

+0

Esto es cierto. .. Acabo de habilitarlo y ahora el atributo funciona. ¡Gracias! –

+0

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

2

Tuve un problema similar, pero el mío tenía que ver con señalar el archivo TraceAndTestImpact.testsettings en lugar del archivo Local.testsettings. Puede cambiar de uno a otro en el menú Probar/Seleccionar valores de prueba activos.

0

En Visual Studio 2012 no necesita un atributo DeploymentItem para el caso simple. Véase mi respuesta here

1

las siguientes obras en VS2012 para proyectos de prueba incluidos en múltiples soluciones sin necesidad de utilizar un archivo testsettings:

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

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

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

$(ProjectDir) y $(TargetDir) son macros que serán interpretados por VS y debe ser incluido como tal.

<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 desplegarán los archivos de prueba y deben ser nombrados de manera que será único cuando varios proyectos de prueba son desplegado en el mismo directorio, por ejemplo <Project_Name>_TestInputs.

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

3) Agregue una propiedad [DeploymentItem(source, destination)] a cada método de prueba que utiliza un archivo de implementación (práctica recomendada) o a la clase de prueba (práctica más fácil para el perezoso o apresurado, y la forma más fácil de actualizar un proyecto rutas o un archivo de ajustes de prueba).

En un método de ensayo, source es la ruta de acceso al archivo o directorio usado en el método de ensayo con relación al directorio de destino como creado por el xcopy y destination es la ruta al directorio en el que se creará en relación con el directorio de despliegue. Para que las pruebas se ejecuten de forma coherente 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 DeploymentItem se debe incluir en cada método que use ese archivo o directorio.

En una clase, source y destination son ambos el nombre de la carpeta creada en el directorio de destino por el 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, p. File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

1

¿Le gustaría simplemente mejorar la respuesta aceptada por mencionar una manera de conseguirlo para desplegar específicamente para algo entonces el método normal de usarlo para datos o configuración etc, por las circunstancias en las que CopyLocal no funciona de DLL:

[DeploymentItem("bin\\release\\iRock.dll")] 
[DeploymentItem("bin\\debug\\iRock.dll")] 
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"; 
} 
Cuestiones relacionadas