Тестирование с помощью TestNG в Java

Хочу вас познакомить еще с одним инструментом для тестирования, в этой небольшой статье мы рассмотрим основные возможности 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.

Содержание урока

Шаг 1. Начало

Шаг 2. Первый тест

Шаг 3. Запуск тестов

Шаг 4. Аннотации TestNG

Шаг 5. Исключения

Шаг 6. Игнорирование тестовых методов

Шаг 7. Timeout

Шаг 8. Групповое тестирование

Шаг 9. Зависимые тесты

Шаг 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. Спасибо за внимание, если урок понравился, то подписывайтесь на обновление ниже.

Урок создан: 04 мая 2013 | Просмотров: 42991 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 04 июня 2014 в 19:34

    Макс

    Спасибо. Помогло. Ждем еще примеров.

  • 10 сентября 2014 в 16:33

    Егор Помидор

    @BeforeTest — аннотированный метод будет запускаться после всех уже запущенных тестовых методов.
    @AfterTest — аннотированный метод будет запущен до любого тестового метода, принадлежащих классам внутри тега .

    исправьте смысловые ошибки

    • 20 декабря 2014 в 08:14

      Сергей Рассолов

      Я тоже обратил внимание на эту ошибку. Только сегодня решил узнать об этой программе, и тут ошибка в коде. Я начинающий тестировшик с небольшим опытом.

  • 29 сентября 2014 в 10:03

    Максим

    При добавлении строки import org.testng.annotations.Test; красным подсвечивается слово Test. При наведении на него курсора мыши получаю Cannot resolve symbol «Test». В pom файле указал ту же версию testNG, что и в примере.

  • 13 октября 2014 в 08:49

    franc-tireur

    Выполните сначала, например команду mvn clean install. Скорее всего у вас библиотека еще не подтянулась в локальный репозиторий.

  • 19 марта 2015 в 20:19

    Влад

    Шаг 8. Групповое тестирование, опишите пожалуйста подробнее куда нажимать Run, срабатывает только либо первый либо второй методы
    Спасибо!

  • 13 июля 2015 в 18:03

    Lex

    не могли бы вы подробней описать запуск теста из командной строки.

  • 11 августа 2015 в 13:34

    Аноним

    «Следующий пример имеет 4 тестовых метода, каждый из них входит в группу интеграции, методы testingMethod1, testingMethod3 testingFMethod4 входят в группу Unit1. testingMethod2 входит в группу unit2.»
    Ошибка: в приведенном ниже коде в unit2 входит еще и testingMethod4, плюс опечатка в тексте testing»F»Method4..
    Хороший гайд, мне как новичку очень помог !

    • 23 августа 2015 в 17:33

      Евгений

      А можете пожалуйста обьяснить, зачем вообще нужна аннотация (Шаг 4. Аннотации TestNG), для чего ее используют?

  • 13 ноября 2015 в 14:51

    Юлия

    Первый раз столкнулась с вашими уроками на youtube, когда искала уроки по Java. Сейчас искала информацию по testNG и снова наткнулась на ваш урок. Очень нравится Ваш подход к изложению материала, очень доходчиво объясняете. Спасибо за вашу работу!

  • 19 января 2016 в 15:04

    Вадим

    Спасибо большое! Отличный материал!