JUnit Урок за анотации с пример: Какво е @Test и @After

⚡ Умно обобщение

JUnit Анотациите са форма на синтактични метаданни, добавени към Java изходния код, така че изпълнителят на теста да знае кои методи да изпълни, кога да ги изпълни и колко време може да отнеме всеки от тях.

  • 🔘 @Тест: Маркира публичен void метод, който JUnit изпълнява се като един тестов случай.
  • ☑️ Кръговат на живота: @Before и @After обгръщат всеки тест, докато @BeforeClass и @AfterClass обгръщат класа.
  • контрол: @Ignore пропуска тест, @Test(timeout) ограничава времето за изпълнение, @Test(expected) генерира изключение.
  • 🧪 Твърдения: org.junit.Assert предоставя assertEquals, assertTrue, assertNull, assertSame и fail().
  • 🛠️ Наследство: TestCase, TestResult и TestSuite принадлежат към по-стария пакет junit.framework.
  • 📊 JUnit 5: Юпитер ги преименува на @BeforeEach, @AfterEach, @BeforeAll, @AfterAll и @Disabled.

JUnit Урок за анотации, обхващащ @Test, @Before и @After

Какво е 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 клас подробно:

  1. Разгледайте метода 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.
  • В резултат на това тестът ще минавам.
  1. Разгледайте метода 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.

  1. Разгледайте метода 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.

Тъй като всички тестови случаи са преминали, това води до успешно изпълнение на теста.

Действителен резултат

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

Eclipse конзолен изход, показващ операторите за печат @BeforeClass, @Before, @After и @AfterClass
Конзолен изход, генериран от JunitAnnotationsExample

Вижте по-долу отчетите за печат, които могат да се видят на конзолата:

Използване на @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. предупреждение за статичен тест (низово съобщение) Този метод връща тест, който ще бъде неуспешен и ще регистрира предупредително съобщение.

Въпроси и Отговори

Да. Методът обикновено носи @Test заедно с @Ignore или @Test с време за изчакване и очаквано изключение. Не можете да подреждате две анотации за жизнения цикъл, като например @Before и @After, в един метод.

@Ignore само потиска метод JUnit вече разпознава като тест. Без @Test до него, runner-ът никога не събира метода, така че той нито се изпълнява, нито се изброява като пропуснат.

JUnit изпълнява метода в отделна нишка и го отхвърля с TestTimedOutException, след като бюджетът изтече. Нишката се прекъсва, а не се завършва, така че блокиращо извикване може да продължи да се изпълнява.

Само чрез винтидж енджина. Добавянето на junit-vintage-engine позволява на JUnit Платформата изпълнява съществуващите тестове org.junit без промяна, но тестовете на Jupiter трябва да импортират org.junit.jupiter.api. Смесването на двата набора за импортиране в един клас е неуспешно.

Само за поддръжка. Старите пакети, които разширяват TestCase и изграждат TestSuite обекти, остават често срещани в по-старите кодови бази, така че разпознаването на API помага. Новите тестове трябва да са базирани на анотации.

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

Асистентите с изкуствен интелект прочитат тествания метод и предлагат дали настройката принадлежи към @Before или @BeforeClass и дали пътят на неуспех изисква @Test(expected) или assertThrows. Всяко предложение се третира като чернова.

Копилот на GitHub обикновено поставя правилно настройката и демонтажа, но често се смесва JUnit 4 и Jupiter импортират в един файл. Проверете блока за импортиране, преди да стартирате пакета.

Обобщете тази публикация с: