Dovrebbe // indicato // quando e // quindi i commenti saranno inclusi nei test unitari?

3

Sono entrato a far parte di un nuovo team di grandi colleghi ed è emersa una divergenza di opinioni riguardo l'inclusione di //given //when e //then blocchi di commento nei test unitari.

Ad esempio

public void mapToitemList_MapsCarsToitemsCorrectly_ForSingleFurrari() {
    // given
    String commercialProductName = "Furrari";
    String productNumber = "12423";
    BigDecimal numberOfScrews = BigDecimal.TEN;
    ValveType valveType = ValveType.GOOD;

    Car car = new Car() //
                    .withCommercialProductName(commercialProductName) //
                    .withProductCarNumber(productNumber) //
                    .withNumberOfScrewsAmount(new NumberOfScrewsAmount().withValue(numberOfScrews)) //
                    .withBalances(new Engine().withValves(new ValveType().withValue(valveType)));
    List<Car> carList = Collections.singletonList(car);

    // when
    List<Item> mappedListOfCars = CarMapper.mapToItemList(carList);

    // then 
    assertThat(mappedListOfCars).isNotEmpty();
    Item carAsItem = mappedListOfCars.get(0);

    assertThat(carAsItem.getCommercialProductName()).isEqualTo(commercialProductName);
    assertThat(carAsItem.getNumberOfSetsOfScrews().getValue()).isEqualTo(Convertor.numbersOfScrewsToNumberOfSets(numberOfScrews).getValue());

}

Attualmente il motivo principale per includerli è perché sono abituato e il principale contro-argomento che sto ottenendo è che i commenti dovrebbero essere evitati.

La struttura aggiunta di questi commenti merita l'uso di commenti? Martin Fowler menziona alcune persone li usano, ma non giudicano in merito.

    
posta Spork 09.03.2018 - 14:20
fonte

3 risposte

6

I commenti al codice sono generalmente considerati una cattiva pratica perché:

  • Aggiungono nuovi artefatti da conservare in futuro.
  • Il codice dovrebbe essere semplice e ben scritto per essere auto-esplicativo.

Detto questo, come al solito, non ci sono verità assolute. Personalmente, questo tipo di commenti è positivo per me poiché aggiungono ulteriore semantica al codice e fammi sapere in quale sezione del test sto lavorando. Inoltre, applica anche una determinata struttura di codifica di test.

Quindi, per riassumere:

  • Commenti del codice che non aggiungono alcuna semantica al codice come // Iterate over the list elements prima di un ciclo foreach : Bad.
  • Commenti del codice che aggiungono un buon semantico e rafforzano le buone pratiche: buono.

Ma voglio sottolineare che questa è piuttosto una preferenza personale / organizzativa che una verità assoluta.

    
risposta data 09.03.2018 - 14:29
fonte
10

È chiaramente una buona idea strutturare i test in uno schema dato-quando-poi o organizzare-agire-assert, ma questa struttura dovrebbe essere evidente nel codice, anche senza commenti. Spesso, una linea vuota tra ogni sezione è del tutto sufficiente per comunicare questa divisione. I commenti extra sarebbero quindi solo rumore.

Le cose diventano più complicate quando si asseriscono anche precondizioni, quando l'azione contiene più passaggi distinti o quando la descrizione dello stato previsto richiede una preparazione extra. Molti buoni casi di test non rientrano in un metodo di test a cinque righe. In questi scenari più complicati, può essere ragionevole chiarire l'intento di ogni sezione con un commento.

    
risposta data 09.03.2018 - 14:27
fonte
0

Il problema principale che ho con questo tipo di convenzione è che è così proscriptive. Impone efficacemente che un test debba seguire il modello di assetto organizzativo, indipendentemente dal test. E, di conseguenza, puoi finire con codice come nell'esempio:

// when
List<Item> mappedListOfCars = CarMapper.mapToItemList(carList);

// then 
assertThat(mappedListOfCars).isNotEmpty();
Item carAsItem = mappedListOfCars.get(0);

Perché List<Item> mappedListOfCars = ... in "quando" anziché "dato"? Perché stai facendo Item carAsItem = ... in "then"? La semplice risposta è perché devi eseguire il test su questi tre passaggi.

Quindi sbarazzati di quei commenti. Non hanno uno scopo utile e il test è più facile da leggere senza di essi.

    
risposta data 09.03.2018 - 16:58
fonte

Leggi altre domande sui tag