14
1 Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007 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 protected] www.fe.up.pt / ~jpf

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

Embed Size (px)

Citation preview

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

1Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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 protected] www.fe.up.pt/~jpf

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

2Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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

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

3Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Exemplo de classe a testar

class MyMathclass MyMath { { //// Dá o Dá o maior divisor comum positivo de maior divisor comum positivo de 22 inteiros inteiros // não nulos pelo algoritmo de Euclides.// não nulos pelo algoritmo de Euclides. // Se algum argumento for 0 dá// Se algum argumento for 0 dá // // IllegalArgumentExceptionIllegalArgumentException.. public static int mdc(int a, int b)public static int mdc(int a, int b) {{ while (b > 0) {while (b > 0) { int aux = a % b;int aux = a % b; a = b; a = b; b = aux;b = aux; }} return a;return a; }}}}

Como não é dito nada em contrário, deve funcionar com inteiros negativos …

Não parece que esteja implementado…

esp

ecifi

caçã

o in

form

al

imp

lem

en

tação

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

4Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Exemplo de classe de teste em JUnit 3.8.1

import junit.framework.TestCase;

class MyMathTest extends TestCase {

public void testMdcPositive() { assertEquals(1, MyMath.mdc(2, 3)); assertEquals(2, MyMath.mdc(2, 4)); }

public void testMdcNegative() { assertEquals(2, MyMath.mdc(-4, 6)); }

public void testMdcZero() { 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

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

5Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Executar e ver o teste a falhar …

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

6Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Corrigir e ver o teste a passar

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

7Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Analisar a cobertura dos testes

Instrução não testada

Construtor por defeito não testado

???

Testar antes mdc(-

4,-6)

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

8Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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

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

9Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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.dllExecutar com NUnit-Gui (nunit-gui.exe) e abrir assembly do projecto (.dll ou .exe)

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

10Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Exemplo de execução com NUnit-Gui

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

11Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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

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

12Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

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

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

13Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Exercício

Realizar o exemplo do mdc

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

14Teste e Qualidade de Software, MIEIC/MEI/PRODEI, João Pascoal Faria, 20/9/2007

Referências e informação adicional www.junit.org

www.nunit.org

http://testdriven.net/