Como posso obter o "Copiar para Diretório de Saída" para trabalhar com testes de unidade?

123

Quando crio um projeto de teste de unidade antes da execução dos testes, a saída do teste é copiada para uma pasta TestResults e, em seguida, os testes são executados. O problema que estou tendo é que nem todos os arquivos no diretório Debug / bin são copiados para o projeto TestResults.

Como posso obter um arquivo que é copiado para o diretório Debug / bin e também para a pasta TestResults?

Eric Schoonover
fonte

Respostas:

121

A maneira padrão de fazer isso é especificando os itens de implantação no .testrunconfigarquivo, que podem ser acessados ​​por meio do item Editar configurações de execução de teste no menu Teste do Visual Studio ou na pasta Solution Items .

Mark Cidade
fonte
15
No VS2010, é o seguinte: Testar / Editar configurações de teste / local e, na lista, selecione "Implantação", marque a caixa "Ativar ..." e adicione o (s) arquivo (s).
Marcel
18
Você pode ter que fechar sua solução (ou mesmo Visual Studio) e reabrir antes de esta alteração tenha efeito corretamente
RobV
RobV, você fez o meu dia. OBRIGADO!
Ignacio Soler Garcia
2
Se você usar o atributo [DeploymentItem] no código, não precisará especificar os arquivos na caixa de diálogo - consulte o código do @ tomfanning abaixo.
Patrick Szalapski 16/07/12
Isso não resolve meu problema de copiar a saída de configuração da pasta bin ou release, porque em tempo de design, não tenho informações sobre se o arquivo estará na pasta de depuração ou release e, para mim, esse é o arquivo que não está sendo copiado para a pasta Out nos resultados dos testes
Gurpreet
61

Você pode especificar o atributo de implantação como um exemplo mostrado abaixo; Além disso, você precisa definir a propriedade "Conteúdo" e "Copiar se for mais recente" (não há documentação nas configurações posteriores, mas você as definiu para fazê-lo funcionar.

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
Sanjay10
fonte
3
Você ainda precisa habilitar isso. Como Mercel escreveu em seu comentário, no VS2010, este é: Teste / Editar configurações de teste / local e, na lista, selecione "Implantação", marque a caixa "Ativar ...".
Patrick Szalapski
Estou enfrentando esse problema no Visual Studio 2012 Express e, como é uma edição limitada, foi difícil encontrar uma documentação clara. Um grande obrigado por esta resposta.
DavidHyogo
2
Funciona bem. Na verdade, acho que esse é o melhor método e resposta, pois documenta os arquivos necessários logo acima do método de teste.
bu5hm4nn
1
Descobri que o atributo DeploymentItem também funciona quando especificado no nível da classe de teste (em vez do nível do método).
Jon Schneider
10

Eu tive que ativar "Ativar implantação" em Test -> Edit Test Settings -> Local -> Deploymentpara que o [DeploymentItem]atributo funcione.

tomfanning
fonte
Isso é verdade ... Eu apenas o habilitei e agora o atributo funciona. Obrigado!
Miguel Angelo
Como mencionado no meu comentário para outra resposta, estou enfrentando o mesmo problema no visual studio 2012 express e as 2 respostas juntas finalmente me deram a solução.
DavidHyogo
5

Todas as três respostas estão corretas, dependendo de suas necessidades.

Adicionando arquivos para implantar no .testrunconfig (.testsettings no VS2010) copiará todos esses arquivos para todas as pastas de saída de teste, mesmo para testes não relacionados executados isoladamente. Se você executar um teste, todos os arquivos de dados de teste listados na seção de implantação de .testssettings serão copiados para a pasta de saída de teste.

Nos meus testes, eu preciso copiar um arquivo XML esperado para a pasta de saída de teste para comparar com o XML real de saída de teste. Eu uso o atributo DeploymentItem para copiar apenas o arquivo XML relacionado aos testes que estão sendo executados. No VS2010, eu tive que ativar a implantação no arquivo .testsettings (mas não adicionar nenhum caminho) e, em seguida, referenciar o caminho do arquivo XML relativo ao TestProject no DeploymentItem.

Espero que isto ajude.

GraehamF
fonte
2
Meu problema foi o caminho relativo mencionado aqui, pensei que o Xml deveria estar no diretório em que o teste estava, mas precisava estar na raiz do projeto ou ser precedido pelo diretório em que estava.
Wes Grant
2

Eu tive um problema semelhante, mas o meu tinha a ver com apontar para o arquivo TraceAndTestImpact.testsettings em vez do arquivo Local.testsettings. Você pode mudar de um para outro no menu Testar / Selecionar configurações de teste ativas.

Simon
fonte
2

Gostaria apenas de aprimorar a resposta aceita, mencionando uma maneira de implementá-la especificamente para dll, em vez do método normal de usá-lo para dados ou configurações, etc., nas circunstâncias em que o CopyLocal não funciona:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
JamesDill
fonte
1

O seguinte funciona no VS2012 para projetos de teste incluídos em várias soluções sem usar um arquivo de configurações de teste:

1) Organize os arquivos e pastas que deseja implantar em uma pasta no diretório do projeto de teste.

2) Nas propriedades do projeto, crie uma etapa de pós-compilação

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)e $(TargetDir)são macros que serão interpretadas pelo VS e devem ser incluídas como tal.

<Project_Folder_Name> é o nome da pasta criada na etapa 1.

<Deployment_Folder_Name>é o nome da pasta na qual os arquivos de teste serão implantados e devem ser nomeados para que sejam exclusivos quando vários projetos de teste forem implantados no mesmo diretório, por exemplo <Project_Name>_TestInputs.

Os arquivos de teste em locais compartilhados também devem ser copiados para a pasta de implantação do diretório de destino para limitar as interações de teste. Forneça o caminho de origem em relação à $(ProjectDir)macro. Por exemplo "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Adicione um [DeploymentItem(source, destination)] propriedade a cada método de teste que use um arquivo de implantação (prática recomendada) ou à classe de teste (prática mais fácil para preguiçosos ou apressados ​​e a maneira mais fácil de atualizar um projeto os caminhos relativos usados ​​anteriormente ou um arquivo de configurações de teste )

Em um método de teste, sourceé o caminho para o arquivo ou diretório usado no método de teste em relação ao diretório de destino criado pelo xcopye destinationé o caminho para o diretório no qual ele será criado em relação ao diretório de implantação. Para que os testes sejam executados de maneira consistente no diretório de destino ou no diretório de implantação. O caminho de destino deve ser o mesmo que o caminho de origem sem uma referência de arquivo. Exemplo: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. A DeploymentItemdeve ser incluído em cada método que usa esse arquivo ou diretório.

Em uma classe sourcee destinationsão o nome da pasta criada no diretório de destino peloxcopy ; isso copiará a pasta inteira para o diretório de implantação quando qualquer teste da classe for executado. Exemplo:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) Nos métodos de teste, agora você pode acessar arquivos e diretórios com confiança de que eles estarão no diretório de trabalho, independentemente de onde o Visual Studio tenha decidido colocá-lo naquele dia, por exemplo File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
fonte
0

Experimente a linha de comando do evento Pós-Compilação no Visual Studio (se você estiver usando esse IDE).

Kasper
fonte
3
Estou, mas isso parece um pouco de hack. Esse deve ser um cenário bastante comum e espero que exista apenas alguma opção ou propriedade que não estou configurando corretamente.
Eric Schoonover
0

No Visual Studio 2012, você não precisa de um atributo DeploymentItem para o caso simples. Veja minha resposta aqui

acarlon
fonte
0
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
Nina
fonte
0

A resposta aceita está correta e a maioria das outras respostas também. No entanto, ao longo dos anos, descobri que o sistema Deploment dos testes de unidade do Visual Studio usando DeploymentAttribtue e Copy to Output é complicado se você tiver um grande número de arquivos de dados. Descobri que manter os arquivos em seu local original funcionava melhor.

Detalhes completos na minha outra resposta aqui. https://stackoverflow.com/a/53004985/2989655

Espero que isto ajude.

Sau001
fonte