TQS -  Teste e Qualidade de Software ( Software Testing and Quality ) Introdução a  testes unitários automatizados com JUnit e NUnit  João Pascoal Faria [email_address]   www.fe.up.pt / ~jpf
JUnit Framework open source  para criação e execução de testes unitários, baseado na arquitectura xUnit (inciada com SmallTalk), escrito inicialmente por Kent Beck e Erich Gamma Permite criar classes de teste ( test fixtures ) com métodos de teste com asserções Classe é instanciada de novo para cada método de teste Test runner  (c/ interface textual ou gráfica) executa métodos de teste e mostra os que passaram (a verde) e os que falharam (a vermelho) “ Keep the bar green to keep the code clean” [Kent Beck] Conjuntos de testes podem ser organizados em  test suites Actualmente integrado no Eclipse Ver mais detalhes em  www.junit.org
Exemplo de classe a testar class MyMath  { //   Dá o  maior divisor comum positivo de  2  inteiros   // não nulos pelo algoritmo de Euclides. // Se algum argumento for 0 dá //  IllegalArgumentException . public static int mdc(int a, int b)   { while (b > 0) { int aux = a % b; a = b;  b = aux; } return a; } } Como não é dito nada em contrário, deve funcionar com inteiros negativos … Não parece que esteja implementado… especificação informal implementação
Exemplo de classe de teste em JUnit 3.8.1 import junit.framework.TestCase; class MyMathTest extends  TestCase  { public void  test MdcPositive() { assertEquals (1, MyMath.mdc(2, 3)); assertEquals (2, MyMath.mdc(2, 4)); } public void  test MdcNegative() { assertEquals (2, MyMath.mdc(-4, 6)); } public void  test MdcZero() { try { MyMath.mdc(0,1);  fail (); }  catch(IllegalArgumentException e){}  } } Métodos de teste:  void testXXX()  Métodos herdados de TestCase: assertEquals( esperado, actual) fail() - assinala teste falhado No Eclipse: New       JUnit Test Case    JUnit 3.8.1 test
Executar e ver o teste a  falhar …
Corrigir e ver o teste a passar
Analisar a cobertura dos testes Instrução não testada Construtor por defeito não testado ??? Testar antes mdc(-4,-6)
Exemplo em JUnit 4.0  import org.junit.Test; import static org.junit.Assert.assertEquals; class MyMathTest { @Test public void testMdcPositive() { assertEquals(1, MyMath.mdc(2, 3)); assertEquals(2, MyMath.mdc( 4 ,  6 )); } @Test(expected=IllegalArgumentException.class)   public void testMdcZero() { MyMath.mdc(0,1);  } } Tira partido das novas  features  do Java 1.5, mas (ainda) não é entendido pela ferramenta Coverlipse  de análise de cobertura dos testes! Anotação dos métodos de teste Método estático da classe Assert Importação de  método estático
Exemplo em NUnit  using System; using NUnit.Framework; [TestFixture] class MyMathTest { [Test]  public void TestMdcPositive() { Assert.AreEqual(1, MyMath.mdc(2, 3)); Assert.AreEqual(2, MyMath.mdc(4, 6)); } [Test,  ExpectedException (typeof(ArgumentException))]   public void TestMdcZero() { MyMath.mdc(0,1);  } } Adicionar ao projecto referência para nunit.framework.dll Executar com NUnit-Gui  (nunit-gui.exe) e abrir  assembly  do projecto (.dll ou .exe)
Exemplo de execução com NUnit-Gui
Setup  e  teardown Código de iniciação e terminação a executar … …  antes e depois de cada método de teste dentro duma classe de teste Por exemplo, inicializar objectos (variáveis privadas da classe) a usar por vários métodos de teste  JUnit 3.8.1: redefinir métodos setUp e tearDown herdados de TestCase NUnit: criar métodos e anotá-los com atributos SetUp e TearDown … . uma única vez numa classe de teste (antes e depois de todos os métodos) Exemplo: abrir e fechar uma conexão para a base de dados NUnit: métodos anotados c/ atributos TestFixtureSetup e TestFixtureTearDown
Test suites Agregam conjuntos de testes Padrão composite (JUnit 3.8.1) Test generaliza TestCase e TestSuite TestSuite agrega instâncias de Test (método addTest(Test t)) Normalmente não é necessário criar explicitamente, pois os casos de teste são descobertos automaticamente graças ao mecanismo de reflexão
Exercício Realizar o exemplo do mdc
Referências e informação adicional www.junit.org www.nunit.org   http://testdriven.net/

Introdução a testes unitários automatizados com JUnit e NUnit

  • 1.
    TQS - Teste e Qualidade de Software ( Software Testing and Quality ) Introdução a testes unitários automatizados com JUnit e NUnit João Pascoal Faria [email_address] www.fe.up.pt / ~jpf
  • 2.
    JUnit Framework opensource para criação e execução de testes unitários, baseado na arquitectura xUnit (inciada com SmallTalk), escrito inicialmente por Kent Beck e Erich Gamma Permite criar classes de teste ( test fixtures ) com métodos de teste com asserções Classe é instanciada de novo para cada método de teste Test runner (c/ interface textual ou gráfica) executa métodos de teste e mostra os que passaram (a verde) e os que falharam (a vermelho) “ Keep the bar green to keep the code clean” [Kent Beck] Conjuntos de testes podem ser organizados em test suites Actualmente integrado no Eclipse Ver mais detalhes em www.junit.org
  • 3.
    Exemplo de classea testar class MyMath { // Dá o maior divisor comum positivo de 2 inteiros // não nulos pelo algoritmo de Euclides. // Se algum argumento for 0 dá // IllegalArgumentException . public static int mdc(int a, int b) { while (b > 0) { int aux = a % b; a = b; b = aux; } return a; } } Como não é dito nada em contrário, deve funcionar com inteiros negativos … Não parece que esteja implementado… especificação informal implementação
  • 4.
    Exemplo de classede teste em JUnit 3.8.1 import junit.framework.TestCase; class MyMathTest extends TestCase { public void test MdcPositive() { assertEquals (1, MyMath.mdc(2, 3)); assertEquals (2, MyMath.mdc(2, 4)); } public void test MdcNegative() { assertEquals (2, MyMath.mdc(-4, 6)); } public void test MdcZero() { try { MyMath.mdc(0,1); fail (); } catch(IllegalArgumentException e){} } } Métodos de teste: void testXXX() Métodos herdados de TestCase: assertEquals( esperado, actual) fail() - assinala teste falhado No Eclipse: New   JUnit Test Case  JUnit 3.8.1 test
  • 5.
    Executar e vero teste a falhar …
  • 6.
    Corrigir e vero teste a passar
  • 7.
    Analisar a coberturados testes Instrução não testada Construtor por defeito não testado ??? Testar antes mdc(-4,-6)
  • 8.
    Exemplo em JUnit4.0 import org.junit.Test; import static org.junit.Assert.assertEquals; class MyMathTest { @Test public void testMdcPositive() { assertEquals(1, MyMath.mdc(2, 3)); assertEquals(2, MyMath.mdc( 4 , 6 )); } @Test(expected=IllegalArgumentException.class) public void testMdcZero() { MyMath.mdc(0,1); } } Tira partido das novas features do Java 1.5, mas (ainda) não é entendido pela ferramenta Coverlipse de análise de cobertura dos testes! Anotação dos métodos de teste Método estático da classe Assert Importação de método estático
  • 9.
    Exemplo em NUnit using System; using NUnit.Framework; [TestFixture] class MyMathTest { [Test] public void TestMdcPositive() { Assert.AreEqual(1, MyMath.mdc(2, 3)); Assert.AreEqual(2, MyMath.mdc(4, 6)); } [Test, ExpectedException (typeof(ArgumentException))] public void TestMdcZero() { MyMath.mdc(0,1); } } Adicionar ao projecto referência para nunit.framework.dll Executar com NUnit-Gui (nunit-gui.exe) e abrir assembly do projecto (.dll ou .exe)
  • 10.
    Exemplo de execuçãocom NUnit-Gui
  • 11.
    Setup e teardown Código de iniciação e terminação a executar … … antes e depois de cada método de teste dentro duma classe de teste Por exemplo, inicializar objectos (variáveis privadas da classe) a usar por vários métodos de teste JUnit 3.8.1: redefinir métodos setUp e tearDown herdados de TestCase NUnit: criar métodos e anotá-los com atributos SetUp e TearDown … . uma única vez numa classe de teste (antes e depois de todos os métodos) Exemplo: abrir e fechar uma conexão para a base de dados NUnit: métodos anotados c/ atributos TestFixtureSetup e TestFixtureTearDown
  • 12.
    Test suites Agregamconjuntos de testes Padrão composite (JUnit 3.8.1) Test generaliza TestCase e TestSuite TestSuite agrega instâncias de Test (método addTest(Test t)) Normalmente não é necessário criar explicitamente, pois os casos de teste são descobertos automaticamente graças ao mecanismo de reflexão
  • 13.
    Exercício Realizar oexemplo do mdc
  • 14.
    Referências e informaçãoadicional www.junit.org www.nunit.org http://testdriven.net/