TestNG介绍
-
TestNG是一个与测试业务逻辑实现无关的测试框架,给测试提供一整套测试管理的解决方案;使用TestNG可以非常的管理被测系统所有测试脚本 -
给测试带来的便利: (1)丰富的断言方法,使用断言可以清晰的观察到测试的执行结果 (2)提供了方便的注解方式来控制测试流程生命周期 (3)通过参数化配置测试执行环境 (4)提供了数据驱动测试解决方案 (5)默认会提供HTML格式,并支持自定义扩展报告插件 -
基于注解,相比JUnit提供了更多的扩展功能,让程序员通过注解、分组、并行和参数化 等多种方式组织和执行自动化测试脚本。 官网链接
TestNG的常用注解
在此举一个简单的栗子:体会@test, @BeforeMethod, @AfterMethod, @BeforeClass,@AfterClass,
package testngdemo1;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class demo1 {
public demo1() {
System.out.println("...demo1的构造方法...");
}
@Test
public void test1() {
System.out.println("hello test1!!");
}
@Test
public void test2() {
System.out.println("hello test2!!");
}
@BeforeMethod
public void before() {
System.out.println("BeforeMethod");
}
@AfterMethod
public void after() {
System.out.println("AfterMethod");
}
@BeforeClass
public void bclass() {
System.out.println("@@@@BeforeClass");
}
@AfterClass
public void aclass() {
System.out.println("@@@@AfterClass");
}
}
输出结果:
注意
- TestNG执行测试方法之前,会重新实例化测试类,即执行构造方法
- 如果继承父类,会先执行父类的构造方法
- 会先执行父类的BeforeClass
- 一个类里面可能存在多个测试方法(即被@Test注解的方法),默认测试方法的执行顺序是按照
方法名的字典序升序排序执行的 可用priority 指定执行顺序(默认值为0),数值越小,越靠前执行。
@Test(priority = 0)
public void testMethod3() { }
@Test(priority = 1)
public void testMethod2() { }
@Test(priority = 2)
public void testMethod1() { }
这样指定以后,将按照testMethod3、testMethod2、testMethod1顺序执行
- 使用
enable = false 来跳过某测试方法 @Test(enable = false) - 依赖测试:某个测试用例被执行后再执行其他测试用例。可在不同测试方法间
共享数据和程序状态 举例说明: 下述代码,如果并未用enable=false,应该先运行test1,test2,test3, 加上后,结果如下。
package testngdemo1;
import org.testng.annotations.Test;
public class demo1 {
@Test
public void test3() {
System.out.println("333333");
}
@Test(dependsOnMethods="test3")
public void test2() {
System.out.println("2222");
}
@Test(dependsOnMethods="test2")
public void test1() {
System.out.println("111");
}
}
运行结果:
7.TestNG提供了日志的功能,在测试过程中可以通过自定义方式记录测试脚本中的运行信息, 例如Reporter.log("已经打开浏览器了")
testng.xml
需要在当前包下新建一个.xml文件。 通过testng.xml 的方式调用 TestNG:
- 举例说明testng.xml用法
第一个代码块为xml文件中的内容
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="2" >
<test name="test1" >
<classes>
<class name="testngdemo1.demo1" />
<class name="testngdemo1.demo2" />
</classes>
</test>
</suite>
package testngdemo1;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class demo1 {
public demo1() {
System.out.println("...demo1的构造方法...");
}
@Test
public void test1() {
System.out.println("hello test1!!");
}
}
package testngdemo1;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class demo2 {
public demo2() {
System.out.println("...demo2的构造方法...");
}
@BeforeSuite
public void bsuite() {
System.out.println("@BeforeSuite");
}
@BeforeTest
public void btest() {
System.out.println("BeforeTest");
}
@AfterTest
public void atrest() {
System.out.println("AfterTest");
}
@Test
public void test2() {
System.out.println("hello test2!!");
}
}
输出结果: @BeforeSuite 在当前测试集合任一测试用例运行前运行 , 例如提前打开浏览器、设置结果保存位置等等。
- 指定包名而不是类名
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="Regression1" >
<packages>
<package name="testngdemo1" />
</packages>
</test>
</suite>
会把包里所有的测试用例运行。
testng.xml执行顺序: (1)<test name="xxx" preserver-order="true"> 是可以保证节点下面的方法是按顺序执行的。 (2)parallel的取值 在如下位置进行对该值的设置:
- 测试用例的分组
@Test(groups="分组名")
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="2" >
<test name="test1" >
<groups>
<run>
<include name="color"></include>
<include name="person"></include>
</run>
</groups>
<classes>
<class name="testngdemo1.Corlor"></class>
</classes>
</test>
</suite>
package testngdemo1;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class Corlor {
@BeforeGroups(groups = {"color"})
public void beforeGroups() {
System.out.println("beforeGroups");
}
@Test(groups = {"color"})
public void testRed() {
System.out.println("color---Red");
}
@Test(groups = {"color"})
public void testBlue() {
System.out.println("color---Blue");
}
@AfterGroups(groups = {"color"})
public void afterGroups() {
System.out.println("afterGroups");
}
@BeforeGroups(groups = {"person"})
public void beforeGroups2() {
System.out.println("beforeGroups");
}
@Test(groups = {"person"})
public void testStudent() {
System.out.println("person - student");
}
@Test(groups = {"person"})
public void testTeacher() {
System.out.println("person - teacher");
}
@AfterGroups(groups = {"person"})
public void afterGroups2() {
System.out.println("afterGroups2");
}
}
运行结果:
- 参数化
@Parameters 必须从.xml启动运行!
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="2" >
<parameter name="driverPath" value= "D:\\test\\Selenium\\geckodriver30.exe"></parameter>
<parameter name="ffPath" value="D:\\firefox\\firefox.exe"></parameter>
<test name="test1" parallel="classes">
<classes>
<class name="dem3.Demo" />
<class name="dem3.Demo2" />
</classes>
</test>
</suite>
package dem3;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class Demo {
@Parameters({"driverPath", "ffPath"})
@Test
public void test1(String path1, String path2) {
System.out.println(path1);
System.out.println(path2);
System.out.println("Demo1" + Thread.currentThread().getId());
}
}
会把xml中设置的两个参数的值打印出来。方便下次使用。
数据提供者
- 举例
package testngdemo1;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderDemo {
@DataProvider(name = "user")
public Object[][] createData(){
return new Object[][] {
{"admin", "123", 12},
{"tom", "111", 45}
};
}
@Test(dataProvider = "user")
public void testData(String a, String b, int c) {
System.out.println(a + ' ' + b + ' ' + c);;
}
}
输出结果: 2. 当提供数据不在该class中时:
package testngdemo1;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderDemo {
@Test(dataProvider = "user2", dataProviderClass=Provider.class)
public void testData(String a, String b, int c) {
System.out.println(a + ' ' + b + ' ' + c);;
}
}
package testngdemo1;
import org.testng.annotations.DataProvider;
public class Provider {
@DataProvider(name = "user1")
public Object[][] createData(){
return new Object[][] {
{"admin", "123", 12},
{"tom", "111", 45}
};
}
@DataProvider(name = "user2")
public Object[][] createData2(){
return new Object[][] {
{"adminnnnnn", "12333333", 1222222},
{"tommmmmmmm", "11111111", 45555555}
};
}
}
断言
持续更新补充~~!!
编写测试用例的步骤
|