I'm new in unit testing and I haven't found any clear answer.
In molti casi, non c'è una risposta chiara: solo diversi compromessi che è necessario valutare per le proprie circostanze.
Il discorso che devi guardare è I test integrati sono una truffa , di J.B. Rainsberger. Vedi anche il suo blog .
Potresti anche voler esaminare un po 'di saggezza da Kent Beck (2008)
I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence
Una delle motivazioni dei test unitari è che limitano la scelta delle implementazioni; l'idea è che i test ti danno un segnale che i tuoi cambiamenti hanno prodotto un cambiamento osservabile nel comportamento del tuo sistema.
Quindi, se hai un sacco di test per B
, e supponi che quelli coprano anche A
, va bene fino al punto che qualcuno decide di cambiare l'implementazione di A
.
Se A is-a
B; il che significa che si dovrebbe essere in grado di sostituire un B
con un A
e avere ancora un programma corretto, quindi un trucco potenzialmente utile è scrivere una suite di test che viene invocata sia su A che su B.
void verifyThatItWorks(SystemUnderTest sut) {
// this is where the implementation of the test lives
// including the setup, activity, and verification
// aka arrange, act, assert
}
@Test
void testB () {
verifyThatItWorks(new B())
}
@Test
void testA () {
verifyThatItWorks(new A())
}
In alcuni linguaggi di programmazione ci sono comodità che ti permettono di gestire
copie parallele di grandi suite di test
abstract class AbstractSpecification {
SystemUnderTest sut
protected AbstractSpecification(SystemUnderTest sut) {
this.sut = sut;
}
@Test behavior1 () {...}
@Test behavior2 () {...}
// ...
}
class BSpecification extends AbstractSpecification {
BSpecification () { super (new B()); }
}
class ASpecification extends AbstractSpecification {
ASpecification () { super(new A()); }
}