Archivo de copia de MSTest a la carpeta de ejecución de prueba

108

Tengo una prueba que requiere que se lea un archivo XML y luego se analice. ¿Cómo puedo copiar este archivo en la carpeta de ejecución de prueba cada vez?

El archivo XML está configurado en "Copiar si es más nuevo" y un modo de compilación de "ninguno" (ya que no es realmente una cosa compilable)

Aaron Powell
fuente

Respuestas:

131

usar un DeploymentItematributo

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.xml")]
        public void ConstructorTest()
        {
            string file = "testFile1.xml";
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}
Preet Sangha
fuente
17
El atributo DeploymentItem también se puede especificar a nivel de clase, para afectar a todas las pruebas de la clase.
Hannes Nel
24
No olvide que si tiene sus elementos en una subcarpeta, incluirlos también en el subdirectorio de implementación [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb
31
Además del comentario de Thomas, el valor predeterminado para RelativePathRoot es la carpeta de la solución, por lo que si su solución se ve así (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt) Su DeploymentItem se vería así ... ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. y harías referencia al archivo en la prueba usando este .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann
6
Documentación de DeploymentItemAttribute para VS2010 : este atributo se puede especificar en un método de prueba o en una clase de prueba.
Alex Che
12
Lo que la mayoría de las publicaciones que he visto no mencionan es que si no puede hacer que esto funcione, probablemente deba marcar la casilla de verificación "Habilitar implementación", que puede encontrar si va a Prueba -> Editar configuración de prueba -> local (local.testsettings) -> pestaña Implementación. Acabo de hacer esto y luego DeploymentItem funcionó bien.
Dave
26

Parece que si proporciona un archivo TestSettings para la Solución, puede desmarcar la opción "Habilitar implementación" y evitar que mstest intente ejecutarse desde la ...TestResults\...\outcarpeta donde no copia sus archivos adicionales (a menos que los convierta en una opción de implementación) .

Esto también es útil si depende de que los archivos adicionales estén en una estructura de carpeta preservada porque los elementos de implementación parecen copiarse directamente (planos) en la carpeta de ejecución temporal (fuera) si usa la opción Implementación, Agregar carpeta en TestSettings ( Las respuestas anteriores sugieren que puede mantener la estructura si agrega cada elemento como su propio DeploymentItem).

Para mí funcionó bien ejecutando pruebas directamente en Visual Studio (es decir, mis archivos adicionales en su estructura fueron encontrados y usados ​​por pruebas) porque había creado un archivo TestSettings por otra razón hace mucho tiempo (que tiene Habilitar implementación sin marcar), pero no cuando TeamCity Ejecuté mstest para ejecutar pruebas porque no había especificado que se debería usar el archivo TestSettings.

Para crear un archivo TestSettings en Visual Studio, haga clic con el botón derecho en la Solución y elija New Item, y seleccione la plantilla TestSettings. Para usar el archivo TestSettings en el símbolo del sistema de mstest.exe, agregue la opción /testsettings:C:\Src\mySolution\myProject\local.testsettings (o agregue como una opción de línea de comando adicional en TeamCity con la ruta adecuada)

TamW
fuente
3

La mejor solución para mí es usar configuraciones de prueba, especialmente si varias pruebas necesitan los mismos archivos de datos.

Primero cree un archivo de configuración de prueba y agregue los elementos de implementación que necesita (nombre de archivo o carpeta):

<TestSettings name="Local" id="00ebe0c6-7b64-49c0-80a5-09796270f111" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Folder1\TestScripts\test.xml" outputDirectory="TestScripts"/>
    <DeploymentItem filename="Folder2\TestData\" outputDirectory="TestData"/>
  </Deployment>
<...../>
  • Ejecutando en Visual Studio, use "seleccione Archivo de configuración de prueba" en el menú "Prueba \ Configuración de prueba" para seleccionar nuevas configuraciones de prueba

  • Ejecutando mstest, use el parámetro / testsettings para que mstest use su testsettings.

FrankyHollywood
fuente
2

Puede definir DeploymentItem en una clase que contiene un método con el atributo AssemblyInitialize. Entonces está seguro de que los archivos se copian independientemente de la prueba que ejecute.

Desafortunadamente, el atributo DeploymentItem se ejecuta solo en las clases que contienen las pruebas que estás ejecutando. Entonces, si tiene 10 clases de prueba que usan el mismo conjunto de archivos, debe agregar el atributo a todas.

También descubrí que los cambios en los archivos * .testsettings no se actualizan automáticamente en Visual Studio. Por lo tanto, después de agregar archivos / carpetas a la implementación en configuraciones de prueba, debe volver a abrir el archivo de solución y luego ejecutar las pruebas.

Sielu
fuente
2

En Visual Studio 2012, vstest.console.exe (el ejecutor de pruebas integrado) se ejecuta con el directorio de salida como la ruta actual. Esto significa que solo necesita incluir los elementos en su solución con la propiedad 'Copiar siempre' o 'Copiar si es más reciente' para que los utilice su prueba. No necesita el atributo DeploymentItem para el caso general. Lo mismo se aplica cuando se ejecuta vstest.console.exe desde la línea de comando dentro de su directorio de salida / prueba.

Hay algunos casos en los que se utiliza una carpeta separada, siendo uno de ellos cuando se utiliza el atributo DeploymentItem. Consulte aquí para obtener más información.

acarlon
fuente