Problemas com atributo DeploymentItem

votos
86

Estou actualmente a manutenção de um sistema velho, escrito em C # .net, removendo algumas características obsoletas e fazer algumas refatoração. Graças a Deus, o cara anterior escreveu alguns testes de unidade (MSTests). I bastante confortável com testes JUnit, mas não fazer ainda muito mais com MSTests.

Os métodos de ensaio têm um DeploymentItematributo, especificando um arquivo de texto que é analisado pelo método de lógica de negócios que está sendo testado e um 2º DeploymentItem, onde apenas um caminho foi especificado que contém um monte de arquivos TIF que têm de ser implantado também.

[TestMethod()]
[DeploymentItem(@files\valid\valid_entries.txt)]
[DeploymentItem(@files\tif\)]
public void ExistsTifTest()
{
   ...
}

Os testes trabalhou antes, mas agora eu tive que mudar os nomes dos arquivos TIF contidas nos arquivos \ \ diretório tif. De acordo com uma regra, os nomes de arquivo TIF tem que coincidir com um certo padrão que também é verificada pelo ExistsTifTest()método. Agora eu tive que mudar os nomes de arquivos, a fim de adaptá-los às novas exigências e suddently os arquivos TIF são não mais sendo implantado como antes.

Alguém pode me dar uma dica por que isso acontece ou o que pode ser a causa? A mesma coisa acontece também se eu adicionar um novo texto-file dizer my2ndTest.txt ao lado do valid_entries.txt nos arquivos \ \ pasta \ válido com o segundo atributo DeploymentItem no método de teste. O arquivo não se implantado?

Eu tenho as imagens agora implantados por definir o caminho de implantação diretamente na testrunconfig, mas eu gostaria de entender por que essas coisas acontecem ou porque, por exemplo, o meu novo arquivo my2ndTest.txt não se implantado enquanto os outros fazem.

Publicado 19/05/2009 em 15:55
fonte usuário
Em outras línguas...                            


20 respostas

votos
95

DeploymentItem é um pouco de uma confusão.

Cada arquivo na sua solução terá um "Copiar para pasta de saída" configuração no VS.NET. Você precisa disso para ser "Copy Always" (ou similar), a fim de obter os arquivos para a pasta de saída.

Verifique se você tem este conjunto para os novos arquivos. Se você não tem esse conjunto, em seguida, os arquivos não serão copiados para a pasta de saída e, em seguida, eles não podem ser implantados a partir da pasta de saída para a pasta onde MSTest faz coisas.

Pessoalmente, se eu tiver arquivos que eu preciso para os meus testes unitários Descobri que incorporar esses arquivos como recursos em uma montagem, e ter essa montagem "desempacotar"-se durante os testes é uma maneira mais previsível de fazer as coisas. YMMV.

Atenção: Estes comentários são baseados na minha experiência com VS2010. Comentários a minha resposta sugeriria que isso não é problema com VS2012. Eu ainda mantenho a comentários que o uso de recursos incorporados envolve menos "magia" e, para mim, faz a "organizar" estágio dos meus testes de unidade muito mais explícito.

Respondeu 19/05/2009 em 15:58
fonte usuário

votos
72

No VS2010, meus Local.testsettings tinha o "Ativar implantação" desmarcada eo atributo DeploymentItem não estava funcionando. Eu verifiquei e tudo funcionou bem. Eu espero que isso ajude!

Respondeu 27/07/2010 em 17:59
fonte usuário

votos
17

Eu também têm enfrentado problemas semelhantes, mas eu achei solução fácil de 3 etapas para isso:

Supondo que sua estrutura de pasta se parece com isso: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. Vá em "Soluções de Itens / Local.testsettings"> "Implantação"> Verifique "Ativar implantação"
  2. Se você estiver usando VS2010, certifique-se os arquivos que você deseja implantar ter sua propriedade "Copiar para pasta de saída" definido para "Copiar Sempre" ou "Copy if newer"
  3. Atribui o seu TestMethod com qualquer um dos seguintes:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]para implantar todos os conteúdos de <SubFolder>para o diretório Test Run
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] para implantar todo o conteúdo do <SubFolder>que <TargetFolder>no diretório Test Run

Uma nota final sobre MSTest (pelo menos para VS2010):

Se você quer a <TargetFolder>ter o mesmo nome que o <SubFolder>, usando [DeploymentItem(@"SubFolder", @"SubFolder")]falhará silenciosamente como o corredor MSTest atinge um caso extremo bobo. É por isso que você deve prefixar o <SubFolder>com o <TestProjectFolder>assim:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

Respondeu 29/08/2013 em 07:40
fonte usuário

votos
14

Para espero ajudar alguém fora: Eu tentei todas as sugestões aqui e ainda o meu item de implantação não estava sendo copiado.

O que eu tinha que fazer ( como sugerido aqui ) foi adicionar um segundo parâmetro para o atributo DeploymentItem:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
Respondeu 24/01/2012 em 20:11
fonte usuário

votos
10

Se você entrar em seu arquivo .testrunconfig e sob desmarque implantação "Ativar implantação", os testes serão executados na sua localização normal, e tudo vai funcionar como ele faz ao executar o aplicativo fora de um teste de unidade.

Respondeu 19/03/2010 em 18:19
fonte usuário

votos
8

Isso provavelmente não se relacionam com o seu problema exato, mas aqui está um par de dicas que encontrei com o atributo [DeploymentItem].

  1. Copiar para o diretório de saída deve ser definido para copiar sempre.

Ele não funciona quando utilizado com o atributo [TestInitialize]

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

Ele deve estar no seu [TestMethod], por exemplo,

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
Respondeu 19/07/2011 em 16:27
fonte usuário

votos
4

Depois de tentar todas as outras sugestões listadas aqui eu ainda não conseguia descobrir o que estava acontecendo. Finalmente eu descobri que não havia nenhum arquivo de configurações selecionadas no menu Teste / Configurações de teste, o que significava que a implantação não estava sendo habilitado. Eu cliquei no / Configurações de teste / Select Configurações de teste item de menu Arquivo de teste, selecionou o arquivo Local.TestSettings, então tudo funcionou.

Respondeu 15/11/2012 em 22:20
fonte usuário

votos
4

Não sei se isso responde exatamente a questão, mas pode ajudar alguns. Em primeiro lugar, eu encontrei a caixa "Ativar implantação" deve ser verificado para a implantação de trabalhar. Em segundo lugar, o doc diz que o caminho de origem é "relativo ao caminho do projeto", que num primeiro momento eu levei para significar a pasta do projeto. Na verdade, ele parece referir-se a pasta de saída da compilação. Então, se eu tenho uma pasta projeto chamado 'TestFiles' e um arquivo em que chamou Testdata.xml, usando o atributo desta forma não funciona:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

I pode marcar o Testdata.xmlarquivo Copy Always, de modo que a construção coloca uma cópia na pasta de saída (por exemplo, Debug\TestFiles\TestData.xml). O mecanismo de implantação irá então encontrar a cópia do arquivo localizado na esse caminho ( TestFiles\Testdata.xml) em relação à saída da compilação. Ou, eu posso definir o atributo da seguinte maneira:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

e o mecanismo de implantação vai encontrar o arquivo original. Assim, ou obras, mas tenho notado que a utilização do Copy AlwaysI ocasionalmente correr para o mesmo problema que eu tenho ao editar o arquivo config em um projeto - se eu não alterar o código ou forçar uma reconstrução, nada desencadeia a cópia de arquivos marcados para ser copiado em construção.

Respondeu 23/07/2012 em 20:02
fonte usuário

votos
3

Eu tinha bandeira implantação desativada em primeiro lugar. Mas mesmo depois de eu lhe permitiu, por alguma razão desconhecida nada mesmo alvo DLLs ainda seria copiado. Acidentalmente abri a janela Test Run e matou todas as execuções anteriores e magicamente eu encontrei todas as DLLs e arquivos que eu precisava na pasta teste muito próxima corrida ... Muito confuso.

Respondeu 15/09/2011 em 19:20
fonte usuário

votos
2

Eu estava tendo problemas enormes tentando obter arquivos para implantar - tentar todas as sugestões acima.

Então eu fechei VS2010; reiniciou, carregado a solução e tudo funcionou. (!)

Eu fiz alguns testes; Depois de definir a flag 'Ativar implantação' on local.TestSetting você não deve simplesmente re-executar o teste na janela Resultados do teste. Você tem que obter o teste anterior removido da interface do usuário, por exemplo, executando um teste diferente, ou por re-abrir a sua solução.

Respondeu 11/01/2013 em 17:41
fonte usuário

votos
1

Para mim, a causa raiz era algo totalmente diferente: o código de produção que está sendo exercido por meus testes foi renomear e / ou apagar o arquivo de teste .xml que está sendo implantado.

Portanto, quando eu corria meus testes individualmente, eles passam, mas quando executá-los todos juntos, o 2º eo teste posterior iria falhar com erros "Arquivo não encontrado" (que eu tinha originalmente diagnosticadas como o DeploymentItematributo não trabalho).

Minha solução foi fazer com que cada método de ensaio individual fazer uma cópia do arquivo implantado (usando esta técnica ), e depois ter o código de produção que está sendo testado o uso do arquivo copiado em vez do original.

Respondeu 05/11/2015 em 15:13
fonte usuário

votos
1

Para aqueles que preferem evitar a confusão de DeploymentItem e tomar a abordagem sugerida pela @ Martin Peck (resposta aceita), você pode usar o seguinte código para acessar o conteúdo do recurso incorporado:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

Para mais detalhes, consulte este SO Tópico

Respondeu 22/10/2014 em 10:14
fonte usuário

votos
1

Eu tenho trabalhado sobre isso no VS2013. Minhas descobertas para começar este trabalho:

  • Copiar para o diretório de saída deve ser definido como Copiar Sempre: obrigatório.
  • "Ativar implantação" em .TestSettings: Não necessário. Eu tenho esta trabalhando sem um arquivo .TestSettings em tudo.
  • Especificando uma pasta como segundo parâmetro: OPCIONAL. Molda o layout pasta de saída, funciona bem sem.
  • Espaços no nome do arquivo: isso causou-me uma dor de cabeça - o arquivo não foi copiado. Removendo os espaços fixos isso. não olhei para caracteres de escape ainda.

Uma dica que eu também aprendi da maneira mais difícil: não se esqueça de adicionar este atributo para cada teste individual. As cópias de arquivos no primeiro teste atribuído na TestRun, mas manteve-se ausente quando o fim dos testes mudou e testes não-atribuídos tentou encontrar o arquivo primeiro.

Respondeu 24/06/2014 em 14:37
fonte usuário

votos
1

Tente isto para VS2010. Assim você não precisa adicionar DeployItems para cada tif
Remova o

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

Adicionar uma configuração de teste.
- botão direito do mouse no nó de solução no Solution Explorer
- Adicionar -> New Item ...
- Selecione o nó Configurações de teste à esquerda, selecione o item à direita
- Clique em Adicionar

Chamá-lo de exemplo TDD

Escolha TDDsob TestMenu> Edit Testsettings.

Clique na implantação. Ativá-lo e, em seguida, Adicionar os arquivos e diretórios que você want.There será um caminho relativo para a solução. Os arquivos serão colocados em. O arquivo original são, por exemplo aqui:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

Quando eu executar o meu teste de unidade que é copiado para

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

em testcode Eu chamo isso de:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

Não há necessidade de escolher Copiar Sempre; colocar os arquivos no TestProject; adicionar caminhos codificados no testcode. Para mim esta solução funcionou melhor. Eu tentei com DeploymentItem, cópia sempre, mas não era para o meu gosto.

Respondeu 17/12/2011 em 18:24
fonte usuário

votos
1

Desde que eu sempre achei o DeploymentItem atribuir uma bagunça, eu faço a implantação de tais arquivos usando o script pós-compilação. - Verifique se os arquivos que você quer copiar tem a propriedade Copiar Sempre set. - Modificar o script de pós-build projeto de teste para copiar os arquivos da pasta de destino de compilação (Bin \ Debug) até o local onde o teste está esperando por eles.

Respondeu 08/04/2011 em 21:42
fonte usuário

votos
0

Não use DeploymentItem.

É muito difícil de configurar corretamente e não foi trabalhar com o meu corredor de teste ReSharper nem o nativo para MSTEST no Visual Studio 2017.

Em vez disso, clique direito seu arquivo de dados, e selecione Propriedades . Selecione Copiar para o diretório de saída: Sempre .

Agora em seu teste, fazer isso. O diretório é simplesmente o diretório do arquivo relativo ao projeto de teste. Fácil.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

Embargo. Eu não tenho idéia se isso funciona bem com sistemas de compilação e de testes automatizados. Eu não estou lá ainda.

Respondeu 16/08/2017 em 14:31
fonte usuário

votos
0

Além do atributo implantação precisa ser verificado, descobri algo mais sobre o atributo DeploymentItem.

[TestMethod()]
[DeploymentItem("fodler\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

Seu deploymentFile.txt precisa ser relavite para o arquivo de solução e não os testfile.cs.

digite descrição da imagem aqui

Respondeu 19/12/2016 em 10:01
fonte usuário

votos
0

Nós gastamos muito tempo pela implantação itens problema para resolvê-lo no prazo unittest local e TeamCity Reun unittest também. Não é fácil.

Muito boa ferramenta para depurar esse problema é ProcessExplorer . Usando o Process Explorer, você pode verificar onde é Visual Studio procurando os itens de implantação e faça a correção para o projeto. Apenas filtrar toda operação de arquivo em que caminho contém o nome do arquivo DeploymentItem e você vai vê-lo.

Respondeu 05/12/2016 em 10:46
fonte usuário

votos
0

Eu também têm enfrentado problemas semelhantes. Eu tenho todas as etapas mencionadas acima, mas ainda não sorte. Eu estou usando VS2010. Então eu descobri que $ Menu> Teste> Seleccione Definição de Teste ativa> Traço e impacto teste foi selecionado. Ele começou a trabalhar depois de eu mudar rastreamento e impacto teste para local . Esta página contém informações muito engenhoso sobre como copiar arquivos para testar pasta de resultados, sinto-me para adicionar esta experiência também.

Respondeu 11/07/2014 em 10:26
fonte usuário

votos
0

Meu grande "pegadinha" foi a maneira DeploymentItem lida com diretórios. Eu estava usando a versão de dois parâmetros com tanto como caminho do diretório contendo subdiretórios eu queria implantados. Eu não sabia que, inicialmente, que apenas copia as coisas na raiz do diretório e não toda a estrutura de pastas recursiva!

Basicamente, eu tinha [DeploymentItem (@ "Foo \", @ "Foo \")] e estava esperando-o para implantar o meu Foo \ Bar. I especificamente teve que mudá-lo para [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")] e agora ele funciona como um encanto.

Respondeu 10/04/2014 em 17:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more