Como gravar no Console.Out durante a execução de um teste MSTest

114

Contexto:
Temos alguns usuários relatando problemas com um recurso de upload de arquivo em nosso aplicativo da web. Isso só acontece ocasionalmente e sem nenhum padrão especial. Temos tentado descobrir isso por um longo tempo, adicionando informações de depuração em qualquer lugar que possamos achar que pode ajudar, rastreando os logs, etc., mas não fomos capazes de reproduzir ou descobrir.

Problema:
agora estou tentando reproduzir isso usando MSTest e WatiN para repetir a operação que deve falhar um grande número de vezes (várias centenas). Só para ter uma ideia sobre o quão longe no loop o teste foi, quero imprimir algo como:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

No entanto, isso não aparece na janela de saída. Agora eu sei que você vai ter a saída do console nos resultados do teste (bem como o que você saída Debug.Writelineetc), mas este não está disponível até após a conclusão do teste. E como meu teste com centenas de repetições pode levar algum tempo, gostaria de saber o quão longe ele foi.

Pergunta:
Existe uma maneira de obter a saída do console na janela Saída durante a execução do teste?

Julian
fonte
Se você procura uma forma de imprimir na saída do resultado do teste: stackoverflow.com/a/4787047/621690
Risadinha

Respostas:

111

A saída do console não está aparecendo porque o código de back-end não está sendo executado no contexto do teste.

Você provavelmente é melhor usar Trace.WriteLine(In System.Diagnostics) e, em seguida, adicionar um listener de rastreamento que grava em um arquivo.

Este tópico do MSDN mostra uma maneira de fazer isso.


De acordo com os comentários de Marty Neal e Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
Andras Zoltan
fonte
73
Então, basicamente, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal
7
Hmmm, estou descobrindo que a sugestão de @Martin Neal envia ambos Trace.WriteLine()e a Console.WriteLine()saída para a Visualização de resultados do teste , não para a Visualização de saída . (E observe que na Visualização dos resultados do teste , pode ser necessário adicionar a coluna Output (Stdout) clicando com o botão direito e selecionando Add / Remove Columns .... ) Mas, talvez eu ainda não esteja vendo a saída na Output Visualizar significa que estou faltando alguma coisa ...
DavidRR
3
Trace.Listeners.Add(new ConsoleTraceListener());é suficiente e, em seguida, Mostrar a saída de Depurar na janela de saída.
Dave Anderson
3
Eu estava lutando para realmente encontrar a saída no VS2017 ... Janela TestExplorer -> Clique em um teste individual -> Se o teste teve saída, na janela de detalhes sob o tempo decorrido há a palavra "saída" que é um link para uma nova janela.
Mike Walsh
2
Se você estiver usando o Xunit, basta pegar ITestOutputHelper por meio do ctor e chamar WriteLine nele. Demorou um pouco antes de descobrir como escrever durante os testes de integração, espero que isso ajude alguém.
Alexander Høst
69

Use o Debug.WriteLine. Isso exibirá sua mensagem na Outputjanela imediatamente. A única restrição é que você deve executar o teste no Debugmodo.

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

Resultado

insira a descrição da imagem aqui

chaliasos
fonte
8
requerusing System.Diagnostics;
kmote
5
Não use DateTime.Now. É melhor usar o cronômetro ( msdn.microsoft.com/en-us/library/… )
suizo
1
Eu não consegui fazer isso funcionar. Quando eu executo o teste, a janela de saída muda imediatamente para Build e nada é enviado para Debug. Seus pensamentos?
InteXX
5
@InteXX certifique-se de clicar em "Depurar o teste", não em "Executar o teste". funcionou para mim
John Henckel
@JohnHenckel: Gotcha. Obrigado. Vou fazer isso. Na verdade, Schaliasos diz exatamente isso em sua resposta; não tenho certeza de como eu perdi isso.
InteXX de
13

Eu encontrei uma solução própria. Sei que a resposta de Andras é provavelmente a mais consistente com o MSTEST, mas não tive vontade de refatorar meu código.

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

O descartável ConsoleRedirectoré definido como:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}
SimplyKnownAsG
fonte
3

Eu tive o mesmo problema e estava "executando" os testes. Se, em vez disso, eu "Depurar" os testes, a saída de Depuração será exibida perfeitamente como todos os outros Trace e Console. Não sei embora como ver a saída se você "Executar" os testes.

Gökhan Kurt
fonte
Posso conseguir algo para mostrar usando System.Diagnostics.Debug.WriteLinedurante a depuração de testes, mas como você começa Console.WriteLinea trabalhar? Isso não termina na saída normal (atualização ao vivo) para mim.
OR Mapper de
Você encontrou alguma maneira de ver as saídas durante a execução de testes?
hima
0

É melhor você configurar um único teste e criar um teste de desempenho a partir desse teste. Dessa forma, você pode monitorar o progresso usando o conjunto de ferramentas padrão.

Riezebosch
fonte
"Desta forma, você pode monitorar o progresso usando o conjunto de ferramentas padrão." - como? O problema que estou vendo é exatamente que quando um teste é executado, ele é uma caixa preta e eu só consigo ver a saída (que estou escrevendo gradualmente enquanto o teste está sendo executado) depois que o teste termina de ser executado, na janela Saída .
OR Mapper de