Условно стартирайте или игнорирайте тестове в JUnit 4

1. Общ преглед

Нека си представим, че имаме тест за някакъв код, който зависи от операционната система и трябва да работи само ако нашата тестова машина работи на Linux. Ако се изпълнява на друга операционна система, искаме тестът да не се провали, а да бъде игнориран по време на изпълнение.

Първият подход може да бъде използването на няколко оператора if за проверка на това състояние, като се използват свойствата на системния клас. Това работи, разбира се, но JUnit има по-чист и по-елегантен метод.

В този кратък урок ще разгледаме как можем условно да стартираме или игнорираме тестове в JUnit 4, като използваме Assume класа .

2. Предполагаем клас

Този клас предоставя набор от методи за поддържане на условно изпълнение на теста въз основа на определени условия . Нашият тест ще се изпълни само ако всички тези условия са изпълнени. Ако не, JUnit просто ще пропусне изпълнението му и ще го маркира като предадено в протокола от теста . Последното е основната разлика с класа Assert , при който неуспешно състояние води до завършване на теста като неуспешен .

Важно е да се отбележи, че описаното от нас поведение за клас Assume е изключително за JUnit runner по подразбиране . При персонализираните бегачи нещата може да са различни.

На последно място, по същия начин, както с отстояват , можем да наречем най поемат методи или в @Before или @BeforeClass анотиран методи или в рамките на @Test самия метод.

Нека сега да разгледаме най-полезните методи от класа Assume, като покажем някои примери. За всички следващи примери, нека приемем, че getOsName () връща Linux.

2.1. Използване на acceptThat

Методът TakeThat () проверява дали състоянието - в този случай getOsName () - отговаря на условията на съвпадението, предадено в:

@Test public void whenAssumeThatAndOSIsLinux_thenRunTest() { assumeThat(getOsName(), is("Linux")); assertEquals("run", "RUN".toLowerCase()); }

В този пример проверихме дали getOsName () е равно на Linux . Тъй като getOsName () връща Linux , тестът ще бъде стартиран . Имайте предвид, че ние използваме метода на съвпадение на Hamcrest е (T) като съвпадение тук.

2.2. Използване на acceptTrue

По подобен начин можем да използваме метода acceptTrue () , за да зададем булев израз, който трябва да оцени като true, за да може тестът да се изпълни. Ако оцени като false , тестът ще бъде игнориран:

private boolean isExpectedOS(String osName) { return "Linux".equals(osName); } @Test public void whenAssumeTrueAndOSIsLinux_thenRunTest() { assumeTrue(isExpectedOS(getOsName())); assertEquals("run", "RUN".toLowerCase()); } 

В този случай isExpectedOs () връща true . Ето защо, на условията за провеждане на изпитване за бягане са изпълнени, и тестът ще се проведе .

2.3. Използване на acceptFalse

И накрая, можем да използваме обратния метод acceptFalse () , за да зададем булев израз, който трябва да се изчисли на false, за да може тестът да се изпълни. Ако оцени като истина , тестът ще бъде игнориран:

@Test public void whenAssumeFalseAndOSIsLinux_thenIgnore() { assumeFalse(isExpectedOS(getOsName())); assertEquals("run", "RUN".toLowerCase()); }

В този случай, както isExpectedOs () също се връща истина, на не са изпълнени условията за провеждане на изпитване за обиколки, а теста ще бъдат игнорирани .

2.4. Използване на acceptNotNull

Когато искаме да игнорираме тест, ако някой израз е нула, можем да използваме метода acceptNotNull () :

@Test public void whenAssumeNotNullAndNotNullOSVersion_thenRun() { assumeNotNull(getOsName()); assertEquals("run", "RUN".toLowerCase()); }

Тъй като getOsName () връща ненулева стойност, условието за провеждане на теста е изпълнено и тестът ще се изпълни.

2.5. Използване на acceptNoException

И накрая, бихме могли да искаме да игнорираме тест, ако бъде хвърлено изключение. За тази цел можем да използваме prevNoException () :

@Test public void whenAssumeNoExceptionAndExceptionThrown_thenIgnore() { assertEquals("everything ok", "EVERYTHING OK".toLowerCase()); String t=null; try { t.charAt(0); } catch(NullPointerException npe){ assumeNoException(npe); } assertEquals("run", "RUN".toLowerCase()); }

В този пример, тъй като т е нула, а NullPointerException изключение е хвърлен, следователно на условията за провеждане на изпитване за пробег не са изпълнени, и тестът ще бъде игнориран .

3. Къде трябва да поставим повикването xXX ?

Важно е да се отбележи, че поведението на методите takeXXX зависи от това къде ги поставяме в нашите тестове .

Нека леко модифицираме нашия exampleThat пример, така че извикването assertEquals () да върви първо. Също така, нека накараме assertEquals () да се провали:

@Test public void whenAssumeFalseAndOSIsLinux_thenIgnore() { assertEquals("run", "RUN"); assumeFalse(isExpectedOS(getOsName())); } 

Когато стартираме този пример, ще имаме:

org.junit.ComparisonFailure: Expected :run Actual :RUN

В този случай нашият тест не се пренебрегва, тъй като е неуспешен, преди да достигнем повикването takeThat () . Същото се случва с всички методи на предположениетоXXX . И така, трябва да сме сигурни, че ги поставяме на правилното място в нашия метод за тестване .

4. Заключение

В този кратък урок видяхме как можем условно да решим дали да се изпълнява тест, като използваме Assume класа в JUnit 4. В случай, че използваме JUnit 5, той е наличен и във версия 5.4 или по-нова .

Както винаги, изходният код на примерите, които сме преживели, може да бъде намерен в GitHub.