Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Alguns testes precisam de ficheiros extra em tempo de execução, como dados de teste, ficheiros de configuração, mestres dourados ou dependências nativas. Use o DeploymentItemAttribute para declarar ficheiros e pastas que deverão estar disponíveis ao lado do seu conjunto de teste quando cada teste for executado.
Descrição geral
Quando aplica [DeploymentItem] a uma classe de teste ou a um método de teste, o MSTest copia os ficheiros ou pastas especificados para o diretório exposto por TestContext.DeploymentDirectory antes de qualquer teste nesse âmbito ser executado. O diretório de implementação é também o diretório de trabalho atual do teste, por isso o teu código de teste pode abrir os ficheiros pelos seus nomes copiados.
O atributo aceita um caminho relativo ou absoluto:
-
Os caminhos relativos são resolvidos contra o diretório de saída da build (a pasta que contém o conjunto de teste,
bin\Debug\net10.0\por exemplo). - Caminhos absolutos são utilizados tal como estão.
Importante
No MSTest 3.x, os itens de implementação são copiados por cada execução de teste. Para disponibilizar um ficheiro no momento da implementação, o ficheiro deve já existir (ou ser copiado para) o diretório de saída da compilação.
Candidatar-se [DeploymentItem]
O atributo pode ser aplicado a um método de teste, a uma classe de teste, ou a ambos. São permitidas múltiplas instâncias, que podem ser combinadas:
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
Quando se aplica [DeploymentItem] a uma classe de teste, a classe tem de conter pelo menos um método de teste. Aplicá-lo a uma classe que apenas tem métodos AssemblyInitialize ou ClassInitialize não produz qualquer efeito. O Analyzer MSTEST0035 sinaliza esse uso indevido.
Sobrecargas de construtores
DeploymentItemAttribute tem dois construtores: DeploymentItemAttribute(string path) e DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
Copia o ficheiro ou pasta identificado por path para a raiz do diretório de implementação.
// 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 os itens para um subdiretório do diretório de implementação, 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")]
O outputDirectory argumento deve ser um caminho de pasta. Não pode ser usado para renomear o ficheiro. Para implementar um ficheiro com um nome diferente, renomeie-o na pasta de origem (ou use um passo pós-compilação).
Garantir que os ficheiros de origem chegam ao diretório de saída da compilação
Como os caminhos relativos são resolvidos em relação ao diretório de saída da build, o ficheiro ou pasta de origem já deve estar lá. Existem duas formas comuns de conseguir isto.
Utilize <None> ou <Content> com CopyToOutputDirectory
Adicione os ficheiros ao seu projeto de teste e marque-os para copiar no diretório de saída da build:
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Após uma compilação, a TestFiles pasta é replicada em bin\<Configuration>\<TargetFramework>\TestFiles\, e [DeploymentItem("TestFiles")] resolve corretamente.
Use um alvo pós-construção
Para ficheiros que ficam fora do projeto de teste, copie-os para o diretório de saída da build como parte da build:
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
Inspecionar o diretório de implementação em tempo de execução
Se precisar do caminho absoluto do diretório de implementação — por exemplo, para o passar para um processo que gera ou para o registar 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 mais informações sobre TestContext, veja A classe TestContext.
Quando a implementação não acontece
Por predefinição, o MSTest cria um diretório de implantação por execução e copia itens para esse diretório. Podes desativar a implementação num .runsettings ficheiro para que os testes corram diretamente a partir do diretório de saída da compilação:
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
Quando a implementação está desativada, [DeploymentItem] os atributos não têm efeito, e o teste corre diretamente no diretório de saída da compilação. Para mais opções de configuração, consulte Configurar MSTest.
Modo legado e .testsettings
Quando o MSTest é executado em modo legado (é utilizado um ficheiro .testsettings ou RunSettings/MSTest/ForcedLegacyMode está definido como true num ficheiro .runsettings), os caminhos relativos podem ser resolvidos em relação ao diretório raiz da solução, em vez de ao diretório de saída da compilação. Evite o modo legado para novos projetos — a configuração moderna baseada em .runsettings é a abordagem recomendada.
Melhores práticas
- Prefiro
CopyToOutputDirectoryem vez de caminhos relativos profundos. Não acedas diretamente às pastas de origem através de caminhos no estilo..\..\— porque associam os teus testes a uma estrutura específica do repositório. Coloca primeiro os ficheiros no diretório de saída da build. - Mantenha os itens de implantação pequenos. Cada item é copiado em cada teste; ficheiros grandes atrasam a execução dos testes.
- Use pastas para implementar recursos relacionados em conjunto.
[DeploymentItem("TestFiles")]é mais fácil de manter do que dezenas de atributos por ficheiro. - Prefiro recursos embutidos ou dados em memória para dispositivos pequenos. Os recursos embutidos eliminam a necessidade de implantação e evitam I/O no tempo de teste.
- Não confies que o diretório de trabalho seja o diretório do projeto. Durante a execução do teste, o diretório de trabalho é o diretório de implementação, não a pasta do projeto de teste.