Ho scritto alcuni test unitari per un nuovo codice al lavoro e l'ho inviato per una revisione del codice. Uno dei miei colleghi ha fatto un commento sul motivo per cui stavo inserendo le variabili che vengono utilizzate in un numero di questi test al di fuori dell'ambito del test.
Il codice che ho pubblicato era essenzialmente
import org.junit.Test;
public class FooUnitTests {
@Test
public void testConstructorWithValidName() {
new Foo(VALID_NAME);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithNullName() {
new Foo(null);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithZeroLengthName() {
new Foo("");
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithLeadingAndTrailingWhitespaceInName() {
final String name = " " + VALID_NAME + " ";
final Foo foo = new Foo(name);
assertThat(foo.getName(), is(equalTo(VALID_NAME)));
}
private static final String VALID_NAME = "name";
}
Le sue modifiche proposte erano essenzialmente
import org.junit.Test;
public class FooUnitTests {
@Test
public void testConstructorWithValidName() {
final String name = "name";
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithNullName() {
final String name = null;
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithZeroLengthName() {
final String name = "";
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithLeadingAndTrailingWhitespaceInName() {
final String name = " name ";
final Foo foo = new Foo(name);
final String actual = foo.getName();
final String expected = "name";
assertThat(actual, is(equalTo(expected)));
}
}
Dove tutto richiesto nell'ambito dello scopo del test, viene definito nell'ambito del test.
Alcuni dei vantaggi che sosteneva erano
- Ogni test è autonomo.
- Ogni test può essere eseguito separatamente o in aggregazione, con lo stesso risultato.
- Il revisore non deve scorrere fino a dove questi parametri sono dichiarati per cercare quale sia il valore.
Alcuni degli svantaggi del suo metodo che ho sostenuto erano
- Aumenta la duplicazione del codice
- Può aggiungere rumore ai revisori se ci sono diversi test simili con diversi valori definiti (es. test con
doFoo(bar)
si traduce in un valore, mentre la stessa chiamata ha un risultato diverso perchébar
è definita diversamente in quel metodo).
Oltre alla convenzione, ci sono altri vantaggi / svantaggi dell'uso di entrambi i metodi rispetto all'altro?