Ich habe einige Komponententests für neuen Code bei der Arbeit geschrieben und ihn zur Codeüberprüfung gesendet. Einer meiner Mitarbeiter machte einen Kommentar dazu, warum ich Variablen, die in einer Reihe dieser Tests verwendet werden, außerhalb des Testbereichs platzierte.
Der Code, den ich gepostet habe, war im Wesentlichen
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";
}
Seine vorgeschlagenen Änderungen waren im Wesentlichen
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)));
}
}
Wo alles , was im Rahmen des Tests erforderlich ist, im Rahmen des Tests definiert wird.
Einige der Vorteile, die er argumentierte, waren
- Jeder Test ist in sich geschlossen.
- Jeder Test kann isoliert oder aggregiert mit demselben Ergebnis ausgeführt werden.
- Der Prüfer muss nicht dorthin scrollen, wo diese Parameter deklariert sind, um den Wert zu ermitteln.
Einige der Nachteile seiner Methode, die ich argumentierte, waren
- Erhöht die Codeduplizierung
- Kann dem Prüfer Rauschen hinzufügen, wenn mehrere ähnliche Tests mit unterschiedlichen Werten definiert sind (dh Test mit
doFoo(bar)
Ergebnissen in einem Wert, während derselbe Aufruf ein anderes Ergebnis hat, da erbar
in dieser Methode unterschiedlich definiert ist).
Gibt es neben der Konvention noch andere Vor- und Nachteile bei der Verwendung einer der beiden Methoden gegenüber der anderen?