TestNg是一个Java测试框架,主要用于管理测试流程,测试执行.可以实现并发测试,参数化测试,测试顺序管理等功能.
示例
@Test()//@Test注解 将类或方法标记为一个测试用例。
//业务逻辑
private void test1(description = "测试描述"){
maxWindow(driver);
String url = "http://192.168.252.208:8099/nem/hc/1000";
driver.get(url);
driver.findElement(By.xpath("//*[@id=\"signin-N\"]/div[1]/input")).sendKeys("ttt001");
driver.findElement(By.xpath("//*[@id=\"signin-N\"]/div[2]/input")).sendKeys("admin321");
driver.findElement(By.xpath("//*[@id=\"signin-N\"]/div[4]/a/button")).click();
//点击基础信息
driver.findElement(By.xpath("//*[text()=\"基础信息\"and@class=\"text\"]")).click();
findEle(driver, "//*[@id=\"mu_412\"]/span");
return driver;
}
@BeforeSuite:
@AfterSuite:
@BeforeTest:
@AfterTest:
@BeforeGroups:
@AfterGroups:
@BeforeClass:
@AfterClass:
@BeforeMethod:
@AfterMethod:
如果在父类中有这些注解,则子类也可以继承使用.并且按照规定的顺序执行.
下面一图解释.
流程图实例
示例
@BeforeSuite
public void beforeSuite() {
logger.info("----开始测试,打开浏览器----");
driver = WebDriverUtils.getChromeDriver();
driver.manage().window().maximize();
loginEman();
}
@AfterSuite
public void afterSuite() {
logger.info("----测试结束,关闭浏览器----");
driver.quit();
}
priority 控制用例的执行顺序
dataProvider 测试方法的数据提供者。
dataProviderClass 测试方法的数据提供类
dependsOnGroups 此方法所依赖的组名被依赖的组成功执行此方法才会执行。
dependsOnMethods 此方法所依赖的方法名.被依赖的方法成功执行此方法才会执行。
description 方法/用例的描述,在allure中会作为用例的标题显示。
enabled 是否启用此类/方法上的方法。
示例
@Test(description = "部门增加", dataProvider = "dp",dataProviderClass = CaseDataProvider.class)
private void department_add_success_test_case(DepartmentSuccessData dpd) {
WebDriver driver = toBasicInformation(getDriver());
findEle(driver, "//*[contains(text(),'添加')]");
//部门名称
driver.findElement(By.name("dname")).sendKeys("测试数据");
//部门级别
driver.findElement(By.name("dnums")).sendKeys("1");
//下拉框:是否在用
Select select = new Select(driver.findElement(By.name("isuses")));
select.selectByIndex(0);
//部门描述
driver.findElement(By.name("remark")).sendKeys("测试数据描述");
Thread.sleep(1000);
//保存
findEle(driver, "//*[contains(text(),'保存')]");
Thread.sleep(3000);
//弹窗点击确定
driver.findElement(By.xpath("/html/body/div[14]/div[2]/button[2]")).click();
Thread.sleep(1000);
driver.quit();
}
//示例中对数据已经做了封装
private static final Object[][] dataList = CaseDataProvider.getCaseDataByDataClassFileName(MaterialTypeMaintenanceSuccessData.class, 1);
@BeforeMethod
private void beforeMethod() {
//基础信息
click("基础信息");
//点击部门
click("物料类型维护");
pause(3000);
}
//首先你需要提供数据,DataProvider()需要的是一个二维数组类型的数据,在上面的代码中我已经提前准备了,在这里直接调用即可
@DataProvider()
private static Object[][] dp() {
return dataList;
}
//这里的dependsOnMethods代表若要执行当前方法必须先正确执行对应的依赖的方法
//priority是用来控制用例的顺序的,从0开始.默认不写的话就是0.description是对此方法的描述.allure报告中可以显示这个描述.
@Test(priority = 2, description = "物料类型添加物料名称", dataProvider = "dp", dependsOnMethods = {"case_01_materialtypemaintenance_add_success"})
private void case_02_materialtypemaintenance_add_success(MaterialTypeMaintenanceSuccessData mats) {
XXXXXXXX
}
}
下面是验证Testng执行过程的代码
public class Test7 {
@BeforeSuite
protected void beforeSuite() {
System.out.println("beforeSuite");
}
@BeforeTest
protected void beforeTest() {
System.out.println("beforeTest");
}
@BeforeClass
protected void beforeClass() {
System.out.println("beforeClass");
}
@BeforeMethod
protected void beforeMethod() {
System.out.println("beforeMethod");
}
@AfterSuite
protected void afterSuite() {
System.out.println("afterSuite");
}
@AfterMethod
protected void afterMethod() {
System.out.println("afterMethod");
}
@AfterTest
protected void afterTest() {
System.out.println("afterTest");
}
@AfterClass
protected void afterClass() {
System.out.println("afterClass");
}
@Test(priority = 4, description = "TestCase1")
protected void test_case_04() {
System.out.println("我是测试用例的业务逻辑");
}
}
当构造函数仅有一个参数时可以正常使用.
当构造函数有一个以上参数时则不可以正常使用.会出现下图的错误:
No tests were found
当你升级到高版本的Testng(7.0+)则会提示实例化错误.
根本原因是因为testng的运行机制与多个参数的构造函数有冲突,不能使用.暂时没有一个良好的解决方案.
在BeforeSuite阶段给线程变量设置无效,例如BeforeSuite设值后在BeforeTest的等其他阶段直接成null 会报空指针