Richtlinien für das Testen mit JUnit

Übersetzerbau, WS 2004 / 2005

Tests ausführen

  1. Methode AllTests.suite() so anpassen, dass tatsächlich alle (gewünschten) Testfälle ausgeführt werden.
    z.B. für Übung 2:
    package ssw.mj.test;
    
    public class AllTests extends TestCase {
        public static Test suite () {
            TestSuite suite = new TestSuite();
            suite.addTestSuite(TokenTest.class);
            suite.addTestSuite(ScannerTest.class);
            // add more suites here
            return suite;
        }
    
        public static void main (String[] args) {
            junit.textui.TestRunner.run(suite());
        }
    }
    
  2. Compilieren des Compilers- und der Testfälle.
    > javac -classpath .;JUnit-Home-Verzeichnis/junit.jar ssw/mj/*.java ssw/mj/test/*.java
    		
  3. Ausführen aller Tests (Text-Modus).
    > java -cp .;JUnit-Home-Verzeichnis/junit.jar ssw.mj.test.AllTests
    		
    oder Ausführen aller Tests (mit GUI).
    > java -cp .;JUnit-Home-Verzeichnis/junit.jar junit.swingui.TestRunner ssw.mj.test.AllTests
    		

Tests erstellen/hinzufügen

Zusätzliche Tests können auf drei Arten hinzugefügt werden:
  1. In bestehender Testfallmethode
  2. In bestehender Testfallklasse
  3. In neuer Testfallklasse

In bestehender Testfallmethode

Fügen Sie einfach in eine bestehende Testfallmethode (= test...) Ihren zusätzlichen Testcode ein.
z.B. in ScannerTest.java

public void testInvalidSymbols () {
    ...
    initScanner("ä");

checkNext(none, 1, 1); output.addExpectedLine("-- line 1, col 1: invalid character 'ä'"); checkNext(eof, 1, 1);
output.verify();
initScanner(" ö ");
checkNext(none, 1, 2); output.addExpectedLine("-- line 1, col 2: invalid character 'ö'"); checkNext(eof, 1, 3);
output.verify();
}

In bestehender Testfallklasse

Um einen neuen Testfall zu erstellen, fügen Sie eine neue Methode, deren Name mit test beginnt, in eine bestehende Testklasse ein.
z.B. in ScannerTest.java:

public class ScannerTest extend TestCase {
    public void testMyClass () {
        ...
        initScanner("class MyClass {" + LF +
                    "\tvoid main() { }" + LF +
                    "}");

checkNext(classKW, 1, 1, "class"); checkNext(ident, 1, 7, "MyClass"); checkNext(lbrace, 1, 15); checkNext(voidKW, 2, 2, "void"); checkNext(ident, 2, 7, "main"); checkNext(lpar, 2, 11); checkNext(rpar, 2, 12); checkNext(lbrace, 2, 14); checkNext(rbrace, 2, 16); checkNext(rbrace, 3, 1); checkNext(eof, 3, 1);
output.verify(); }

... }

In neuer Testfallklasse

  • Jede Testfallklasse muss von junit.framework.TestCase abgeleitet werden.
  • Die Namen aller Testmethoden müssen mit test beginnen (siehe oben).
  • In der Main-Methode der Testfallklasse können Sie vorsehen, mit welchem TestRunner Ihre Testfälle ausgeführt werden sollen. Dabei können Sie zwischen einfacher Textausgabe und zwei GUI-Versionen wählen.
    z.B. in Klasse MyTest:
    • Textausgabe:
      public static void main (String[] args) {
          junit.textui.TestRunner.run(MyTest.class);
      }
      
    • AWT-GUI:
      public static void main (String[] args) {
          junit.awtui.TestRunner.run(MyTest.class);
      }
      
    • Swing-GUI:
      public static void main (String[] args) {
          junit.swingui.TestRunner.run(TokenTest.class);
      }
      
    Sie können diese Testfälle dann mit
    > java -cp .;JUnit-Home-Verzeichnis/junit.jar MyTest
    		
    ausführen.
  • Um die Testfälle der neuen Testfallklasse MyTest auch mit AllTests auszuführen, fügen Sie einfach folgende Zeile zur suite-Methode der Klasse ssw.mj.test.AllTests hinzu:

    public class AllTests extends TestCase {
        public static Test suite () {
            TestSuite suite = new TestSuite();
            suite.addTestSuite(TokenTest.class);
            suite.addTestSuite(ScannerTest.class);
            suite.addTestSuite(MyTest.class);
            // add more suites here
            return suite;
        }
    
    ... }