Хочу вас познакомить еще с одним инструментом для тестирования, в этой небольшой статье мы рассмотрим основные возможности TestNG .
TestNG – это фреймворк для тестирования, написанный на Java, он взял много чего с JUnit и NUnit, но он не только унаследовался от существующей функциональности Junit, а также внедрил новые инновационные функции, которые делают его мощным, простым в использовании.
TestNG предназначен для:
• unit тестирования;
• функционального тестирования;
• интеграционного тестирование и т.д.
Какие возможности в TestNG?
1) Annotations. (Аннотации);
2) Использование XML для гибкого конфигурирования тестов;
3) Поддержка data-driven тестирования (с помощью аннотации @DataProvider);
4) Зависимые методы для тестирования серверных приложений;
5) Поддерживается в Eclipse, IDEA, Ant, Maven, Netbean, Hudson;
6) Тестирование вашего кода проходит многопоточно, что дает безопасность и быстродействие;
7) Легкий переход от JUnit.
Содержание урока
Шаг 6. Игнорирование тестовых методов
Шаг 1. Начало
Давайте напишем первый наш тест используя TestNG.
Для этого я буду использовать среду разработки Intellij IDEA 12.
Создаем Maven проект и добавляем зависимости:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>TestNG</groupId> <artifactId>TestNG</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8</version> </dependency> </dependencies> </project>
После этого создадим класс Calc.java и тестовый класс CalcTest.java для него.
Содержимое класса Calc.java:
package com.devcolibri.logic; public class Calc { public int sum(int a, int b){ return a + b; } }
Содержимое класса CalcTest.java:
package com.devcolibri.logic; import org.testng.annotations.Test; public class CalcTest { private Calc calc = new Calc(); @Test public void testSum() throws Exception { } }
7-я строка – это экземпляр класса который мы будем тестировать.
9-я строка – эта аннотация говорти о том что данный метод есть тестовым и может запускаться в отдельном потоке.
Шаг 2. Первый тест
Давайте напишем тест на метод в классе Calc.java:
package com.devcolibri.logic; import org.testng.Assert; import org.testng.annotations.Test; public class CalcTest { private Calc calc = new Calc(); @Test public void testSum() throws Exception { Assert.assertEquals(5, calc.sum(2,3)); } }
У нас есть класс, в котором есть метод, который находил сумму двух чисел. Для него мы написали тест, где проверили, что сумма числа 2 и 3 должна быть равна 5-ти.
С помощью класса Assert библиотеки TestNG мы проверяем на правильность работы метода.
Шаг 3. Запуск тестов
Теперь запускаем написанный тест.
После выполнения теста вы увидите следующий результат:
Мы видим, что тест удачно прошел!
После удачного прохождения тестов формируется специальный xml файл, с его помощью мы можем прогонять тесты повторно, используя консоль cmd.
Файл находится по этом пути: C:\Users\<account>\.IntelliJIdea12\system\temp-testng-customsuite.xml, у меня он со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Custom suite" parallel="none"> <test verbose="1" name="TestNG" annotations="JDK"> <classes> <class name="com.devcolibri.logic.CalcTest"> <methods> <include name="testSum"/> </methods> </class> </classes> </test> </suite>
Запустить тесты можно через консоль используя файл temp-testng-customsuite.xml, для этого войдите в cmd и введите команду:
java -ea -classpath .;testng-5.14.1.jar org.testng.TestNG testng.xml
Внимание!
Тестовый класс, в нашем случае ClacTest.java, должен быть скомпилирован.
Шаг 4. Аннотации TestNG
TestNG является более гибким благодаря своим аннотациям. Что они нам предоставляют?
Значит существует 10 управляемых аннотаций TestNG:
1. @BeforeSuite
– указывает, что данный метод будет запускаться перед любым методом тестового класса.
2. @BeforeGroups
– аннотирует методы, которые будут выполняться перед первым методом в любой из указанных групп.
3. @BeforeClass
– указывает, что метод будет выполнен до всех тестовых методов тестового класса.
4. @BeforeTest
– аннотированный метод будет запускаться до всех тестовых методов.
5. @AfterTest
– аннотированный метод будет запущен после всех тестовых методов, принадлежащих классам внутри тега <test>.
6. @BeforeMethod
– аннотированный метод будет выполняться перед каждым тестовым методом.
7. @AfterMethod
– аннотированный метод будет запускаться после каждого тестового метода.
8. @AfterClass
– аннотированный метод будет запущен после всех тестовых методов в текущем классе.
9. @AfterGroups
– аннотируется методы, которые будут выполняться после всех методом в любом из указанных групп.
10. @AfterSuite
– указывает, что данный метод, будет запускаться после всех методов тестового класса.
Вот, что у нас должно получится:
package com.devcolibri.logic; import org.testng.Assert; import org.testng.annotations.*; public class CalcTest { private Calc calc = new Calc(); @BeforeMethod public void setUp() throws Exception { System.out.println("@BeforeMethod"); } @AfterMethod public void tearDown() throws Exception { System.out.println("@AfterMethod"); } @BeforeGroups public void beforeGroups() throws Exception { System.out.println("BeforeGroups"); } @AfterGroups public void afterGroups() throws Exception { System.out.println("@AfterGroups"); } @BeforeClass public void beforeClass() throws Exception { System.out.println("@BeforeClass"); } @BeforeTest public void beforeTest() throws Exception { System.out.println("@BeforeTest"); } @AfterTest public void afterTest() throws Exception { System.out.println("@AfterTest"); } @AfterClass public void afterClass() throws Exception { System.out.println("@AfterClass"); } @BeforeSuite public void beforeSuite() throws Exception { System.out.println("@BeforeSuite"); } @AfterSuite public void afterSuite() throws Exception { System.out.println("@AfterSuite"); } @Test public void testSum() throws Exception { Assert.assertEquals(5, calc.sum(2,3)); System.out.println("@Test"); } }
И вот результат:
Шаг 5. Исключения
Отловить ожидаемую ошибку можно с помощью аннотации @Test через параметр expectedExceptions:
package com.devcolibri.logic; import org.testng.Assert; import org.testng.annotations.Test; import java.util.List; public class TestExpectedExceptionTest extends Assert { @Test(expectedExceptions = NullPointerException.class) public void testNullPointerException() { List list = null; int size = list.size(); } }
где expectedExceptions – ожидаемое исключение(ошибка).
В этом случае тест пройдет успешно, так как мы ожидаем, что данный тест выбросит нам NullPointerException.
Шаг 6. Игнорирование тестовых методов
Иногда требуется проигнорировать тестовый метод, если вам например в очередном тестировании не требуется выполнять данный тестируемый метод.
Для того, чтобы проигнорировать тестовый метод, вам достаточно указать в аннотации @Test параметре enabled = false.
package com.devcolibri.logic; import org.testng.annotations.*; public class TestNGIgnoreTest { @Test(enabled = false) public void testsetProperty() { System.out.println("Этот метод будет проигнорирован в момент проведения тестирования!"); } }
Шаг 7. Timeout
Если вам потребуется ограничить время проведения теста для определенного тестового метода, то вам на помощь приходит параметр timeOut аннотации @Test.
package com.devcolibri.logic; import org.testng.annotations.*; public class TestNGTimeTest { @Test(timeOut = 1000) public void waitLongTime() throws Exception { Thread.sleep(1001); } }
в данном случаем тестовый метод будет завален, так как лимит времени для его выполнения превышает заданный.
В 6-й строке мы заставляем поток заснуть на 1001 миллисекунду.
Шаг 8. Групповое тестирование
Если вам нужно прогнать тесты группами, например, чтобы тестовые методы выполнялись по очереди группами.
Для этого мы можем использовать атрибут groups в аннотации @Test.
Следующий пример имеет 4 тестовых метода, каждый из них входит в группу интеграции, методы testingMethod1, testingMethod3 testingFMethod4 входят в группу Unit1. testingMethod2 входит в группу unit2.
package com.devcolibri.logic; import org.testng.annotations.Test; public class TestNGGroupTest { @Test(groups={"unit1","integration"}) public void testingMethod1() { System.out.println("testingMethod1"); } @Test(groups={"unit2","integration"}) public void testingMethod2() { System.out.println("testingMethod2"); } @Test(groups={"unit1"}) public void testingMethod3() { System.out.println("testingMethod3"); } @Test(groups={"unit1", "unit2"}) public void testingMethod4() { System.out.println("testingMethod4"); } }
После того, как мы написали тесты и разделили их по группам, давайте научимся их запускать.
Для этого нажимаем правой кнопкой мыши по названию тестового класса:
После, в появившимся окне делаем следующие действия познанные цифрами:
После этого жмем Run и в результате выполнения вы увидите, что выполнился только 2 тестовых метод, которые относятся к группе unit2:
Шаг 9. Зависимые тесты
Допустим, есть тестовый класс, в котором есть 2 тестовых метода, где один зависит от другого, то есть первый не пройдет успешно, пока не отработает второй. Давайте рассмотрим, как это сделать.
Сделать это можно с помощью параметра dependsOnMethods аннотации @Test:
import org.testng.annotations.Test; public class TestNGDependencyTest { @Test public void initEnvironmentTest() { System.out.println("This is initEnvironmentTest"); } @Test(dependsOnMethods={"initEnvironmentTest"}) public void testmethod() { System.out.println("This is testmethod"); } }
Как видите, тестовый метод testmethod() зависит от тестового метода initEnvironmentTest() и будет выполнен только после того, как отработает initEnvironmentTest() метод.
Также зависимость можно установить на группу тестов:
import org.testng.annotations.Test; public class TestNGDependencyTest { @Test(groups = { "init" }) public void initEnvironmentTest1() { System.out.println("This is initEnvironmentTest1"); } @Test(groups = { "init" }) public void initEnvironmentTest2() { System.out.println("This is initEnvironmentTest2"); } @Test(dependsOnGroups={"init"}) public void testmethod() { System.out.println("This is testmethod"); } }
Сначала выполнится группа тестов, а потом зависимые от это группы тесты.
p.s. Спасибо за внимание, если урок понравился, то подписывайтесь на обновление ниже.
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
14 комментариев к статье "Тестирование с помощью TestNG в Java"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Спасибо. Помогло. Ждем еще примеров.
@BeforeTest — аннотированный метод будет запускаться после всех уже запущенных тестовых методов.
@AfterTest — аннотированный метод будет запущен до любого тестового метода, принадлежащих классам внутри тега .
исправьте смысловые ошибки
Я тоже обратил внимание на эту ошибку. Только сегодня решил узнать об этой программе, и тут ошибка в коде. Я начинающий тестировшик с небольшим опытом.
При добавлении строки import org.testng.annotations.Test; красным подсвечивается слово Test. При наведении на него курсора мыши получаю Cannot resolve symbol “Test”. В pom файле указал ту же версию testNG, что и в примере.
Версия устарела
надо
org.testng
testng
6.11
test
Да, Дима, лучше поздно, чем никогда :)))
Выполните сначала, например команду mvn clean install. Скорее всего у вас библиотека еще не подтянулась в локальный репозиторий.
Шаг 8. Групповое тестирование, опишите пожалуйста подробнее куда нажимать Run, срабатывает только либо первый либо второй методы
Спасибо!
не могли бы вы подробней описать запуск теста из командной строки.
“Следующий пример имеет 4 тестовых метода, каждый из них входит в группу интеграции, методы testingMethod1, testingMethod3 testingFMethod4 входят в группу Unit1. testingMethod2 входит в группу unit2.”
Ошибка: в приведенном ниже коде в unit2 входит еще и testingMethod4, плюс опечатка в тексте testing”F”Method4..
Хороший гайд, мне как новичку очень помог !
А можете пожалуйста обьяснить, зачем вообще нужна аннотация (Шаг 4. Аннотации TestNG), для чего ее используют?
Первый раз столкнулась с вашими уроками на youtube, когда искала уроки по Java. Сейчас искала информацию по testNG и снова наткнулась на ваш урок. Очень нравится Ваш подход к изложению материала, очень доходчиво объясняете. Спасибо за вашу работу!
Спасибо большое! Отличный материал!
@BeforeTest неверно описан