Slide "The @Test annotation"





  • Hallo!

    Hab ich es richtig verstanden, dass @interface mehr oder weniger angibt, dass ein Test folgt? Wenn ja, stehen dann in den geschweiften Klammern zB assert... Ausdrücke?

    Sarah Mauff



  • @Mauff Die @Test Annotation markiert jene Methoden, welche vom Junit Framework ausgeführt werden sollen. Betrachten Sie dazu das Beispiel einer zu testenden max(...) Methode in einer Klasse M:

    public class M {
        /**
         * Return the larger of two values.
         *
         * @param a First value
         * @param b Second value
         * @return b, if a < b, a otherwise
         */
        static public int max(final int a, final int b) {
            if (a < b) {
                return b;
            } else {
                return a;
            }
        }
    }
    

    Zwei zugehörige Tests:

    public class Mtest {
    
        @Test public void testMax() {
            Assert.assertEquals(4, M.max(3,4));
            Assert.assertEquals(4, M.max(4,3));
    
            Assert.assertEquals(-1, M.max(-7,-1));
            Assert.assertEquals(-1, M.max(-1,-7));
        }
    }
    

    Die Tests berücksichtigen bereits die Tatsache, dass die Reihenfolge bei der Maximumsbildung keine Rolle spielt. Allerdings wird jeder Test unnötigerweise doppelt notiert.

    Wir können stattdessen in der Testklasse eine Hilfsmethode checkSymmetric(...) implementieren. Diese prüft beide Fälle:

    public class Mtest {
    
        @Test public void testMax() {
            checkSymmetric( 4,  3,  4);
            checkSymmetric(-1, -1, -7);
        }
    
        /**
         * The maximum of two values should not depend on its order. Thus
         * max(a,b) should be equal to max (b, a). Both variants will be
         * tested.
         *
         * @param expected The expected result
         * @param a first value
         * @param b second value
         */
        private void checkSymmetric(final int expected, final int a, final int b) {
            Assert.assertEquals(expected, M.max(a, b));
            Assert.assertEquals(expected, M.max(b, a));
    
    
        }
    }
    

    Die Methode checkSymmetric(...) hat keine @Test Annotation und wird daher auch nicht unmittelbar durch das Junit Test Framework aufgerufen. Wohl aber indirekt durch die Methode testMax(...). Dadurch spart man sich in letzterer die Hälfte der Schreibarbeit.

    Zusammenfassung: Das Junit Framework ruft nur jene mit @Test annotierten Methoden auf.


Log in to reply