Ignorar condicionalmente las pruebas en JUnit 4


OK, así que la anotación @Ignore es buena para marcar que un caso de prueba no debe ser ejecutado.

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 necesita ejecutarse en una máquina con un cierto número de núcleos. Si esta prueba se ejecuta en una máquina uniprocesador, no creo que sería correcto simplemente pasar la prueba (ya que no se ha ejecutado), y ciertamente no sería correcto fallar la prueba y romper el construir.

Así que quiero ser capaz de ignorar las pruebas en tiempo de ejecución, ya que este parece ser el resultado correcto (ya que el marco de pruebas permitirá que la compilación pase, pero registrará que las pruebas no se ejecutaron). Estoy bastante seguro de que la anotación no me dará esta flexibilidad, y sospecho que necesitaré crear manualmente el conjunto de pruebas para la clase en cuestión. Sin embargo, la documentación no menciona nada sobre esto y mirando a través de la API tampoco está claro cómo sería esto hacer mediante programación (es decir, ¿cómo puedo crear mediante programación un ejemplo de Test o similares, que es equivalente a la creada por el @Ignore anotación?).

Si alguien ha hecho algo similar en el pasado, o tiene una idea brillante de cómo podría hacer esto, estaría feliz de oírlo.

Author: Andrzej Doyle, 2009-11-06

4 answers

La forma JUnit es hacer esto en tiempo de ejecución 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 misma, pero no en un método @After. Si lo hace en la propia prueba, su método @Before se ejecutará. También puede hacerlo dentro de @BeforeClass para evitar la inicialización de clases.

Un error de suposición hace que la prueba se ignore.

Editar: Para comparar con la anotación @RunIf de junit-ext , su código de muestra se vería como esto:

@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 desde el método Database.connect() de esta manera.

 383
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 02:01:13

Usted debe pagar Junit-ext proyecto. Tienen RunIf anotación 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;
   }
}

[Muestra de código tomada de su tutorial]

 40
Author: notnoop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-28 15:16:20

En JUnit 4, otra opción para usted puede ser crear una anotación para indicar que la prueba necesita cumplir con sus criterios personalizados, luego extender el runner predeterminado con el suyo propio y usar reflexión, basar su decisión en los criterios personalizados. Puede verse 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 */
    }
}
 6
Author: Kyle Shrader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 23:54:16

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 instrucción condicional. Funciona igual que Assume.assumeTrue() pero falla la prueba.

 -3
Author: TIn TIn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 20:06:04