TraceListener Para Testes

No meu código faço uso extensivo de asserções de debugi (see System.Diagnostics.Debug.Assert). Estas asserções são muito uteis quando em debug porque deixa de ser necessário, uma a uma, percorrer todas as linhas de código para verificar que todas as pré-condições são satisfeitas. Assim que uma pré-condição falhar, é lançada uma janela com a informação da asserção e que nos permite abortar a execução (abort), ignorar e continuar (ignore) ou ir para a instrucção de asserção (retry).

Imaginem este código:

private void IKnowForSureThatANullStringWillNeverBePassed(string text)
{
    System.Diagnostics.Debug.Assert(string != null, "text is null.");

    // ...
}

Porque o método é privado, tenho todo o controlo dos valores que são passados no parâmetro text, estou a afirmar que nunca terá o valor null. Porque pode não ser óbvio que o valor de text nunca será null, a asserção funciona também como documentação.

Costumo correr os meus testes unitários e de integração em compilações de debug e estas asserções seriam muito úteis fazendo os testes falharem quando corro os meus testes unitários e de integração quando uma asserção falha em vez de continuar com a execução do método e falhar numa NullReferenceException. Foi por isso que eu (e mais pessoas) escrevi este simples TraceListener:

public class TraceListener : global::System.Diagnostics.TraceListener
{
    public static readonly TraceListener Default = new TraceListener();

    protected TraceListener()
    {
        this.Name = "Testing Trace Listener";    
    }

    protected TraceListener(string name)
        : base(name)
    {
    }

    public override void Write(string message)
    {
    }

    public override void WriteLine(string message)
    {
    }

    public override void Fail(string message, string detailMessage)
    {
        var builder = new global::System.Text.StringBuilder();

        builder.Append(message);

        if (detailMessage != null)
        {
            builder.Append(" ");
            builder.Append(detailMessage);
        }

        throw new global::Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException(builder.ToString());

    }
}

Este trace listener não escreve nada. Limita-se a disparar uma AssertFailedException quando é chamado o método Fail, que é o que acontece quando uma asserção falha.

Porque uma janela de falha de asserção não é desejável quando se estão a correr testes (especialmente se forem corridos de forma automática com parte de um processo de buil), o melhor é desabilitar a interface visual das asserções no ficheiro de configuração do projecto de testes.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <assert assertuienabled="false"/>
        <trace>
            <listeners>
                <add name="TestTraceListener"
                     type="PauloMorgado.TestTools.VisualStudio.UnitTesting.Diagnostics.TraceListener, PauloMorgado.TestTools.VisualStudio" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>
Podem encontrar isto (e mais) em PauloMorgado.TestTools no CodePlex.

Leave a Comment

(requerido) 
(requerido) 
 
(opcional)
(requerido) 
If you can't read this number refresh your screen
Enter the numbers above: