Spesso sento che un test dovrebbe contenere solo un'asserzione (trascurando gli attributi di test di una classe) e dove tutte le pre-condizioni per il test dovrebbero essere impostate prima dell'asserzione.
Nella nostra applicazione abbiamo molti test in cui un utente dell'applicazione accede, esegue alcune azioni, quindi lo stato dell'applicazione è asserito, quindi l'utente fa un'altra cosa ecc. e un'altra asserzione viene convalidata. Un altro test potrebbe quindi differire solo in alcune azioni intraprese durante il test. Ad esempio (Pseudo codice)
Test 1:
user = new User()
assertThat(user).is(created)
products = user.buyProducts(2 items)
assertThat(product.length, is(2))
Test 2:
user = new User()
assertThat(user).is(created)
product = user.buyProduct()
assertThat(product, is(notNullValue()))
Questo porta a test che a volte sono estremamente lunghi (a volte 50-100 linee, senza contare i metodi di supporto) e spesso differiscono solo in una delle nostre due dichiarazioni. Sfortunatamente, le diverse dichiarazioni spesso non sono solo sostituzioni variabili, quindi non possiamo usare test dinamici come con Junit5.
C'è un altro modo migliore per creare i test? Sfortunatamente la maggior parte dei test delle nostre applicazioni sono configurati in questo modo. Penso inoltre che potrebbe essere troppo sintetico per mettere tutte queste configurazioni in diversi metodi di configurazione e creare classi di test che fondamentalmente si fermano nel mezzo (ad esempio dopo aver affermato che l'utente è stato creato), e quindi creare un'altra classe di test che afferma solo che il prodotto è stato acquistato.