No Visual Studio 2010, tenho vários testes de unidade. Quando executo vários testes ao mesmo tempo usando listas de teste, às vezes recebo o seguinte erro para um ou mais dos testes:
O processo do agente foi interrompido durante a execução do teste.
Nunca é o mesmo teste falhando, e se eu tentar executá-lo novamente, ele será bem-sucedido.
Encontrei este relatório de bug no Connect , que parece ser o mesmo problema, mas não oferece uma solução.
Alguém mais viu esse comportamento? Como posso evitar isso?
Editar
Ainda estou enfrentando esse bug, assim como muitos dos meus colegas na mesma configuração de software / hardware. Avaliei as respostas até agora, mas elas não resolvem o problema. Estou começando uma recompensa para uma solução para este problema.
Respostas:
Acabei de experimentar um problema semelhante: alguns testes falham e são diferentes em diferentes execuções de teste. Não sei exatamente por que isso acontece, mas começou a ocorrer quando adicionei um finalizador a uma de minhas aulas. Quando eu desabilito o finalizador - o problema desaparece. Quando ligo o finalizador - o problema volta.
No momento, não sei como superar isso.
fonte
Esta mensagem é causada por uma exceção em um thread diferente do thread de teste em execução . Todas as respostas até agora se resumem a esta explicação simples. Nesse caso, é um bug conhecido do Visual Studio não exibir nenhuma informação útil.
O executor de teste do Visual Studio engasga totalmente se um thread diferente do thread de teste em execução lançar uma exceção: ele é engolido e não há saída, nenhuma chance de interceptar e depurar e nada exceto uma bagunça queimada e latente que deveria ser sua unidade teste.
fonte
async void
método que é chamado durante o teste lança uma exceçãoEu estava tendo esse problema e acabou sendo um problema no meu código que o Test Framework não estava capturando corretamente. Uma pequena refatoração acidental me deixou com este código:
É claro que isso é uma recursão infinita e causou uma StackOverflowException (eu acho). O que isso causou foi o temido: "O processo do agente foi interrompido enquanto o teste estava em execução."
Uma rápida inspeção do código me mostrou o problema e meus testes agora estão funcionando bem. Espero que isso ajude - pode valer a pena inspecionar o código em busca de problemas, ou talvez extrair um pouco em um aplicativo de console e verificar se ele funciona corretamente lá.
fonte
Consegui encontrar a origem do meu problema procurando no arquivo de resultado do teste (/TestResults/*.trx). Ele forneceu todos os detalhes da exceção que ocorreu no thread de segundo plano e, assim que resolvi essa exceção, o "agente processou parou ... "o erro foi embora.
No meu caso, eu estava lançando acidentalmente a GUI em meu teste de unidade, o que eventualmente fez com que uma System.ComponentModel.InvalidAsynchronousStateException fosse lançada.
Portanto, meu arquivo .trx continha:
Isso não forneceu nenhuma informação sobre qual teste causou o erro, mas me mostrou onde estava a exceção, o que foi muito útil.
fonte
Essa mensagem normalmente é gerada quando o processo de teste falha e pode acontecer quando há uma exceção não tratada em um encadeamento em segundo plano, ocorre um estouro de pilha ou uma chamada explícita para
Process.GetCurrentProcess().Kill()
ouEnvironment.Exit
. Outra causa possível é uma violação de acesso em código não gerenciado.Algo que ninguém mencionou é que pode haver informações adicionais no log de eventos. Normalmente, você não obterá muitas informações sobre o motivo da falha do teste nos resultados, no entanto, no caso de uma exceção não tratada em um thread de segundo plano, a estrutura de teste grava detalhes no log de eventos do aplicativo com a origem VSTTExecution. Se não houver informações gravadas no log de eventos, é provável que seja uma das outras causas listadas acima.
fonte
No meu caso, a solução foi resolvida verificando a janela de saída .
No meu caso, tive um FileSystemWatcher que estava gerando um erro em um thread separado.
fonte
Eu encontrei o mesmo problema e resolvi durante a remoção
Portanto, tenho certeza de que esse erro ocorre enquanto o teste ou método em teste está causando o encerramento do processo de execução.
fonte
Obrigado por postar a pergunta. Acabei de encontrar esse problema e descobri uma causa que você pode estar encontrando.
Durante minha configuração de teste, crio um objeto que enfileira um thread de trabalho no pool de threads. Se eu executar a depuração rápido o suficiente, meu código será aprovado.
Se o thread de trabalho for iniciado e tiver um erro ANTES da conclusão da configuração do teste, recebo o resultado Abortado sem raciocínio.
Se o thread de trabalho for iniciado e tiver um erro APÓS o início do teste, obtenho o resultado de: Erro - O processo do agente foi interrompido durante a execução do teste.
Importante observar: este é um componente que utilizo em vários de meus testes. Se a estrutura de teste encontrar muitos desses erros, ele aborta o restante dos testes.
Espero que isto ajude
fonte
Eu adicionei blocos try / catch ao descrutor ~ ClassName () {} que foram definidos em qualquer classe envolvida em meus testes. Isso resolveu o problema para mim.
fonte
Para descobrir onde a exceção foi lançada, clique no hiperlink "Erro de execução de teste" ao lado do ícone de exclamação na janela Resultados do teste. Uma janela com o rastreamento de pilha é aberta.
Isso ajuda muito a rastrear o erro!
fonte
Eu tive o mesmo problema e foi causado por um finalizador para um recurso não gerenciado (um gravador de arquivo que não estava sendo descartado corretamente por algum motivo).
Depois de envolver o código finalizador em um try-catch que engole a exceção, o problema desapareceu. Eu não recomendo engolir exceções como essa, então obviamente seria sábio descobrir por que a exceção está ocorrendo em primeiro lugar.
fonte
Já vi isso acontecer em ocasiões ímpares, e o culpado quase sempre acaba sendo o threading.
Estranhamente, todos os testes funcionariam bem nas máquinas de desenvolvimento e, em seguida, falhariam aleatoriamente nos servidores de construção.
Em uma inspeção mais detalhada, descobriu-se que, embora os testes estivessem sendo listados como aprovados nas caixas de desenvolvimento, havia exceções sendo lançadas. As exceções estavam sendo lançadas em um thread separado que não foi considerado um erro.
Os detalhes da exceção estavam sendo registrados em relação ao rastreamento de teste, portanto, pudemos identificar quais códigos / testes precisavam ser modificados.
Espero que isso ajude alguém.
fonte
No meu caso, tive alguns testes de unidade para um serviço WCF. Este serviço WCF estava inicializando 2 temporizadores.
Esses temporizadores causaram efeitos colaterais.
-> Eu desabilito esses temporizadores por padrão e está tudo bem!
BTW: eu uso o WCFMock para falsificar o serviço WCF, então tenho testes de unidade "reais" em torno do meu serviço WCF
fonte
Este erro foi causado por um Finalizer para mim também.
O Finalizer estava realmente chamando algum código DB que não foi simulado. Levei um tempo para encontrá-lo, pois não era uma aula que eu escrevi e a referência a ele estava profundamente enterrada em algumas aulas.
fonte
Eu tive um problema semelhante em que um teste está falhando em TestInitialize e também está executando o código de um ddl de outro dos meus projetos. Recebo a mensagem de erro conforme descrito acima e, se tentar depurar o teste, ele será cancelado sem nenhum detalhe de exceção.
Suspeito que o problema pode ser que as dlls de meu outro projeto são de um projeto Visual Studio 2012 e estou executando meus testes em um projeto VS2010 e / ou possivelmente que as versões dll UnitTestFramwork dos 2 projetos são incompatíveis.
fonte
O problema também pode ser disparado por uma Exception ou Stackoverflow no Construtor de uma TestClass.
fonte
Como esse erro pode ter muitas causas diferentes, gostaria de adicionar outro para completar este tópico.
Se todos os seus testes estão sendo abortados conforme descrito pelo OP, a causa pode ser uma configuração de projeto errada. No meu caso, a estrutura de destino foi definida como .NET Framework 3.5. Configurá-lo para uma versão superior por meio da página de propriedades do projeto (guia Aplicativo ) resolveu o problema.
fonte
Consegui determinar o que estava causando meu problema procurando nas entradas de log do Windows Logs > Application no Windows Event Viewer . Procure entradas no momento em que o teste foi bombardeado. Eu tive uma entrada de erro semelhante a abaixo:
Na verdade, era uma exceção de referência nula em um método chamado de um finalizador de classe.
fonte
Para qualquer um que está passando por cima dessa velha questão e se perguntando o que está sendo jogado em seu (s) tópico (s), aqui vai uma dica. O uso de Task.Run (em oposição a, digamos, Thread.Start) relatará exceções de thread filho de maneira muito mais confiável. Resumindo, em vez disso:
Faça isso:
E seus logs de erro devem ser muito mais úteis.
fonte