Arquivo de cópia MSTest para pasta de execução de teste

108

Eu tenho um teste que requer um arquivo XML para ser lido e depois analisado. Como posso copiar esse arquivo para a pasta de execução de teste todas as vezes?

O arquivo XML é definido como "Copiar se mais recente" e um modo de compilação "nenhum" (já que não é realmente uma coisa compilável)

Aaron Powell
fonte

Respostas:

131

use um 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
fonte
17
O atributo DeploymentItem também pode ser especificado no nível da classe, para afetar todos os testes da classe.
Hannes Nel
24
Não se esqueça de que, se você tiver seus itens em uma subpasta, inclua-os também no subdiretório de implantação [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb
31
Na sequência do comentário de Thomas, o valor padrão para RelativePathRoot é a pasta de solução, portanto, se sua solução for assim (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt) Seu DeploymentItem seria assim .. ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. e você faria referência ao arquivo no teste usando isso .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann
6
Documentação DeploymentItemAttribute para VS2010 : Este atributo pode ser especificado em um método de teste ou em uma classe de teste.
Alex Che
12
O que a maioria das postagens que vi que não mencionam é que, se você não consegue fazer isso funcionar, provavelmente precisa marcar a caixa de seleção "Habilitar implantação", que pode ser encontrada se for em Teste -> Editar configurações de teste -> local (local.testsettings) -> guia Implementação. Acabei de fazer isso e, em seguida, DeploymentItem funcionou bem.
Dave de
26

Parece que, se você fornecer um arquivo TestSettings para a solução, poderá desmarcar a opção "Ativar implantação" e impedir que o mstest tente executar a partir da ...TestResults\...\outpasta onde não copia seus arquivos extras (a menos que você os torne uma opção de implantação) .

Isso também é útil se você depender dos arquivos extras em uma estrutura de pasta preservada porque todos os itens de implantação parecem ser copiados diretamente (simples) para a pasta de execução temporária (saída) se você usar a opção Implantação, Adicionar pasta em TestSettings ( as respostas acima sugerem que você pode manter a estrutura se adicionar cada item como seu próprio DeploymentItem).

Para mim funcionou bem executar testes diretamente no Visual Studio (ou seja, meus arquivos extras em sua estrutura foram encontrados e usados ​​por testes) porque eu havia criado um arquivo TestSettings por outro motivo há muito tempo (que tem Ativar implantação desmarcado), mas não quando TeamCity executei o mstest para executar os testes porque não especifiquei que o arquivo TestSettings deveria ser usado.

Para criar um arquivo TestSettings no Visual Studio, clique com o botão direito na Solução e escolha Novo Item, e selecione o modelo TestSettings. Para usar o arquivo TestSettings no prompt de comando de mstest.exe, adicione a opção /testsettings:C:\Src\mySolution\myProject\local.testsettings (ou adicione como uma opção de linha de comando extra no TeamCity com o caminho apropriado)

TamW
fonte
3

A melhor solução para mim é usar as configurações de teste, especialmente se vários testes precisarem dos mesmos arquivos de dados.

Primeiro crie um arquivo testsettings e adicione os itens de implantação necessários (nome do arquivo ou pasta):

<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>
<...../>
  • Executando no Visual Studio, use "selecionar arquivo de configurações de teste" no menu "Testar \ Configurações de teste" para selecionar novas configurações de teste

  • Executando mstest, use o parâmetro / testsettings para que mstest use suas configurações de teste.

FrankyHollywood
fonte
2

Você pode definir DeploymentItem em uma classe que contém um método com o atributo AssemblyInitialize. Então, você tem certeza de que os arquivos são copiados independentemente de qual teste você executa.

Infelizmente, o atributo DeploymentItem é executado apenas em classes que contêm testes que você está executando. Portanto, se você tiver 10 classes de teste que usam o mesmo conjunto de arquivos, será necessário adicionar o atributo a todos eles.

Também descobri que as alterações nos arquivos * .testsettings não são atualizadas automaticamente no Visual Studio. Portanto, depois de adicionar arquivos / pastas na implantação em testsettings, você deve reabrir o arquivo de solução e, em seguida, executar os testes.

Sielu
fonte
2

No Visual Studio 2012, vstest.console.exe (o executor de teste integrado) é executado com o dir de saída como o caminho atual. Isso significa que você só precisa incluir os itens em sua solução com a propriedade 'Copiar sempre' ou 'Copiar se mais recente' para que eles sejam usados ​​em seu teste. Você não precisa do atributo DeploymentItem para o caso geral. O mesmo se aplica ao executar vstest.console.exe a partir da linha de comando dentro do diretório de saída / teste.

Existem alguns casos em que uma pasta separada é usada, um deles quando você está usando o atributo DeploymentItem. Veja aqui para mais informações.

acarlon
fonte