TestNg的注解解释,部分使用说明.

简介

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:
如果在父类中有这些注解,则子类也可以继承使用.并且按照规定的顺序执行.
下面一图解释.
TestNg的注解解释,部分使用说明._第1张图片
流程图实例
TestNg的注解解释,部分使用说明._第2张图片

示例

@BeforeSuite
    public void beforeSuite() {
        logger.info("----开始测试,打开浏览器----");
        driver = WebDriverUtils.getChromeDriver();
        driver.manage().window().maximize();
        loginEman();
    }

    @AfterSuite
    public void afterSuite() {
        logger.info("----测试结束,关闭浏览器----");
        driver.quit();
    }

@Test详解,将类或方法标记为测试的一部分。

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();
    }

dataProvider的详解

//示例中对数据已经做了封装
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("我是测试用例的业务逻辑");
    }


}

运行后的结果
TestNg的注解解释,部分使用说明._第3张图片

踩坑记录

最近遇到一个问题,发现Testng(版本为6.14.3)与java的构造函数不能同时使用.

当构造函数仅有一个参数时可以正常使用.
当构造函数有一个以上参数时则不可以正常使用.会出现下图的错误:
No tests were found
TestNg的注解解释,部分使用说明._第4张图片

TestNg的注解解释,部分使用说明._第5张图片
当你升级到高版本的Testng(7.0+)则会提示实例化错误.
根本原因是因为testng的运行机制与多个参数的构造函数有冲突,不能使用.暂时没有一个良好的解决方案.

在BeforeSuite阶段给线程变量设置无效

在BeforeSuite阶段给线程变量设置无效,例如BeforeSuite设值后在BeforeTest的等其他阶段直接成null 会报空指针

你可能感兴趣的:(Testng,java,软件测试)