Tópicos sobre escrita de testes com JUnit/Testing the blobbiness of blobs

From Wiki**3

< Tópicos sobre escrita de testes com JUnit

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