Бесплатный курс по Java: от основ до продвинутого уровня
Аннотации в JUnit тестах
Далее пройдемся по основным аннотациям junit.
В скобках у аннотации Test можно указать число. Это число – это количество миллисекунд. Если метод будет выполняться больше этого количества миллисекунд, то программа сообщит об этом.
Таким образом можно протестировать производительность тестируемого метода.
Пример программы:
import org.junit.Assert;
import org.junit.Test;
public class TestCalc {
// проверяет, что метод исполняется
// не более 100 миллисекунд
@Test(timeout = 100)
public void testPow2() throws Exception {
Calc calc = new Calc();
int result = 0;
// Сделаем так чтобы тестовый
// метод длился более 100 миллисекунд.
// Хотя этот цикл было бы логичнее разместить
// в тестируемом методе pow, так как мы тестируем его
// производительность, а не тестового метода.
for (int i = 0; i < 1000000; i++) {
result = calc.pow(2, 4);
}
Assert.assertEquals(16, result);
}
}
Скомпилируем и запустим:
Видим, что программа сообщает нам о том, что метод выполнялся более 100 миллисекунд. Значит очевидно нужно налаживать производительность.
Аннотация @Ignore
Если в тестовом классе несколько тестовых методов, то мы можем отключать какие-либо из них с помощью аннотации Ignore
Пример программы:
import org.junit.Assert;
import org.junit.Test;
import org.junit.Ignore;
public class TestCalc {
@Test
public void testPow() throws Exception{
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(14, result);
}
//Также какой-либо тест можно отключить
//(следующий тест за этой
//аннотацией не запуститься).
@Ignore
@Test
public void testPow1() throws Exception{
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(16, result);
}
@Test(timeout=100)
public void testPow2() throws Exception{
Calc calc = new Calc();
int result = 0;
for(int i=0;i<1000000;i++){
result = calc.pow(2, 4);
}
Assert.assertEquals(16, result);
}
}
Компилируем и запускаем:
Как видим, хоть тестовых метода у нас три, а тестировалось всего два – Tests run: 2. Так как второй тестовый метод мы отключили.
Аннотации @BeforeClass, @AfterClass
С помощью аннотации @BeforeClassможно создать метод, который будет выполнен единожды перед тем, как начнут выполняться тестовые методы, а с помощью аннотации @AfterClassможно создать метод, который будет выполнен единожды после того, как выполняться все тестовые методы.
Зачем же нужны эти методы?
В случае с BeforeClass, чтобы, например, инициализировать какие-то данные, которые будут использоваться во всех тестах, в случае с AfterClass освободить какие-то ресурсы.
Пример программы:
import org.junit.Assert;
import org.junit.Test;
import org.junit.BeforeClass;
import org.junit.AfterClass;
public class TestCalc {
//этот метод запускается перед тестовыми
@BeforeClass
public static void testBeforeClass() throws Exception{
System.out.println(“before all classes”);
}
//этот метод запускается после всех тестовых
@AfterClass
public static void testAfterClass() throws Exception{
System.out.println(“after all classes”);
}
@Test
public void testPow() throws Exception{
System.out.println(“Test method 1”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(14, result);
}
@Test
public void testPow1() throws Exception{
System.out.println(“Test method 2”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(16, result);
}
@Test(timeout=100)
public void testPow2() throws Exception{
System.out.println(“Test method 3”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(16, result);
}
}
Компилируем и запускаем.
Видим, что сразу вывелось сообщение из метода помеченного@BeforeClass,потом сообщения тестовых методов, потом сообщение из метода помеченного@AfterClass.
Аннотации @Before, @After
С помощью аннотации @Before можно создать метод, который будет выполняться перед каждым тестовым методом, а с помощью аннотации @Afterможно создать метод, который будет выполняться после каждого тестового метода
Пример программы:
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
public class TestCalc {
//этот метод запускается перед каждым тестовым
@Before
public void testBefore() throws Exception{
System.out.println(“before every class”);
}
//этот метод запускается после каждого тестового
@After
public void testAfter() throws Exception{
System.out.println(“after every class”);
}
@Test
public void testPow() throws Exception{
System.out.println(“Test method 1”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(14, result);
}
@Test
public void testPow1() throws Exception{
System.out.println(“Test method 2”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(16, result);
}
@Test(timeout=100)
public void testPow2() throws Exception{
System.out.println(“Test method 3”);
Calc calc = new Calc();
int result = calc.pow(2, 4);
Assert.assertEquals(16, result);
}
}
Компилируем и запускаем.
Видим, что перед каждым сообщением из тестового метода выводилось сообщение из метода помеченного @Before, и также послекаждого сообщения тестового метода выводилось сообщение из метода помеченного аннотацией @After.