JUnit — библиотека для модульного тестирования программного обеспечения на языке Java. В основном используется для модульного тестирования Java проектов, однако может быть использована с Selenium WebDriver для автоматизации тестирования веб-приложений.
Преимущества JUnit:
- Представляет из себя тестовую среду.
- Не требует контроля со стороны пользователя во время исполнения.
- Возможность запускать несколько тестов одновременно.
- Сообщения обо всех ошибках в ходе тестирования.
Тестовые классы JUnit 4 можно исполнять как с помощью интегрированной среды разработки, например, Eclipse, так и с помощью интерфейса командной строки.
Поддержка аннотаций Java 5 существенно отличает JUnit 4 от предшествующих версий.
Аннотация @Test
Объявление теста в JUnit 4 сводится к простой маркировке тестового метода аннотацией @Test
и отсутствию необходимости в наследовании от какого-либо специального класса. Можно организовать тестирование с ограничением по времени – для этого достаточно после аннотации @Test
указать значение параметра timeout
.
@Test(timeout=60) public void testSimple() { WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); assertTrue("Page is not google.com", driver.getCurrentUrl().equals("http://www.google.com")); }
Тестирование того, что код корректно работает в исключительных ситуациях, не менее важно, чем тестирование реальной функциональности кода. Можно искусственно поставить свой код в контролируемую исключительную ситуацию и проверить выбрасывается ли ожидаемое исключение. Вместо использования блока try catch
можно в аннотации @Test
указать ожидаемое исключение:
/** * JUnit отловит AssertionError и тест не завершиться ошибкой */ @Test(expected=AssertionError.class) public void testSuccessExpected() { driver.get("http://internetka.in.ua"); assertTrue("Url is not correct", driver.getCurrentUrl().equals("http://www.google.com")); }
Аннотация @Ignore
Эта аннотация позволяет игнорировать выполнение тестового метода.
@Ignore("ignored for now because ...") @Test public void ignoredTestMethod() { assertTrue("ignored test method is executed", false); }
Также, если поместить эту аннотацию на класс, то все тесты в этом классе будут отключены.
Аннотации @BeforeClass, @AfterClass, @Before, @After
Благодаря использованию аннотаций в JUnit 4 используется гибкая фикстурная модель. Аннотации позволяют исполнять одну и ту же фикстуру для каждого теста или всего один раз для всего класса, или не исполнять ее совсем. Предусмотрено четыре аннотации фикстур: на уровне класса — @BeforeClass
и @AfterClass
и на уровне теста — @Before
и @After
.
@Before
используется для выполнения множества предварительных условий перед выполнением теста. Например, если есть необходимость записать данные в БД или создать пользователя перед выполнением теста. Метод, помеченный @Before
будет выполняться перед выполнением каждого теста в классе.
Метод, помеченный @After
запускается после выполнения каждого теста. Например, если нужно очищать переменные после выполнения каждого теста, то этой аннотацией можно маркировать метод, имеющий необходимый код.
Более того, можно маркировать одновременно несколько методов аннотациями @Before и @After. Однако, следует иметь в виду, что эти методы могут запускаться в различном порядке.
package org.openqa.selenium.example; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class SeleniumJUnitExample { public WebDriver driver; @Before public void setUp() { driver = new FirefoxDriver(); } @Test public void someSimpleTest() { driver.get("http://www.google.com"); WebElement element = driver.findElement(By.name("q")); element.sendKeys("Cheese!"); element.submit(); System.out.println("Page title is: " + driver.getTitle()); } @Ignore("ignored for now because ...") @Test public void ignoredTestMethod() { assertTrue("ignored test method is executed", false); } @After public void tearDown() { driver.quit(); } }
Аннотация @BeforeClass
обозначает методы, которые будут вызваны до создания экземпляра тест-класса, методы должны быть public static void. Аннотация @AfterClass
связана по смыслу с @BeforeClass
, но выполняет методы после теста, как и в случае с @BeforeClass
, методы должны быть public static void.
В версии JUnit 4 наборы тестов реализуются также с помощью аннотаций.
@RunWith
— позволяет для прогона тестового класса применять других «исполнителей» вместо исполнителей, встроенных в инфраструктуру тестирования. В комплект JUnit 4 входит исполнитель наборов тестов — класс под названием Suite
, который и указывается в этой аннотации.
@SuiteClasses -
параметром аннотации является список классов, представляющих набор тестов.
@RunWith(Suite.class) @SuiteClasses({ATest.class, BTest.class, CTest.class}) public class ABCSuite { }
Здравствуйте! Интересует такой вопрос: можно ли параметризовать Suite, и есть ли для для Suite аналоги @Before или @BeforeClass как для Test?
@BeforeClass и @AfterClass работают в пределах Suite, т.е. один раз перед запуском всех тестовых классов и один раз при завершении. Все остальное решается написанием кастомного расширенного Suite runner.
То есть, если при использовании @BeforeClass и @AfterClass внутри Suite, методы помеченные этими аннотациями будут выполнять до и после всего Suite’а?
Именно так.
Большое спасибо!
Добрый день!
В самом начале поста написано: «Возможность запускать несколько тестов одновременно». Не подскажете, где можно про это почитать?
Конкретно не подскажу, но можно покопать в сторону использования RunnerScheduler, хороший пример — http://www.junit.org/node/589.
Или если используется maven, то там есть surefire плагин, им можно запустить junit-тесты параллельно.
Добрый вечер! Подскажите пожалуйста как можно запустить SuiteClass через консоль.
С помощью maven Suite запускается также, как и обычный тест:
mvn test -Dtest=SuiteCase
Для скомпилированного Java проекта:
java -cp library/junit-4.10.jar;tests org.junit.runner.JUnitCore example.SuiteCase
library/junit-4.10.jar — путь к библиотеке JUnit;
tests — output folder, в котором находятся скомпилированные тестовые классы;
example.SuiteCase — полное имя тестового класса
Пробую так сделать — выдаётся ошибка:
Error: Could not find or load main class JUnitTest
Из NetBeans запускается без ошибок.
Вы не подскажите, может, есть какая-нибудь программа для запуска тестов?
Мне кажется, через консоль не совсем кошерно, а инфы толком в инете не могу найти.
Запуск тестов через консоль не только кошерный, но и в большинстве случаев наиболее предпочтительный вариант. Он позволяет использовать для тестирования различные Continuous Integration сервера и не привязываться к программному обеспечению. Можете использовать любую IDE для java разработки, если консоль Вам не подходит.
Какой именно вариант запуска выдает ошибку?
Здравствуйте, Татьяна!
А не могли бы Вы подсказать, что я делаю не так.
У меня есть maven-проект.
Запускаю тест в командной строке из директории, где лежит pom.xml с помощью команды mvn test. Тест запускается.
Но вот с помощью jUnit никак не могу.
Моя библиотека jUnit лежит в C:\Users\User\.m2\repository\junit\4.9\junit-4.9.jar
Насколько я понимаю, проект maven скомпилированные файлы складывает в target.
То есть путь такой: C:\Users\User\workspace\seleniumproject\target\test-classes\com\selenium\LoginTest.class
Пишу в консоли:
java – cp C:\Users\User\.m2\repository\junit\4.9\junit-4.9.jar; C:\Users\User\workspace\seleniumproject\target\test-classes org.junit.runner.JUnitCore com.selenium.LoginTest
Получаю ошибку «Exception in thread «main» java.lang.NoClassDefFoundError: org/openqa/selenium/MoSuchElementException”
OS – Windows7.
Заранее спасибо.
Здравствуйте, помимо JUnit Вам нужно использовать и все остальные библиотеки, в частности selenium. Соберите все необходимые библиотеки в одну папку и используйте что-то вроде
lib/*
Добрый день! а вот вопрос по выполнению аннотаций, в режиме Debug — @After отрабатывает корректно, а в режиме Run — @After не выполняется. Всё это происходит в IDEA 11. Пока не представляю в чём именно может быть причина — может есть идеи?? Спасибо
точнее в @After не отрабатывает selenium.close();
Добрый день, попробуйте вывести что-нибудь в консоль из метода @After, чтобы проверить запускается ли метод на выполнение.
Если selenium — это WebDriver, то лучше использовать selenium.quit();
Tatyana, да, всё прочее из @After выполняется, например System.out.println(«тра-та-та») и до selenium.close(), и после.
Selenium — это WebDriver и, признаться, quit() хотел испробовать, но не испробовал. Сейчас и затестим, отпишусь, спасибо!!
да, Tatyana, quit решил вопрос!) Вопрос оказался простым, разочаровался в своём опыте, надо учиться. Спасибо!!