分享

Java TestNG入门 -2注解annotation使用

 孟船长 2022-06-14 发布于内蒙古

配置好了 Maven 接下来就可以新建项目了。

1 新建Maven项目

新建成功以后会有一个pom.xml文件

2 添加依赖

我们要写TestNG框架,所以要加入TestNG依赖。

所有依赖都可以在TestNG repository官网找到:https:///

搜索testng

第一个就是我们要找的,点击TestNG,进入详情页:

在这里可以选择要使用的TestNG版本 我们这里使用7.5版本,点击7.5

复制这段代码,将其粘贴到pom.xml文件中

外层有一个标签,以后将依赖直接添加到里面即可。

然后点一下右上角的同步按钮,7.5版本号不再显示红色,就代表下载下来了


看一下项目结构

其中java一般存放封装好的通用方法;resources用于存放数据驱动时的文件,当然你也可以自定义数据文件目录;test则用于写测试用例。

3 写代码

在test->java下新建package:com.demo.test,然后新建一个类叫TestNGDemo1

注意,TestNG是不需要main方法的,只要添加了注解即可以直接运行。

可以在TestNG官网查看关于TestNG的文档

https:///doc/documentation-main.html

注解

@Test

我们在类方法中编写用例代码

选择第一个,会自动导入包

package com.demo.testng;

import org.testng.annotations.Test;

public class TestNGDemo1 {

@Test
public void test01(){
System.out.println("This is test01");
}

@Test
public void test03(){
System.out.println("This is test03");
}

@Test
public void test02(){
System.out.println("This is test02");
}
}

这里我将test02test03位置调整了一下,目的是查看一下TestNG的执行顺序,可以看到执行结果:

仍然是按照01->02->03的顺序进行执行的。

@BeforeMethod与@AfterMethod

我们有时候会要求每个方法前和每个方法后需要执行一些操作,我们就可以使用@BeforeMethod@AfterMethod方法

可以看到,@Before***还有很多类似unittest和Pytest的执行方式

package com.demo.testng;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class TestNGDemo1 {

@BeforeMethod
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterMethod
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test
public void test01(){
System.out.println("This is test01");
}

@Test
public void test03(){
System.out.println("This is test03");
}

@Test
public void test02(){
System.out.println("This is test02");
}
}

执行代码:

可以看到每个方法执行前后都执行了一次@BeforeMehtod和@AfterMethod。

@BeforeClass与@AfterClass

当我们进行Selenium自动化测试时,经常会有打开浏览器关闭浏览器的操作,我们不会每个用例方法都执行一次操作,而是在用例开始前和结束后整体执行一次:

package com.demo.testng;

import org.testng.annotations.*;

public class TestNGDemo1 {

@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test
public void test01(){
System.out.println("This is test01");
}

@Test
public void test03(){
System.out.println("This is test03");
}

@Test
public void test02(){
System.out.println("This is test02");
}
}

执行代码:

@BeforeClass与@AfterClass是在每个类的执行开始和结束执行一次。

方法名解释
@BeforeSuite被注释的方法在所有测试运行前运行
@AfterSuite被注释的方法在所有测试运行后运行
@BeforeTest被注释的方法在测试运行前运行
@AfterTest被注释的方法在测试运行后运行
@BeforeClass被注释的方法在当前类的第一个测试方法调用前运行
@AfterClass被注释的方法在当前类的所有测试方法调用后运行
@BeforeMethod被注释的方法在每一个测试方法调用前运行
@AfterMethod被注释的方法在每一个测试方法调用后运行

整个流程的控制如图:

@Test(enable=false)跳过用例

我们跳过test03用例,只需要在@Test注解中添加enable=false

package com.demo.testng;

import org.testng.annotations.*;

public class TestNGDemo1 {

@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test
public void test01(){
System.out.println("This is test01");
}

@Test(enabled = false)
public void test03(){
System.out.println("This is test03");
}

@Test
public void test02(){
System.out.println("This is test02");
}
}

执行用例:

分组执行

package com.demo.testng;

import org.testng.annotations.*;

public class TestNGDemo1 {

@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test(groups = {"groups01"})
public void test01(){
System.out.println("This is test01");
}

@Test(groups = {"groups02"})
public void test03(){
System.out.println("This is test03");
}

@Test(groups = {"groups01", "groups02"})
public void test02(){
System.out.println("This is test02");
}
}

但是如果以上方法直接执行,分组标签就不会生效,此时我们需要新建一个testng.xml文件。这个文件不需要我们手动去写,可以直接去下载一个插件:File->Setting->Plugins,搜索TestNG下载

下载好以后在项目中右键就会出现生成testng.xml文件的选项,这个一般在最下面

添加完成以后需要重新加载一下才会显示出来

进入文件后代码都在一行,只需要在选项Code->Reformat Code格式化一下代码:

然后添加分组执行的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http:///testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="C:/Users/UC504933/Desktop/JavaCode/TestNGDemo">
<groups>
<run>
<include name="groups01" />
</run>
</groups>
<classes>
<class name="com.demo.testng.TestNGDemo1"></class>
</classes>
</test>
</suite>

testng.xml文件中执行代码

可以看到执行结果:

如果要不执行某个分组,则把

<include name="groups01" />

改为

<exclude name="groups01" />

即可。

依赖控制

@Test注解中添加dependsOnMethods = {"test01"}

package com.demo.testng;

import org.testng.Assert;
import org.testng.annotations.*;

public class TestNGDemo2 {

@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test
public void test01(){
System.out.println("This is test01");
Assert.assertEquals(1,3);
}

@Test(dependsOnMethods = {"test01"})
public void test02(){
System.out.println("This is test02");
}

@Test
public void test03(){
System.out.println("This is test03");
}
}

这里我把test01添加了报错断言,执行时就可以看到用例跳过了test02。而且这里需要注意,当添加了dependsOnMehtods以后执行用例的顺序变了。【如果要验证,可以删掉test01中的Assert语句】

可以看到由于test01报错,test02被跳过了。

testNG多线程

测试方法通过在@Test注解中配置threadPoolSize属性进入多线程模式。参数解释:

属性描述
invocationCount执行的次数
threadPoolSize线程池内线程的个数
timeOut超时时间-毫秒

现在我们希望test02执行五次,而且用多线程以加快执行效率。为了看清,我给线程号打印出来。

package com.demo.testng;

import org.testng.Assert;
import org.testng.annotations.*;

public class TestNGDemo2 {

@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}

@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}

@Test
public void test01(){
System.out.println("This is test01");
Assert.assertEquals(1,1);
}

@Test(threadPoolSize = 5, invocationCount = 5, timeOut = 5000)
public void test02(){
long id = Thread.currentThread().getId();
System.out.println("This is test02 --->"+"Thread id: "+id);
}

@Test
public void test03(){
System.out.println("This is test03");
}
}

执行代码:

数据驱动dataProvider

package com.demo.testng;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestNGDemo3 {

@DataProvider(name = "data")
public Object[][] dataList(){
Object[][] object;
return object = new Object[][]{
{"Package One", 1},
{"Package Two", 2},
{"Package Three", 3}
};
}

@Test(dataProvider = "data")
public void identyData(String name, int num){
System.out.println("包名:"+ name + " 编号:"+num);
}
}

执行代码:

可以看到数据以三个用例的方式执行了三次。

以上就是TestNG基础方法了。

如果您觉得对您有帮助,请帮忙点一下公众号底部的广告,点一下就可以,谢谢~

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多