Difference between revisions of "Tópicos sobre escrita de testes com JUnit/Testing the blobbiness of blobs"

From Wiki**3

< Tópicos sobre escrita de testes com JUnit
(Como executar os testes?)
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
public class Blob {
+
A classe Blob define o método '''equals''', que deve apresentar as propriedades habituais ('''a.equals(b)''' => '''b.equals(a)''', etc.). Define ainda o método '''blob''', descrevendo a semântica da interacção entre blobs.
 +
 
 +
public class Blob {
 
   int _radius;
 
   int _radius;
 
   int _weight;
 
   int _weight;
Line 27: Line 29:
 
  }
 
  }
  
The test class:
+
A classe de teste ('''BlobTest''') é definida sobre as propriedades esperadas para o método '''equals''' ('''testEquals''') e sobre o funcionamento do método '''blob''' ('''testBlobbiness1''' e '''testBlobbiness2'''). O método '''suite''' tem uma função semelhante à da função '''main''', permitindo agrupar vários testes para execução conjunta. Este processo utiliza redefinição de métodos através de classes internas. Mais informação pode ser obtida no manual do JUnit.
 +
 
 +
Numa classe de teste, podem ainda ser definidos os métodos '''setUp''' e '''tearDown''' que, respectivamente, preparam a execução de cada teste e executam procedimentos de limpeza após cada teste.
 +
 
 +
<text>
 +
import junit.framework.Assert;
 +
import junit.framework.Test;
 +
import junit.framework.TestCase;
 +
import junit.framework.TestSuite;
 +
 
 +
public class BlobTest extends TestCase {
 +
private Blob _smallBlob;
 +
private Blob _largeBlob;
 +
 
 +
public BlobTest() {}
 +
public BlobTest(String s) { super(s); }
 +
 
 +
protected void setUp() {
 +
  _smallBlob = new Blob(1, 2);
 +
  _largeBlob = new Blob(100, 200);
 +
}
 +
 
 +
public void testEquals() {
 +
  Assert.assertFalse(_smallBlob.equals(null));
 +
  Assert.assertEquals(_smallBlob, new Blob(1, 2));
 +
  Assert.assertEquals(_largeBlob, new Blob(100, 200));
 +
  Assert.assertFalse(_smallBlob.equals(_largeBlob));
 +
  Assert.assertFalse(_largeBlob.equals(_smallBlob));
 +
}
 +
 
 +
public void testBlobbiness1() {
 +
  Blob blob = _largeBlob.blob(_smallBlob);
 +
  Assert.assertEquals(blob, new Blob(101, 202));
 +
}
  
  import junit.framework.Assert;
+
  public void testBlobbiness2() {
import junit.framework.Test;
+
  Blob blob = _smallBlob.blob(_largeBlob);
import junit.framework.TestCase;
+
  Assert.assertSame(_smallBlob, blob);
import junit.framework.TestSuite;
+
}
+
 
public class BlobTest extends TestCase {
+
  public static Test suite() {
+
  TestSuite suite = new TestSuite();
  private Blob _smallBlob;
+
  suite.addTest(new BlobTest("test equalities") {
  private Blob _largeBlob;
+
                  protected void runTest() {
+
                    testEquals();
  public BlobTest() {}
+
                  }
  public BlobTest(String s) { super(s); }
+
                });
+
  suite.addTest(new BlobTest("test blobbiness") {
  protected void setUp() {
+
                  protected void runTest() {
    _smallBlob = new Blob(1, 2);
+
                    testBlobbiness1();
    _largeBlob = new Blob(100, 200);
+
                    testBlobbiness2();
  }
+
                  }
+
                });
  public void testEquals() {
+
  return suite;
    Assert.assertTrue(!_smallBlob.equals(null));
+
}
    Assert.assertTrue(!_largeBlob.equals(null));
+
}  // end of BlobTest
    Assert.assertEquals(_smallBlob, new Blob(1, 2));
+
</text>
    Assert.assertEquals(_largeBlob, new Blob(100, 200));
+
 
    Assert.assertFalse(_smallBlob.equals(_largeBlob));
+
== Como compilar e executar? ==
    Assert.assertFalse(_largeBlob.equals(_smallBlob));
 
  }
 
 
  public void testBlobbiness() {
 
    Blob b1 = new Blob(101, 202);
 
    Blob b2 = _largeBlob.blob(_smallBlob);
 
    Blob b3 = _smallBlob.blob(_largeBlob);
 
    Assert.assertEquals(b1, b2);
 
    Assert.assertEquals(_smallBlob, b3);
 
  }
 
   
 
  public static Test suite() {
 
    TestSuite suite = new TestSuite();
 
    suite.addTest(new BlobTest("test equalities") {
 
                    protected void runTest() { testEquals(); }
 
                  });
 
    suite.addTest(new BlobTest("test blobbiness") {
 
                    protected void runTest() { testBlobbiness(); }
 
                  });
 
    suite.addTest(new BlobTest("testBlobbiness"));
 
    // Failure: method "smallTest" does not exist
 
    // suite.addTest(new BlobTest("smallTest"));
 
    return suite;
 
  }
 
 
}  // end of BlobTest
 
  
== Como compilar? ==
+
A execução pode ser realizada pelos processos normais em Java, por recurso a um método '''main''' ou podem ser utilizadas classes específicas para execução de testes (''runners''), que na forma mais simples e directa executam todos os métodos cujo nome comece por “test”.
  
 
   javac Blob.java
 
   javac Blob.java

Latest revision as of 16:59, 4 November 2013

A classe Blob define o método equals, que deve apresentar as propriedades habituais (a.equals(b) => b.equals(a), etc.). Define ainda o método blob, descrevendo a semântica da interacção entre blobs.

public class Blob {
 int _radius;
 int _weight;

 public Blob(int r, int w) {
   _radius = r;
   _weight = w;
 }

 public int getRadius() { return _radius; }
 public int getWeight() { return _weight; }

 public boolean equals(Blob b) {
   if (b == null) return false;
   return _radius == b.getRadius() && _weight == b.getWeight();
 }

 public boolean equals(Object o) {
   return o instanceof Blob && equals((Blob)o);
 }

 public Blob blob(Blob b) {
   if (_radius < b.getRadius() || _weight < b.getWeight()) return this;
   return new Blob(_radius + b.getRadius(), _weight + b.getWeight());
 }

}

A classe de teste (BlobTest) é definida sobre as propriedades esperadas para o método equals (testEquals) e sobre o funcionamento do método blob (testBlobbiness1 e testBlobbiness2). O método suite tem uma função semelhante à da função main, permitindo agrupar vários testes para execução conjunta. Este processo utiliza redefinição de métodos através de classes internas. Mais informação pode ser obtida no manual do JUnit.

Numa classe de teste, podem ainda ser definidos os métodos setUp e tearDown que, respectivamente, preparam a execução de cada teste e executam procedimentos de limpeza após cada teste.

<text> import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite;

public class BlobTest extends TestCase {

private Blob _smallBlob;
private Blob _largeBlob;
public BlobTest() {}
public BlobTest(String s) { super(s); }
protected void setUp() {
  _smallBlob = new Blob(1, 2);
  _largeBlob = new Blob(100, 200);
}
public void testEquals() {
  Assert.assertFalse(_smallBlob.equals(null));
  Assert.assertEquals(_smallBlob, new Blob(1, 2));
  Assert.assertEquals(_largeBlob, new Blob(100, 200));
  Assert.assertFalse(_smallBlob.equals(_largeBlob));
  Assert.assertFalse(_largeBlob.equals(_smallBlob));
}
public void testBlobbiness1() {
  Blob blob = _largeBlob.blob(_smallBlob);
  Assert.assertEquals(blob, new Blob(101, 202));
}
public void testBlobbiness2() {
  Blob blob = _smallBlob.blob(_largeBlob);
  Assert.assertSame(_smallBlob, blob);
}
public static Test suite() {
  TestSuite suite = new TestSuite();
  suite.addTest(new BlobTest("test equalities") {
                  protected void runTest() {
                    testEquals();
                  }
                });
  suite.addTest(new BlobTest("test blobbiness") {
                  protected void runTest() {
                    testBlobbiness1();
                    testBlobbiness2();
                  }
                });
  return suite;
}

} // end of BlobTest </text>

Como compilar e executar?

A execução pode ser realizada pelos processos normais em Java, por recurso a um método main ou podem ser utilizadas classes específicas para execução de testes (runners), que na forma mais simples e directa executam todos os métodos cujo nome comece por “test”.

 javac Blob.java
 javac -cp path/to/file/junit.jar:. BlobTest.java

Exemplo:

 javac -cp /usr/share/java/junit.jar:. BlobTest.java

Como executar os testes?

 java -cp path/to/file/junit.jar:. junit.textui.TestRunner BlobTest

Exemplo:

 java -cp /usr/share/java/junit.jar:. junit.textui.TestRunner BlobTest