1.5.1 TestNg是什么?
TestNg按照官方的定义:
TestNg是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。
TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。就算不熟悉JUnit也不影响学习TestNg框架。
那么“为什么我们需要TestNg”?
- 注释可以帮助我们来组织使测试更容易。
- 灵活的测试配置。
- 测试例可以更容易地进行分组
- 可以使用TestNg实现测试并行
- 支持数据驱动测试
- 内置的报告
总结一下,我们需要通过TestNg来组织我们来运行的测试用例,配置测试调度策略,生产测试报告,某些情况下可能还需要实现数据驱动或者并行调度测试用例等等。所以通过学习TestNg常用的功能,可以使测试更灵活、简单。
其实我们在前面的代码示例中一直在使用testng注解执行测试。
public class testTestng {
@Test //testNg提供的注解
public void testTestNg() {
//指定Driver 的存放目录
System.setProperty("webdriver.chrome.driver", "c:/driver/chromedriver.exe");
//指定需要启动的浏览器类型
System.setProperty("selenide.browser", "Chrome");
//打开测试地址
Selenide.open("https://www.baidu.com");
//设置等待时间
System.out.println("----------------------");
Selenide.sleep(5000);
}
}
1.5.2 TestNg注解
TestNG选择使用注解来注释测试类。
以下是TestNG支持的注释列表:
注解 |
描述 |
在该套件的所有测试都运行在注释的方法之前,仅运行一次。 |
|
在该套件的所有测试都运行在注释方法之后,仅运行一次。 |
|
在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。 |
|
在调用当前类的第一个测试方法之后运行,注释方法仅运行一次 |
|
注释的方法将在属于 |
|
注释的方法将在属于 |
|
配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。 |
|
此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。 |
|
注释方法将在每个测试方法之前运行。 |
|
注释方法将在每个测试方法之后运行。 |
|
标记一种方法来提供测试方法的数据。 注释方法必须返回一个 |
|
将一个方法标记为工厂,返回 |
|
定义测试类上的侦听器。 |
|
描述如何将参数传递给@Test方法。 |
|
将类或方法标记为测试的一部分。 |
1.5.3 注解实例
TestNg运行可以区分为单测试类运行和测试套件类运行
单测试类运行实例:
public class testTestng {
@Test(priority = 10)
public void testStep1() {
System.out.println("测试方法--1--优先级低后执行");
}
@Test(priority = 2)
public void testStep2() {
System.out.println("测试方法--2--优先级高先执行");
}
@BeforeMethod
public void testBeforeMethod() {
System.out.println("测试方法执行前执行");
}
@AfterMethod
public void testAfterMethod() {
System.out.println("测试方法执行后执行");
}
@BeforeTest
public void testBeforeTest() {
System.out.println("在测试类的所有test注解方法执行前执行");
//如果一个类中有多个test注解方法,只执行一次
}
@AfterTest
public void testAfterTest() {
System.out.println("在测试类的所有test注解方法执行后执行");
//如果一个类中有多个test注解方法,只执行一次
}
@BeforeClass
public void testBeforeClass() {
System.out.println("在调用当前类的第一个测试方法之前运行,注释方法仅运行一次");
//在同一个类的中作用与beforetest相同
}
@AfterClass
public void testAfterClass() {
System.out.println("在调用当前类的第一个测试方法之后运行,注释方法仅运行一次");
//在同一个类的中作用与aftertest相同
}
@BeforeSuite
public void testBeforSuite() {
System.out.println("在集合内的所有测试类执行前执行");
//在单测试类中作用等同于beforetest
}
@AfterSuite
public void testAfterSuite() {
System.out.println("在集合内的所有测试类执行后执行");
//在单测试类中作用等同于aftertest
}
}
测试结果如下:
[TestNG] Running:
C:Users iuhAppDataLocalTemp estng-eclipse-44348565 estng-customsuite.xml
在集合内的所有测试类执行前执行
在测试类的所有test注解方法执行前执行
在调用当前类的第一个测试方法之前运行,注释方法仅运行一次
测试方法执行前执行
测试方法--2--优先级高先执行
测试方法执行后执行
测试方法执行前执行
测试方法--1--优先级低后执行
测试方法执行后执行
在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
在测试类的所有test注解方法执行后执行
PASSED: testStep2
PASSED: testStep1
===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================
在集合内的所有测试类执行后执行
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
在工程的test-output目录下可以看到index.html的结果报告,如下:
测试套件运行
通常在一个自动化测试工程中,我们会编写多个测试用例并且需要批量运行,那么就需要通过TestNg.xml来实现多个测试用例组合的测试套件。
- 创建多个测试用例类
package l3;
import org.testng.annotations.Test;
public class testng1 {
@Test
public void testStep() {
System.out.println("测试用例1");
}
}
package l3;
import org.testng.annotations.Test;
public class testng2 {
@Test
public void testStep() {
System.out.println("测试用例2");
}
}
- 创建testng执行的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<suite name="TestAll">
<test name="testAllcase">
<classes>
<class name="l3.testng1" />
<class name="l3.testng2" />
</classes>
</test>
</suite>
- 右键xml文件按照testng suite执行
[TestNG] Running:
C:workspaceSelenideStudysrcmainjaval3 estng-Demo.xml
测试用例1
测试用例2
===============================================
TestAll
Total tests run: 2, Failures: 0, Skips: 0
1.5.4 数据驱动
TestNG中的另一个有趣的功能是参数化测试。 在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。
TestNG可以通过两种不同的方式将参数直接传递给测试方法:
- 使用testng.xml
- 使用注解DataProvider
使用注解DataProvider是最常用的方式,下面写个简单的例子(通过数据参数驱动的方式依次传值到test方法中):
package l3;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class testdataprovider {
@Test(dataProvider = "providerNumber")
public void test(int number1, int number2) {
System.out.println("numeber1:" + number1 + "+ number2:" + number2 + "=-->" + number1 + number2);
}
@DataProvider(name = "providerNumber")
public Object[][] providerData() {
return new Object[][] { { 10, 20 }, { 100, 100 }, { 11, 11 } };
}
}
测试结果:
[TestNG] Running:
C:Users iuhAppDataLocalTemp estng-eclipse--190367475 estng-customsuite.xml
numeber1:10+ number2:20=-->1020
numeber1:100+ number2:100=-->100100
numeber1:11+ number2:11=-->1111
PASSED: test(10, 20)
PASSED: test(100, 100)
PASSED: test(11, 11)
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
TestNg的dataProvider注解还有更多的使用方法,如果感兴趣的可以自己去菜鸟教程学习
1.5.5 测试结果
默认testng会在我们所在项目中生成test-output目录来保存测试结果:
一般我们需要查看emailable-report.html和index.html
emailable-report.html
index.html