Тестирование с помощью TestNG в Java – Devcolibri – Android для начинающих

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

ПОХОЖИЕ ПУБЛИКАЦИИ

    None Found

113907
04/05/2013

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

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

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)