Code, Learn

Annotations di JUnit: Come scrivere test più velocemente

7 Dicembre 2021 - 2 minuti di lettura

Scrivere dei test è sempre un argomento sensibile.

Capita spesso a noi sviluppatori di scrivere porzioni di codice ripetute con l’intento di ottenere un’alberatura chiara e comprensiva di tutti i casi di test possibili.

Per chi come il sottoscritto pratica la tecnica TDD sarebbe utile conoscere un modo veloce per poter aggiungere un caso di test senza dover riscrivere da capo tutta la classe e quindi evitare ripetizioni.

Di seguito vi proporrò una mia soluzione in Java che sfrutta le Annotations del framework di test JUnit.

Sfruttiamo le Annotations JUnit

In JUnit è possibile usare le Annotations @ParameterizedTest in combinazione con @MethodSource per passare al test uno stream di argomenti da testare:

  • @ParameterizedTest può essere arricchito utilizzando il campo name dove poter indicare l’indice di un argomento del metodo di test da utilizzare come descrizione.
  • @MethodSource invece deve contenere il riferimento allo stream contenente gli argomenti del test.

Se volessimo ad esempio scrivere dei test per verificare il metodo getFizzBuzzString(Number num) della classe FizzBuzz potremmo scrivere il seguente codice:

static Stream getFizzBuzzStringArgs() {
return Stream.of(
    Arguments.of("The number is not divisible for 3 or 5 then return the number", 1, "1"),
    Arguments.of("The number is divisible for 3 but not for 5 then return the Fizz", 9, "Fizz")"),
    Arguments.of("The number is divisible for 5 but not for 3 then return the Buzz", 10, "Buzz"));
}

@ParameterizedTest(name = "{0}" )
@MethodSource("getFizzBuzzStringArgs")
void getTriggerProcedureId(String description, Number num, String expect) {
  var fizzBuzz = new FizzBuzz();
  var actual = fizzBuzz.getFizzBuzzString(num);

  assertEquals( expect, actual);
}

Con questa soluzione noterete quanto sia semplice arricchire i nostri test con ulteriori casistiche. Qualora voleste aggiungere altri test come ad esempio per il caso in cui un numero sia divisibile per 3 che per 5, sarebbe sufficiente aggiungere una sola riga di codice al metodo getFizzBuzzStringArgs().

Articolo scritto da