кодовый адрес
https://github.com/viakiba/viakiba/tree/master/SpringTest-testNG
задний план
В последнее время к проекту необходимо подключить стороннюю систему.При тестировании интерфейса этой системы информацию запроса интерфейса сзади необходимо объединить с соответствующими результатами предыдущего интерфейса (около четырех слоев). Хотя junit также может выполнить это требование, иногда, когда вы хотите выполнить только первые два или три теста, реализация junit кажется надуманной. Поэтому вводится очередной TestNG.Сам проект разрабатывается на основе SpringBoot, и тестовый код тоже написан в этом.Тестовому коду нужно опираться на некоторую информацию о конфигурации и сервисные классы.
TestNG
TestNG — это среда тестирования, созданная на основе JUnit и NUnit, но с некоторыми новыми функциями, которые делают ее более мощной и простой в использовании. TestNG — это среда автоматизированного тестирования с открытым исходным кодом; TestNG расшифровывается как Next Generation (аббревиатура от Next Generation). TestNG похож на JUnit (в частности, на JUnit 4), но не является расширением фреймворка JUnit. Он вдохновлен JUnit. Предполагается, что он превосходит JUnit, особенно при интеграции нескольких классов для тестирования. Основателем TestNG является Седрик Беуст (Cedric Beust). TestNG устраняет большинство ограничений старых фреймворков, позволяя разработчикам писать более гибкие и мощные тесты. Поскольку он в значительной степени опирается на аннотации Java (представленные в JDK5.0) для определения тестов, он также может показать, как использовать эту новую функцию в реальной производственной среде языка Java.
Функции
注解
TestNG 使用 Java 和面向对象的功能
支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
独立的编译时测试代码和运行时配置/数据信息
灵活的运行时配置
主要介绍“测试组”。当编译测试,只要要求 TestNG 运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
支持依赖测试方法,并行测试,负载测试,局部故障
灵活的插件 API
支持多线程测试
Из https://www.yiibai.com/testng/
упражняться
TestNG использует XML в сочетании с кодом для реализации гибких требований к тестированию. (Инструменты разработки IDEA )
тестовый код
По сравнению с кодом больше внимания уделяется написанию и настройке xml-файла.
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
/**
* @author viakiba
* testNG 样例
* @description
* @date Create in 17:56 2018/7/22
*/
public class SequenceTest {
int i ;
@BeforeClass(groups = "before")
public void beforeTest0(){
i = 10;
System.out.println("beforeTest0");
}
@Test(priority = 1,groups = {"sequence"})
public void test1(){
System.out.println("test1 + sequence ");
}
@Test(priority = 3,groups = {"sequence","filter1"})
public void test2(){
System.out.println("test3 + sequence + filter1 ");
}
@Test(priority = 2,groups = {"sequence","filter2"})
public void test3(){
System.out.println("test2+ sequence + filter2");
}
@Test(priority = 4,groups = {"sequence","filter1","filter3"})
public void test4(){
System.out.println("test4 + sequence + filter1");
}
@Parameters({"testParam"})
@Test(priority = 5,groups = {"sequence","param"})
public void test5(int testParam){
System.out.println(testParam);
System.out.println("test5+sequence+param");
}
@Test(priority = 5,groups = {"before"})
public void test5( ){
System.out.println(i);
System.out.println("test5+sequence+param");
}
@AfterGroups(groups = {"before"})
public void afterTest0(){
i = -1;
System.out.println("afterTest0" + i);
}
}
priority
Содержание выглядит следующим образом
Эта тестовая XML-конфигурация сначала запустит тестовый метод с меньшим номером в соответствии с идентификатором приоритета в @Test, а затем тестовый метод с большим номером. (Не обращайте внимания на атрибут группы в это время)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="1">
<test verbose="1" preserve-order="true" name="SequenceTest">
<!--
在不指定group时,会执行所有测试方法。
verbose : 控制台输出的详细内容等级,0-10级(0无,10最详细)
preserve-order :是否按照排序执行 默认为true
name : 必选项,<suite>的名字,将出现在reports里
更多详细参数 请参考:
https://blog.csdn.net/u011138533/article/details/52174446
-->
<classes>
<!-- 可以多个 -->
<class name="org.vk.test.testng.SequenceTest" />
</classes>
</test>
</suite>
Метод триггера
Групповой групповой фильтр
Эта тестовая XML-конфигурация сначала запустит тестовый метод с меньшим номером в соответствии с идентификатором приоритета в @Test, а затем тестовый метод с большим номером. При этом групповой атрибут в @Test тестируемого метода должен существовать в filter1
Пример 1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="3">
<test verbose="2" preserve-order="true" name="SequenceTest">
<!--
group 筛选执行样例
这里的run标签可以只存在include/exclude
对于测试类而言,如果只存在exclude则除了exclude的方法其他类中存在的都会执行。
存在include则只执行include包含的。
-->
<groups>
<define name="filter_group">
<include name="filter1"/>
<include name="filter2"/>
</define>
<define name="filter_group1">
<include name="filter1"/>
</define>
<define name="filter_group2">
<include name="filter2"/>
</define>
<run>
<include name="filter_group"/>
<exclude name="filter_group2"/>
<!-- filter1,filter2 - filter2 = filter1 只运行 filter1 -->
</run>
</groups>
<classes>
<class name="org.vk.test.testng.SequenceTest" >
</class>
</classes>
</test>
</suite>
Пример 2
Включение может также включать в себя исключение и наоборот.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="3">
<parameter name="testParam" value="11"></parameter>
<test verbose="2" preserve-order="true" name="SequenceTest">
<groups>
<define name="filter_group">
<include name="filter1"/>
<include name="filter2"/>
</define>
<define name="filter_group1">
<include name="filter1"/>
</define>
<define name="filter_group2">
<include name="filter2"/>
</define>
<define name="filter_group3">
<include name="filter3"/>
</define>
<run>
<include name="filter_group">
<exclude name="filter3"/>
<!--<exclude name="filter_group3"/>-->
<!-- 上下等效 -->
</include>
<exclude name="filter_group2"/>
</run>
</groups>
<classes>
<class name="org.vk.test.testng.SequenceTest" >
</class>
</classes>
</test>
</suite>
Передача параметров параметров
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="3">
<test verbose="2" preserve-order="true" name="SequenceTest">
<parameter name="testParam" value="12" />
<!--这里参数声明对于整个测试suite都有效-->
<groups>
<define name="param_group">
<include name="param"/>
</define>
<run>
<include name="param_group"></include>
</run>
</groups>
<classes>
<class name="org.vk.test.testng.SequenceTest" >
<!--此处声明的参数的值优先级更高 仅对这个类有效-->
<!--<parameter name="testParam" value="11"/>-->
</class>
</classes>
</test>
</suite>
методы до/после
Аннотации TestNG с соответствующими заголовками до/после могут использоваться для подготовки к выполнению и после выполнения до и после выполнения метода @Test.Здесь в качестве примера используется BeforeClass/AfterGroups.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="3">
<test verbose="2" preserve-order="true" name="SequenceTest">
<!--这里参数声明对于整个测试suite都有效-->
<groups>
<define name="before">
<include name="before"/>
</define>
<run>
<include name="before"></include>
</run>
</groups>
<classes>
<class name="org.vk.test.testng.SequenceTest" >
</class>
</classes>
</test>
</suite>
SpringBoot представляет TestNG
Можно использовать практически все конфигурации TestNG. Обратите внимание, что он наследуется от AbstractTestNGSpringContextTests и использует аннотацию SpringBootTest.
подготовка кода
Пример 1
Укажите класс, который необходимо внедрить
код показывает, как показано ниже
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
import org.vk.demo.EatCompentConfig;
import org.vk.demo.PeopleEatService;
import org.vk.demo.PeopleEatServiceImpl;
/**
* @author viakiba
* classes需要注入的类
* 如果依赖比较简单较少,可以指定classes的具体类
* @description
* @date Create in 20:38 2018/7/22
*/
@SpringBootTest(classes = { PeopleEatServiceImpl.class , EatCompentConfig.class })
//@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class EatServiceTest extends AbstractTestNGSpringContextTests {
@Autowired
private PeopleEatService peopleEatServiceImpl;
@Test(groups = "eatOne")
public void test1(){
int i = peopleEatServiceImpl.eatService();
System.out.println(i * 1);
}
@Test(groups = "eatTen")
public void test2(){
int i = peopleEatServiceImpl.eatService();
System.out.println(i*10);
}
}
XML-конфигурация
Это выполнит только метод test2()
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="1">
<test verbose="1" preserve-order="true" name="SequenceTest">
<groups>
<define name="eatOne" >
<include name="eatOne"/>
</define>
<define name="eatTen">
<include name="eatTen"/>
</define>
<define name="eatOneTen">
<include name="eatOne"/>
<include name="eatTen"/>
</define>
<run>
<include name="eatTen"/>
<!--<include name="eatOneTen"/>-->
</run>
</groups>
<classes>
<!-- 可以多个 -->
<class name="org.vk.test.springtest_testng.EatServiceTest" />
</classes>
</test>
</suite>
Если зависимости сложные и для внедрения зависимостей указано слишком много классов, можно указать Application.class .
класс указывает приложение
Здесь есть два примера: один — указать только приложение для завершения инициализации бина, а второй — передать параметры (реализация TestNG)
package org.vk.test.springtest_testng;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.vk.Application;
import org.vk.demo.EatCompentConfig;
import org.vk.demo.PeopleEatService;
import org.vk.demo.PeopleEatServiceImpl;
/**
* @author viakiba
* classes需要注入的类
* @description
* @date Create in 20:38 2018/7/22
*/
@SpringBootTest(classes = { Application.class })
//@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class EatAppTest extends AbstractTestNGSpringContextTests {
@Autowired
private PeopleEatService peopleEatServiceImpl;
@Test(groups = "eatOne")
public void test1(){
int i = peopleEatServiceImpl.eatService();
System.out.println(i * 1);
}
@Test(groups = "eatTen")
public void test2(){
int i = peopleEatServiceImpl.eatService();
System.out.println(i*10);
}
@Parameters({"a","b"})
@Test(groups = "eatTenAB")
public void test3(int a , int b){
int i = peopleEatServiceImpl.eatService();
System.out.println(i*10);
System.out.println(a+b);
}
}
XML-конфигурация
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="1">
<test verbose="1" preserve-order="true" name="SequenceTest">
<groups>
<define name="eatOne" >
<include name="eatOne"/>
</define>
<define name="eatTen">
<include name="eatTen"/>
</define>
<define name="eatOneTen">
<include name="eatOne"/>
<include name="eatTen"/>
</define>
<run>
<include name="eatTen"/>
<!--<include name="eatOneTen"/>-->
</run>
</groups>
<classes>
<!-- 可以多个 -->
<class name="org.vk.test.springtest_testng.EatAppTest" />
</classes>
</test>
</suite>
Пример входящих параметров
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="1">
<test verbose="1" preserve-order="true" name="SequenceTest">
<groups>
<define name="eatAb" >
<include name="eatTenAB"/>
</define>
<run>
<include name="eatAb"/>
<!--<include name="eatOneTen"/>-->
</run>
</groups>
<classes>
<!-- 可以多个 -->
<class name="org.vk.test.springtest_testng.EatAppTest" >
<parameter name="b" value="5"/>
<parameter name="a" value="10"/>
</class>
</classes>
</test>
</suite>
Суммировать
Вышеупомянутый проект SpringBoot может использовать TestNG для достижения гибких требований к тестированию, а с помощью функций Spring DI можно написать более совершенный тестовый код и выполнить внедрение зависимостей.
参考
https://testng.org/doc/documentation-main.html
https://blog.csdn.net/u011138533/article/details/52174446
https://www.cnblogs.com/iceb/p/7119987.html?utm_source=itdadao&utm_medium=referral
https://i.itest.ren/2016/05/06/Java%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6-TestNG/
https://blog.csdn.net/u011138533/article/details/52174446
https://blog.csdn.net/u011138533/article/details/52174446
https://blog.csdn.net/taiyangdao/article/details/77096823
https://blog.csdn.net/douya43/article/details/73555843
https://segmentfault.com/a/1190000010854538