El uso adecuado (o al menos la documentación) de JUnit me pareció muy confuso. Esta pregunta sirve tanto como referencia futura como como una pregunta real.
Si he entendido correctamente, hay dos enfoques principales para crear y ejecutar una prueba JUnit:
Enfoque A (estilo JUnit 3): cree una clase que amplíe TestCase y comience los métodos de prueba con la palabra test
. Al ejecutar la clase como una prueba JUnit (en Eclipse), todos los métodos que comienzan con la palabra test
se ejecutan automáticamente.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Enfoque B (estilo JUnit 4): cree una clase 'normal' y anteponga una @Test
anotación al método. Tenga en cuenta que NO tiene que comenzar el método con la palabra test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Mezclar los dos parece no ser una buena idea, vea, por ejemplo, esta pregunta de stackoverflow :
Ahora, mis preguntas:
- ¿Cuál es el enfoque preferido , o cuándo usaría uno en lugar del otro?
- El enfoque B permite probar las excepciones extendiendo la anotación @Test como en
@Test(expected = ArithmeticException.class)
. Pero, ¿cómo se prueban las excepciones cuando se utiliza el enfoque A? Al utilizar el enfoque A, puede agrupar varias clases de prueba en un conjunto de pruebas como esta:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Pero esto no se puede usar con el enfoque B (ya que cada clase de prueba debería subclasificar TestCase). ¿Cuál es la forma correcta de agrupar las pruebas para el enfoque B?
Editar: he agregado las versiones JUnit a ambos enfoques
fuente
extends TestCase
y luego cada prueba también anotó@Test
solo para confundir las cosas. :)Respuestas:
La distinción es bastante fácil:
TestCase
es la forma en que se escribieron las pruebas unitarias en JUnit 3 (por supuesto, todavía es compatible con JUnit 4)@Test
anotación es la forma introducida por JUnit 4En general, debe elegir la ruta de anotación, a menos que se necesite compatibilidad con JUnit 3 (y / o una versión de Java anterior a Java 5). La nueva forma tiene varias ventajas:
@Test
anotación es más explícita y es más fácil de admitir en las herramientas (por ejemplo, es fácil buscar todas las pruebas de esta manera)@Before
/@BeforeClass
y@After
/@AfterClass
proporcionando más flexibilidad@Rule
anotaciones sobre cosas comoExpectedException
@Ignored
anotación.@RunWith
Para probar las excepciones esperadas en un JUnit 3
TestCase
, debe hacer que el texto sea explícito.JUnit 5 introdujo otro cambio de API, pero aún usa anotaciones. La nueva
@Test
anotación esorg.junit.jupiter.api.Test
(la antigua JUnit 4 eraorg.junit.Test
), pero funciona más o menos igual que la JUnit 4.fuente
assertTrue(e.getMessage().contains("foo"))
podría ser útil.expected
método solo verifica el tipo.Prefiero JUnit 4 (enfoque de anotación) porque lo encuentro más flexible.
Si desea crear un conjunto de pruebas en JUnit 4, debe crear una clase que agrupe todas las pruebas de esta manera:
fuente
Hay una parte sin respuesta a su pregunta, y es "¿Cuál es la forma correcta de agrupar las pruebas para el enfoque B?"
La respuesta oficial es que anota una clase con un @RunWith (Suite.class) y luego usa la anotación @ Suite.SuiteClasses para enumerar las clases. Así es como lo hacen los desarrolladores de JUnit (enumerando cada clase en una suite de forma manual). En muchos sentidos, este enfoque es una mejora, ya que es trivial e intuitivo agregar comportamientos antes y después de la suite (solo agregue un método @BeforeClass y @AfterClass a la clase anotada con @RunWith, mucho mejor que el antiguo TestFixture )
Sin embargo, tiene un paso atrás, ya que las anotaciones no le permiten crear dinámicamente la lista de clases, y solucionar ese problema se vuelve un poco feo. Debe subclasificar la clase Suite y crear dinámicamente la matriz de clases en la subclase y pasarla al constructor Suite, pero esta es una solución incompleta en que otras subclases de Suite (como Categorías) no funcionan con ella y esencialmente no es compatible con la colección de clases de prueba dinámica.
fuente
Deberías usar JUnit 4. Es mejor.
Muchos marcos han comenzado a desaprobar el soporte de JUnit 3.8.
Esto es de la documentación de referencia de Spring 3.0:
En general, siempre debe intentar usar la última versión estable de un marco cuando comience algo nuevo.
fuente
El enfoque "preferido" sería usar anotaciones que se han introducido desde el 4 de junio. Facilitan mucho las cosas (vea su segunda pregunta)
Puede usar un simple bloque try / catch para eso:
fuente