Domanda

Ho il seguente test JUnit. Il metodo che sto testando è abbastanza semplice, è solo riceve un numero e restituisce una lista con i suoi divisori. Non voglio ripetere il codice di prova molte volte, così ho creato un metodo ausiliario, testDivisorsAux:

@Test
public final void testDivisors() {
    testDivisorsAux(1, new int[] { 1 });
    testDivisorsAux(6, new int[] { 1, 2, 3, 6 });
    testDivisorsAux(0, new int[] { });
    ...
}

private final void testDivisorsAux(final int number, final int[] expected) {
    List<Integer> divisors = Util.divisors(number);
    assertSame(divisors.size(), expected.length);
    for (int i : expected) {
        assertTrue(divisors.contains(i));
    }
}

Tutto funziona bene, sto solo chiedendo ... si tratta di una cattiva pratica? dovrei scrivere il test in un modo diverso? Forse mantenere tutto il codice all'interno del "metodo di @Test"?

PMD mi sta dicendo che test JUnit dovrebbe includere assert () o non () (per il primo metodo), e JUnit 4 test che vengono eseguiti i test dovrebbero usare l'annotazione @Test (per il secondo). So che PMD sta usando solo un'espressione regolare (beh, in realtà è XPath) per determinare quali regole sono rottura ... quindi sono propenso a pensare che è semplicemente un "falso positivo" avvertimento. Ma comunque, mi piacerebbe sapere se sto facendo qualcosa di sbagliato. (Appart da scrivere test 4 volte superiore rispetto al metodo in prova:)

Mentre ero alla ricerca di domande simili a questo, ho trovato qualcosa che si chiama test parametrizzate ... ma sembra che sia qualcosa orientato a molto più grandi scenari, non è vero?

È stato utile?

Soluzione

Personalmente penso che buona pratica per fare questo. C'è un piccolo pericolo di andare troppo lontano e la costruzione di masse di codice per fare il test, nel qual caso si dovrebbe ripensare il design delle cose che si sta testando. Non si vuole veramente avere a prove di scrittura per testare le vostre prove, ma l'esempio che danno sembra bene e significa i vostri casi di test sono molto più semplice.

Non ho usato PMD e personalmente mi avrebbe cercato di configurarlo per ingore questi avvertimenti. Se essi si preoccupano si potrebbe essere in grado di modificare il codice per sbarazzarsi di loro. La mia ipotesi è che il secondo avvertimento era perché il metodo di supporto inizia con il test di parola. In junit3 tutti i metodi che iniziano con il test sono test. Perché non rinominare il metodo di testDivisorsAux essere assertDivisors -. Forse avere un metodo che inizia con assert aiuterà con il primo avvertimento anche

Altri suggerimenti

Come Adam Butler ha suggerito, con un metodo inizia con assert sarà risolvere il problema segnalato.

Quindi nel tuo caso, rinominare testDivisorsAux a assertDivisorsAux lo risolverà.

Vedi anche http: //pmd.sourceforge.net/pmd-4.3.0/xref/net/sourceforge/pmd/rules/junit/JUnitTestsShouldContainAsserts.html per il codice che controlli la regola.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top