Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Algunas pruebas necesitan archivos adicionales en tiempo de ejecución, como datos de prueba, archivos de configuración, maestros dorados o dependencias nativas. DeploymentItemAttribute Use para declarar archivos y carpetas que deben estar disponibles junto al ensamblado de prueba cuando se ejecute cada prueba.
Información general
Cuando se aplica [DeploymentItem] a una clase de prueba o a un método de prueba, MSTest copia los archivos o carpetas especificados en el directorio expuesto por TestContext.DeploymentDirectory antes de que se ejecute cualquier prueba en ese ámbito. El directorio de implementación también es el directorio de trabajo actual de la prueba, por lo que el código de prueba puede abrir los archivos por sus nombres copiados.
El atributo acepta una ruta de acceso relativa o absoluta:
-
Las rutas relativas se resuelven con respecto al directorio de salida de compilación (la carpeta que contiene el ensamblado de prueba, por ejemplo
bin\Debug\net10.0\). - Las rutas absolutas se usan tal cual.
Importante
En MSTest 3.x, los elementos de implementación se copian por ejecución de prueba. Para que un archivo esté disponible en el momento de la implementación, el archivo ya debe existir en el directorio de salida de compilación (o copiarlo).
Aplicar [DeploymentItem]
El atributo se puede aplicar a un método de prueba, una clase de prueba o ambos. Se permiten varias instancias y se pueden combinar:
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
[DeploymentItem(@"TestFiles\shared-config.json")]
public class ConfigurationTests
{
[TestMethod]
[DeploymentItem(@"TestFiles\customers.csv")]
public void LoadCustomers_FromCsv_ReturnsAllRows()
{
// Both shared-config.json (from the class) and customers.csv (from
// the method) are available in the deployment directory.
Assert.IsTrue(File.Exists("shared-config.json"));
Assert.IsTrue(File.Exists("customers.csv"));
}
}
Note
Cuando se aplica [DeploymentItem] a una clase de prueba, la clase debe contener al menos un método de prueba. Aplicarlo a una clase que solo tiene AssemblyInitialize o ClassInitialize métodos no tiene ningún efecto. El analizador MSTEST0035 marca este uso incorrecto.
Sobrecargas del constructor
DeploymentItemAttribute tiene dos constructores: DeploymentItemAttribute(string path) y DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
Copia el archivo o carpeta identificado por path en la raíz del directorio de implementación.
// Copy a single file from the build output directory.
[DeploymentItem("settings.json")]
// Copy a file that lives in a subfolder of the build output directory.
// The file is copied to the root of the deployment directory (the
// "Resources" folder is not preserved).
[DeploymentItem(@"Resources\test-data.xml")]
// Copy the entire TestFiles folder (and all of its subfolders) into the
// deployment directory.
[DeploymentItem("TestFiles")]
DeploymentItemAttribute(string path, string outputDirectory)
Copia los elementos en un subdirectorio del directorio de implementación, dado por outputDirectory.
// Creates a "Data" subfolder under the deployment directory, then copies
// test-data.xml into it. The file is reached at "Data\test-data.xml".
[DeploymentItem("test-data.xml", "Data")]
// Copies the contents of the Resources folder into a "Resources"
// subfolder of the deployment directory.
[DeploymentItem("Resources", "Resources")]
El argumento outputDirectory debe ser una ruta de carpeta. No se puede usar para cambiar el nombre del archivo. Para implementar un archivo con un nombre diferente, cámbielo en la carpeta de origen (o use un paso posterior a la compilación).
Asegúrese de que los archivos de origen lleguen al directorio de salida de compilación.
Dado que las rutas de acceso relativas se resuelven en el directorio de salida de compilación, el archivo de origen o la carpeta ya deben estar allí. Hay dos maneras comunes de lograrlo.
Uso <None> o <Content> con CopyToOutputDirectory
Agregue los archivos al proyecto de prueba y márquelos para que se copien en el directorio de salida de la compilación:
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Después de una compilación, la TestFiles carpeta se replica en bin\<Configuration>\<TargetFramework>\TestFiles\y [DeploymentItem("TestFiles")] se resuelve correctamente.
Usar un destino posterior a la compilación
Para los archivos que residen fuera del proyecto de prueba, cópielos en el directorio de salida de compilación como parte de la compilación:
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
Inspección del directorio de implementación en tiempo de ejecución
Si necesita la ruta de acceso absoluta del directorio de implementación (por ejemplo, para pasarla a un proceso generado o para registrarla para diagnósticos), use TestContext.DeploymentDirectory:
using System.IO;
[TestMethod]
[DeploymentItem(@"TestFiles\input.json")]
public void ProcessInput_FromDeployedFile_Succeeds()
{
string fullPath = Path.Combine(TestContext.DeploymentDirectory, "input.json");
string contents = File.ReadAllText(fullPath);
// ...
}
Para obtener más información sobre TestContext, vea La TestContext clase .
Cuando la implementación no se produce
De forma predeterminada, MSTest crea un directorio de implementación por ejecución y copia elementos en él. Puede deshabilitar la implementación en un .runsettings archivo para que las pruebas se ejecuten directamente fuera del directorio de salida de compilación:
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
Cuando la implementación está deshabilitada, [DeploymentItem] los atributos no tienen ningún efecto y la prueba se ejecuta en el propio directorio de salida de compilación. Para obtener más opciones de configuración, consulte Configuración de MSTest.
Modo heredado y .testsettings
Cuando MSTest se ejecuta en modo heredado (se usa un archivo .testsettings o RunSettings/MSTest/ForcedLegacyMode se establece en true en un archivo .runsettings), es posible que las rutas de acceso relativas se resuelvan con respecto al directorio raíz de la solución en lugar de al directorio de salida de compilación. Evite el modo heredado para los nuevos proyectos: la configuración moderna basada en .runsettings es la opción recomendada.
procedimientos recomendados
- Es preferible usar
CopyToOutputDirectoryen lugar de rutas relativas profundas. No acceda a carpetas fuente mediante rutas de estilo..\..\: vinculan las pruebas a una estructura del repositorio específica. Almacene primero los archivos en el directorio de salida de compilación. - Mantenga los elementos de despliegue pequeños. Cada elemento se copia para cada ejecución de prueba; Los archivos de gran tamaño ralentizan la ejecución de pruebas.
- Use carpetas para desplegar recursos relacionados de forma conjunta.
[DeploymentItem("TestFiles")]es más fácil de mantener que docenas de atributos por archivo. - Prefiere recursos incrustados o datos en memoria para accesorios pequeños. Los recursos insertados eliminan la necesidad de implementación y evitan la E/S en tiempo de prueba.
- No confíe en que el directorio de trabajo sea el directorio del proyecto. Durante la ejecución de pruebas, el directorio de trabajo es el directorio de implementación, no la carpeta del proyecto de prueba.