Pergunta

Eu tenho uma classe que processa um 2 arquivos xml e produz um arquivo de texto.

Eu gostaria de escrever um monte de testes de unidade / integração que podem individualmente passar ou não para esta classe que faça o seguinte:

  1. Para a entrada A e B, gerar a saída.
  2. Compare o conteúdo do arquivo gerado para o conteúdo saída esperada
  3. Quando o conteúdo real diferir o conteúdo esperado, falhar e exibir alguns útil informações sobre as diferenças.

A seguir é o protótipo para a classe juntamente com a minha primeira facada em testes de unidade.

Existe um padrão eu deveria estar usando para este tipo de teste, ou que as pessoas tendem a zilhões de escrita do TestX () funções?

Existe uma melhor maneira de diferenças do ficheiro de texto coaxiais de NUnit? Eu deveria incorporar um textfile diff algoritmo?


class ReportGenerator
{
    string Generate(string inputPathA, string inputPathB)
    {
        //do stuff
    }
}

[TextFixture]
public class ReportGeneratorTests
{
     static Diff(string pathToExpectedResult, string pathToActualResult)
     {
         using (StreamReader rs1 = File.OpenText(pathToExpectedResult))
         {
             using (StreamReader rs2 = File.OpenText(pathToActualResult))
             {
                 string actualContents = rs2.ReadToEnd();
                 string expectedContents = rs1.ReadToEnd();                  

                 //this works, but the output could be a LOT more useful.
                 Assert.AreEqual(expectedContents, actualContents);
             }
         }
     }

     static TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
     {
          ReportGenerator obj = new ReportGenerator();
          string pathToResult = obj.Generate(pathToInputA, pathToInputB);
          Diff(pathToExpectedResult, pathToResult);
     }

     [Test]
     public void TestX()
     {
          TestGenerate("x1.xml", "x2.xml", "x-expected.txt");
     }

     [Test]
     public void TestY()
     {
          TestGenerate("y1.xml", "y2.xml", "y-expected.txt");
     }

     //etc...
}

Atualização

Eu não estou interessado em testar a funcionalidade diff. Eu só quero usá-lo para produzir falhas mais legíveis.

Foi útil?

Solução

Quanto aos vários testes com diferentes dados, use a extensão NUnit RowTest:

using NUnit.Framework.Extensions;

[RowTest]
[Row("x1.xml", "x2.xml", "x-expected.xml")]
[Row("y1.xml", "y2.xml", "y-expected.xml")]
public void TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
 {
      ReportGenerator obj = new ReportGenerator();
      string pathToResult = obj.Generate(pathToInputA, pathToInputB);
      Diff(pathToExpectedResult, pathToResult);
 }

Outras dicas

Você provavelmente estão pedindo para o teste contra dados "ouro". Eu não sei se há prazo específico para este tipo de teste aceito em todo o mundo, mas esta é a forma como o fazemos.

Criar classe luminária base. Ele possui basicamente "vazio DoTest (string fileName)", que irá ler arquivo específico na memória, executar abstrato método de transformação "string Transform (texto string)", em seguida, ler fileName.gold do mesmo lugar e comparar texto transformada com o que era esperado . Se o conteúdo é diferente, ele lança exceção. Exceção lançada contém o número de linha da primeira diferença, bem como texto de linha esperado e real. Como texto é estável, isto é, normalmente informação suficiente para detectar o problema de imediato. Certifique-se de marcar as linhas com "esperado:" e "real", ou você vai estar adivinhando sempre que é que quando se olha para os resultados do teste.

Em seguida, você terá equipamentos de teste específicos, onde você implementar o método que faz trabalho direito Transform, e depois têm testes que olhar como esta:

[Test] public void TestX() { DoTest("X"); }
[Test] public void TestY() { DoTest("Y"); }

Nome do teste falhou irá imediatamente dizer-lhe o que está quebrado. Claro, você pode usar testes de linha para testes similares grupo. Tendo testes separados também ajuda em um número de situações como ignorando testes, comunicando testes para colegas e assim por diante. Não é um grande negócio para criar um trecho que irá criar teste para você em um segundo, você vai gastar muito mais tempo a preparar dados.

Em seguida, você também vai precisar de alguns dados de teste e uma forma a sua unidade base irá encontrá-lo, não se esqueça de definir regras sobre o assunto para o projeto. Se o teste falhar, despejar a saída real para o arquivo perto do ouro, e apagá-la se passagem de teste. Desta forma, você pode usar diff ferramenta quando necessário. Quando não há ouro foram encontrados dados, teste falhar com mensagem apropriada, mas a produção real é escrito de qualquer maneira, para que possa verificar que ele está correto e copiá-lo para se tornar "ouro".

eu provavelmente escrever um único teste de unidade que contém um loop. Dentro do loop, eu tinha lido 2 arquivos xml e um arquivo diff, e depois diff os arquivos XML (sem gravação em disco) e compará-lo com o arquivo diff lidos do disco. Os arquivos serão numerados, por exemplo, a1.xml, b1.xml, diff1.txt; a2.xml, b2.xml, diff2.txt; a3.xml, b3.xml, diff3.txt, etc., e o loop pára quando ele não encontrar o próximo número.

Em seguida, você pode escrever novos testes apenas adicionando novos arquivos de texto.

Ao invés de chamada .AreEqual você pode analisar os dois fluxos de entrada mesmo, manter uma contagem da linha e coluna e comparar o conteúdo. Assim que você encontrar uma diferença, você pode gerar uma mensagem como ...

Linha 32 Coluna 12 - Encontrado 'x', quando era esperado 'y'

Você pode opcionalmente melhorar que, exibindo várias linhas de saída

Diferença na Linha 32 Coluna 12, primeira diferença mostrado
A = esta é uma t x st
B = este é um t e pts

Note, como regra, eu geralmente só gerar através do meu um código das duas correntes que você tem. O outro eu iria agarrar a partir de um arquivo de teste / texto, após terem verificado a olho ou outro método que os dados contidos está correto!

Eu provavelmente usar XmlReader para percorrer os arquivos e compará-los. Quando eu bati a diferença que eu iria exibir um XPath para o local onde os arquivos são diferentes.

PS: Mas, na realidade, era sempre o suficiente para me fazer apenas uma simples leitura de todo o arquivo para uma string e comparar as duas cordas. Para a comunicação é o suficiente para ver que o teste falhou. Então, quando eu a depuração Eu costumo diff os arquivos usando Araxis Merge para ver onde exatamente Eu tenho problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top