it-swarm.com.de

Bedingtes Ignorieren von Tests in JUnit 4

OK, also das @Ignore Annotation ist gut, um zu kennzeichnen, dass ein Testfall nicht ausgeführt werden soll.

Manchmal möchte ich jedoch einen auf Laufzeitinformationen basierenden Test ignorieren. Ein Beispiel könnte sein, wenn ich einen Parallelitätstest habe, der auf einem Computer mit einer bestimmten Anzahl von Kernen ausgeführt werden muss. Wenn dieser Test auf einem Einprozessor-Computer ausgeführt würde, halte ich es nicht für richtig, den Test nur zu bestehen (da er noch nicht ausgeführt wurde), und es wäre sicherlich nicht richtig, den Test nicht zu bestehen und den Build zu brechen .

Daher möchte ich in der Lage sein, Tests zur Laufzeit zu ignorieren, da dies das richtige Ergebnis zu sein scheint (da das Testframework das Bestehen des Builds zulässt, aber aufzeichnet, dass die Tests nicht ausgeführt wurden). Ich bin mir ziemlich sicher, dass die Annotation mir diese Flexibilität nicht bietet, und vermute, dass ich die Testsuite für die betreffende Klasse manuell erstellen muss. In der Dokumentation wird jedoch nichts darüber erwähnt und in der API -Ansicht ist auch nicht klar, wie dies programmgesteuert erfolgen würde (dh wie programmgesteuert erstellt werden soll) eine Instanz von Test oder einer ähnlichen Instanz, die der vom @Ignore Anmerkung?).

Wenn jemand in der Vergangenheit etwas Ähnliches getan hat oder eine gute Vorstellung davon hat, wie ich sonst vorgehen könnte, würde ich mich freuen, davon zu hören.

337
Andrzej Doyle

Der JUnit-Weg, dies zur Laufzeit zu tun, ist org.junit.Assume.

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

Sie können dies in einer @Before - Methode oder im Test selbst tun, jedoch nicht in einer @After - Methode. Wenn Sie dies im Test selbst tun, wird Ihre Methode @Before Ausgeführt. Sie können dies auch innerhalb von @BeforeClass Tun, um eine Klasseninitialisierung zu verhindern.

Ein Annahmefehler führt dazu, dass der Test ignoriert wird.

Edit: Zum Vergleich mit der Annotation @RunIf Von junit-ext sieht der Beispielcode folgendermaßen aus :

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

Ganz zu schweigen davon, dass es viel einfacher ist, die Verbindung von der Database.connect() -Methode auf diese Weise zu erfassen und zu verwenden.

435
Yishai

Sie sollten zur Kasse gehen Junit-ext Projekt. Sie haben die Annotation RunIf, die bedingte Tests durchführt, wie:

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[Codebeispiel aus dem Tutorial]

47
notnoop

In JUnit 4 können Sie auch eine Anmerkung erstellen, die angibt, dass der Test Ihre benutzerdefinierten Kriterien erfüllen muss. Erweitern Sie dann den Standard-Runner mit Ihrem eigenen und stützen Sie Ihre Entscheidung mithilfe von Reflection auf die benutzerdefinierten Kriterien. Es könnte ungefähr so ​​aussehen:

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 */
    }
}
7
Kyle Shrader