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
(New page: public class Blob { int _radius; int _weight; public Blob(int r, int w) { _radius = r; _weight = w; } public int getRadius() { return _radius; } public int getWeig...)
 
 
(14 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
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 {
 
  public class Blob {
 
   int _radius;
 
   int _radius;
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));
+
 
  }
+
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”.
+
 
  public void testBlobbiness() {
+
  javac Blob.java
    Blob b1 = new Blob(101, 202);
+
  javac -cp path/to/file/junit.jar:. BlobTest.java
    Blob b2 = _largeBlob.blob(_smallBlob);
+
 
    Blob b3 = _smallBlob.blob(_largeBlob);
+
Exemplo:
    Assert.assertEquals(b1, b2);
+
 
    Assert.assertEquals(_smallBlob, b3);
+
  javac -cp /usr/share/java/junit.jar:. BlobTest.java
  }
+
 
   
+
== Como executar os testes? ==
  public static Test suite() {
+
 
    TestSuite suite = new TestSuite();
+
   java -cp path/to/file/junit.jar:. junit.textui.TestRunner BlobTest
    suite.addTest(new BlobTest("test equalities") {
+
 
                    protected void runTest() { testEquals(); }
+
Exemplo:
                  });
+
 
    suite.addTest(new BlobTest("test blobbiness") {
+
  java -cp /usr/share/java/junit.jar:. junit.textui.TestRunner BlobTest
                    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
 

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