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)

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");
        }
    }
}

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)



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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.