java - suma - junit test
Ignorar condicionalmente las pruebas en JUnit 4. (4)
De acuerdo, la anotación @Ignore
es buena para marcar que no se debe ejecutar un caso de prueba.
Sin embargo, a veces quiero ignorar una prueba basada en información de tiempo de ejecución. Un ejemplo podría ser si tengo una prueba de concurrencia que debe ejecutarse en una máquina con un cierto número de núcleos. Si esta prueba se ejecutara en una máquina con un solo procesador, no creo que sea correcto simplemente pasar la prueba (ya que no se ha ejecutado), y ciertamente no sería correcto fallar la prueba y romper la compilación .
Así que quiero poder ignorar las pruebas en el tiempo de ejecución, ya que parece ser el resultado correcto (ya que el marco de prueba permitirá que la compilación se apruebe, pero registra que las pruebas no se ejecutaron). Estoy bastante seguro de que la anotación no me dará esta flexibilidad y sospecho que tendré que crear manualmente el conjunto de pruebas para la clase en cuestión. Sin embargo, la documentación no menciona nada sobre esto y al revisar la API tampoco está claro cómo se haría mediante programación (es decir, cómo creo programáticamente una instancia de Test
o similar que sea equivalente a la creada por la anotación @Ignore
?).
Si alguien ha hecho algo similar en el pasado, o tiene una idea brillante de cómo podría hacerlo, me encantaría saberlo.
En JUnit 4, otra opción para usted puede ser crear una anotación para indicar que la prueba debe cumplir con sus criterios personalizados, luego extender el corredor predeterminado con el suyo propio y usar la reflexión, basar su decisión en los criterios personalizados. Puede parecer algo como esto:
public class CustomRunner extends BlockJUnit4ClassRunner {
public CTRunner(Class<?> klass) throws initializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod child) {
if(shouldIgnore()) {
return true;
}
return super.isIgnored(child);
}
private boolean shouldIgnore(class) {
/* some custom criteria */
}
}
La forma en que JUnit es hacer esto en tiempo de org.junit.Assume
es org.junit.Assume
.
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
// rest of setup.
}
Puede hacerlo en un método @Before
o en la prueba en sí, pero no en un método @After
. Si lo haces en la prueba, tu método @Before
se ejecutará. También puede hacerlo dentro de @BeforeClass
para evitar la inicialización de clases.
Un fallo de suposición hace que la prueba sea ignorada.
Edición: para comparar con la anotación @RunIf
de junit-ext , su código de ejemplo se vería así:
@Test
public void calculateTotalSalary() {
assumeThat(Database.connect(), is(notNull()));
//test code below.
}
Sin mencionar que es mucho más fácil capturar y usar la conexión del método Database.connect()
esta manera.
Una nota rápida: Assume.assumeTrue(condition)
ignora el resto de los pasos pero pasa la prueba. Para fallar la prueba, use org.junit.Assert.fail()
dentro de la declaración condicional. Funciona igual que Assume.assumeTrue()
pero falla la prueba.
Usted debe Junit-ext
proyecto Junit-ext
. Tienen una anotación RunIf
que realiza pruebas condicionales, como:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
[Ejemplo de código tomado de su tutorial]