JUnit Урок за анотации с пример: Какво е @Test и @After
⚡ Умно обобщение
JUnit Анотациите са форма на синтактични метаданни, добавени към Java изходния код, така че изпълнителят на теста да знае кои методи да изпълни, кога да ги изпълни и колко време може да отнеме всеки от тях.

Какво е JUnit анотации?
JUnit анотации са специална форма на синтактични метаданни, които могат да бъдат добавени към Java изходния код за по-добра четимост и структура на кода. Променливи, параметри, пакети, методи и класове могат да бъдат анотирани. Анотациите бяха въведени в JUnit 4, което прави Java кодът е по-четлив и опростен. Това е голямата разлика между JUnit 3 и JUnit 4: JUnit 4 е базиран на анотации.
С практически познания за тези анотации, човек може лесно да научи и приложи JUnit тест. По-долу е важното и често използвано JUnit списък с анотации, с JUnit 5 (Юпитер) еквивалента до всеки един:
| S.No. | Анотации | Descriptйон | JUnit 5 еквивалента |
|---|---|---|---|
| 1. | @Тест | Тази анотация е заместител на junit.framework.TestCase и показва, че public void методът, към който е прикачена, може да бъде изпълнен като тестов случай. | @Тест (org.junit.jupiter.api) |
| 2. | @Преди | Тази анотация се използва, ако искате да изпълните някакво изявление като предварителни условия преди всеки тестов случай. | @BeforeEach |
| 3. | @BeforeClass | Тази анотация се използва, ако искате да изпълните някои оператори преди всички тестови случаи, например тестова връзка, която трябва да бъде отворена преди всички тестови случаи. | @ПредиВсички |
| 4. | @След | Тази анотация може да се използва, ако искате да изпълните някои оператори след всеки Тестов случай, например нулиране на променливи или изтриване на временни файлове. | @AfterEach |
| 5. | @След часовете | Тази анотация може да се използва, ако искате да изпълните някои оператори след всички тестове, например освобождаване на ресурси след изпълнение на всички тестове. | @AfterAll |
| 6. | @Игнориране | Тази анотация може да се използва, ако искате да игнорирате някои оператори по време на изпълнение на тест, например деактивиране на някои тестови случаи по време на изпълнение на тест. | @Инвалид |
| 7. | @Test(време за изчакване=500) | Тази анотация може да се използва, ако искате да зададете известно време за изчакване по време на изпълнение на теста, например ако работите по SLA (споразумение за ниво на обслужване) и тестовете трябва да бъдат завършени в рамките на определено време. | @Timeout или assertTimeout |
| 8. | @Test(expected=IllegalArgumentException.class) | Тази анотация може да се използва, ако искате да обработите някакво изключение по време на изпълнение на тест. Например, ако искате да проверите дали даден метод хвърля посочено изключение или не. | assertThrows |
JUnit Пример за анотации
Нека създадем клас, обхващащ важното JUnit анотации с прости изрази за печат и го изпълнете с тестов клас:
Стъпка 1) Обмислете по-долу Java клас, съдържащ различни методи, които са прикачени към горепосочените анотации:
JunitAnnotationsExample.java
package guru99.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.util.ArrayList; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class JunitAnnotationsExample { private ArrayList<String> list; @BeforeClass public static void m1() { System.out.println("Using @BeforeClass , executed before all test cases "); } @Before public void m2() { list = new ArrayList<String>(); System.out.println("Using @Before annotations ,executed before each test cases "); } @AfterClass public static void m3() { System.out.println("Using @AfterClass ,executed after all test cases"); } @After public void m4() { list.clear(); System.out.println("Using @After ,executed after each test cases"); } @Test public void m5() { list.add("test"); assertFalse(list.isEmpty()); assertEquals(1, list.size()); } @Ignore public void m6() { System.out.println("Using @Ignore , this execution is ignored"); } @Test(timeout = 10) public void m7() { System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case"); } @Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); } }
Стъпка 2) Нека създадем клас за изпълнение на тестове, който да изпълни горния тест:
TestRunner.java
package guru99.junit; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(JunitAnnotationsExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
очакван резултат
- Всички тестови случаи ще бъдат изпълнени един по един, а всички print оператори могат да се видят на конзола.
- Както е обсъдено в горната таблица, @Before и @BeforeClass в JUnit [ методите m2() и m1() ] ще бъдат изпълнени съответно преди всеки тестов случай и преди всички тестови случаи.
- По същия начин @After и @AfterClass в JUnit (методите m4() и m3()) ще се изпълняват съответно след всеки тестов случай и след всички тестови случаи. @Ignore (метод m6()) ще се третира като игнориране на теста.
Нека анализираме тестовите случаи, използвани в горното Java клас подробно:
- Разгледайте метода m5(), както е даден по-долу:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
В горния метод, докато добавяте низ към променливата „list“:
- list.isEmpty() ще върне false.
- assertFalse(list.isEmpty()) трябва да върне true.
- В резултат на това тестът ще минавам.
Тъй като сте добавили само един низ към списъка, размерът е един.
- list.size() трябва да върне целочислената стойност „1“.
- So assertEquals(1, list.size()) трябва да върне true.
- В резултат на това тестът ще минавам.
- Разгледайте метода m7(), както е даден по-долу:
@Test(timeout = 10)
public void m7() {
System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}
Както бе обсъдено по-горе, @Test(време за изчакване = 10) се използва за налагане на време за изчакване в тестовия случай. Стойността е в милисекунди, така че m7() трябва да завърши в рамките на 10 ms.
- Разгледайте метода m8(), както е даден по-долу:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
Както бе обсъдено по-горе, @Тест (очаква се) ще провери за посоченото изключение по време на изпълнението си, така че методът m8() ще хвърли „No Such Method Exception“. В резултат на това тестът ще бъде изпълнен с изключение.
Забележка за точност: m8() отпечатва само ред, така че декларираното изключение никога не се хвърля и JUnit 4 отчита теста като неуспешен. Подравнете очаквания тип с това, което методът действително хвърля. JUnit 5 пише това с assertThrows.
Тъй като всички тестови случаи са преминали, това води до успешно изпълнение на теста.
Действителен резултат
Тъй като в горния пример има три тестови случая, всички тестове ще бъдат изпълнени един по един. Вижте екранната снимка на конзолата по-долу:

Вижте по-долу отчетите за печат, които могат да се видят на конзолата:
Използване на @BeforeClass, изпълнено преди всички тестови случаи
Използване на анотации @Before, изпълнявани преди всеки тестов случай
Използване на @After, изпълнявано след всеки тестов случай
Използване на анотации @Before, изпълнявани преди всеки тестов случай
Използвайки @Test(timeout), може да се използва за налагане на таймаут JUnit4 тестов случай
Използване на @After, изпълнявано след всеки тестов случай
Използване на анотации @Before, изпълнявани преди всеки тестов случай
Използвайки @Test(expected), той ще проверява за определено изключение по време на изпълнението си
Използване на @After, изпълнявано след всеки тестов случай
Използване на @AfterClass, изпълнено след всички тестови случаи
JUnit Утвърдете клас
Анотациите решават кога даден метод се изпълнява; методите assert решават дали той преминава успешно.
Този клас предоставя набор от методи за твърдения, полезни при писането на тестови случаи. Ако всички assert оператори са успешни, резултатите от теста са успешни. Ако някой assert оператор е неуспешен, резултатите от теста са неуспешни. Специализираният JUnit твърдя Урокът обхваща всеки метод подробно.
Както видяхте по-рано, таблицата по-долу описва важни методи на Assert и тяхното описание:
| S.No. | Начин на доставка | Descriptйон |
|---|---|---|
| 1. | void assertEquals(булева очаквана, булева действителна) | Той проверява дали две стойности са равни, подобно на метода equals на класа Object. |
| 2. | void assertFalse (булево условие) | Функционалността е да се провери дали дадено условие е невярно. |
| 3. | void assertNotNull (обект обект) | Функционалността „assertNotNull“ е да провери дали даден обект не е нулев. |
| 4. | void assertNull (обект обект) | Функционалността „assertNull“ е да провери дали даден обект е null. |
| 5. | void assertTrue (булево условие) | Функционалността „assertTrue“ е да провери дали дадено условие е вярно. |
| 6. | void fail() | Ако искате да генерирате грешка в твърдението, fail() винаги води до грешка „неуспешно“. |
| 7. | void assertSame([Съобщение за низ] | Функционалността „assertSame“ е да провери дали двата обекта се отнасят за един и същ обект. |
| 8. | void assertNotSame([Съобщение от низ] | Функционалността „assertNotSame“ е да провери дали двата обекта не се отнасят за един и същи обект. |
JUnit Клас тестови случаи
За да се изпълнят множество тестове, класът TestCase е наличен в junit.framework пакет. Анотацията @Test казва JUnit че този публичен void метод (тук тестов случай), към който е прикачен, може да се изпълни като тестов случай.
Бележка към версията: TestCase, Резултат от тест намлява TestSuite принадлежат към наследството junit.framework пакет от JUnit 3. Те все още се доставят вътре в артефакта junit 4.x, но тестовете, базирани на анотации, не разширяват TestCase.
Таблицата по-долу показва някои важни методи, налични в junit.framework.TestCase клас:
| S.No. | Начин на доставка | Descriptйон |
|---|---|---|
| 1. | int countTestCases() | Този метод се използва за преброяване на броя на изпълнените тестови случаи от изпълнение (TestResult tr) метод. |
| 2. | TestResult createResult() | Този метод се използва за създаване на a Резултат от тест обект. |
| 3. | Низ getName() | Този метод връща низ, който не е нищо друго освен a TestCase име. |
| 4. | TestResult run() | Този метод се използва за изпълнение на тест, който връща Резултат от тест обект. |
| 5. | невалидно изпълнение (резултат от TestResult) | Този метод се използва за изпълнение на тест, имащ a Резултат от тест обект, който не връща нищо. |
| 6. | void setName(име на низ) | Този метод се използва за задаване на името на TestCase. |
| 7. | void setUp() | Този метод се използва за писане на код за асоцииране на ресурси, например създаване на връзка с база данни. |
| 8. | void tearDown() | Този метод се използва за писане на код за освобождаване на ресурси, например освобождаване на връзка с база данни след извършване на транзакция. |
JUnit Клас TestResult
Когато изпълните тест, той връща резултат (под формата на Резултат от тест Този обект TestResult може да се използва за анализ на резултантния обект. Резултатът от теста може да бъде или неуспешен, или успешен.
Вижте таблицата по-долу за важни методи, използвани в класа junit.framework.TestResult:
| S.No. | Начин на доставка | Descriptйон |
|---|---|---|
| 1. | void addError(Тест тест, Throwable t) | Този метод се използва, ако е необходимо да се добави грешка към теста. |
| 2. | void addFailure(Тест тест, AssertionFailedError t) | Този метод се използва, ако е необходимо да добавите повреда към списъка с повреди. |
| 3. | void endTest (Тестов тест) | Този метод се използва за уведомяване, че е извършен (завършен) тест. |
| 4. | int errorCount() | Този метод се използва за откриване на грешки по време на изпълнение на теста. |
| 5. | Изброяване грешки() | Този метод просто връща колекция (тук изброяване) от грешки. |
| 6. | int failureCount() | Този метод се използва за получаване на броя на откритите грешки по време на изпълнение на теста. |
| 7. | празно изпълнение (тест TestCase) | Този метод се използва за изпълнение на тестов случай. |
| 8. | int runCount() | Този метод просто брои изпълнените тестове. |
| 9. | void startTest (Тестов тест) | Този метод се използва за уведомяване, че е започнал тест. |
| 10. | void stop() | Този метод се използва за спиране на тестовото изпълнение. |
JUnit Тестов пакет клас
Ако искате да изпълните множество тестове в определен ред, това може да стане чрез комбиниране на всички тестове на едно място. Това място се нарича набор от тестове и JUnit тестов набор Урокът показва пълен пример.
Вижте таблицата по-долу за важните методи, използвани в junit.framework.TestSuite клас:
| S.No. | Начин на доставка | Descriptйон |
|---|---|---|
| 1. | void addTest (Тест тест) | Този метод се използва, ако искате да добавите тест към пакета. |
| 2. | void addTestSuite(Клас testClass) | Този метод се използва, ако искате да посочите класа, докато добавяте тест към пакета. |
| 3. | int countTestCases() | Този метод се използва, ако искате да преброите броя на тестовите случаи. |
| 4. | Низ getName() | Този метод се използва за получаване на името на тестовия пакет. |
| 5. | невалидно изпълнение (резултат от TestResult) | Този метод се използва за изпълнение на тест и събиране на резултатите от теста в Резултат от тест обект. |
| 6. | void setName(име на низ) | Този метод се използва за задаване на името на TestSuite. |
| 7. | Тествайте testAt(int индекс) | Този метод се използва, ако искате да върнете теста по даден индекс. |
| 8. | int testCount() | Този метод се използва, ако искате да върнете броя на тестовете в пакета. |
| 9. | предупреждение за статичен тест (низово съобщение) | Този метод връща тест, който ще бъде неуспешен и ще регистрира предупредително съобщение. |
