20210420TestNG高级应用监听器 1
程序员文章站
2022-05-17 07:58:06
...
TestNG中监听器的使用
文章目录
复习哦!
Java代码执行testNG配置文件
public class JavaRunTestNG {
public static void main(String[] args) {
//将TestNG实例化
TestNG testNG=new TestNG();
List<String> s1=new ArrayList<String>();
//TestNG自动记录上次执行结果
//生成html报告
//把失败的用例放在了testng-failed.xml
//可以手动执行testng-failed.xml实现失败用例重跑;
//向链表中添加 String类型链表中的一句
s1.add(".\\test-output\\testng-failed.xml");
// ./就是当前目录
//去执行失败用例。
testNG.setTestSuites(s1);//对suit进行了设置
/*
setTestSuites 源码
public void setTestSuites(List<String> suites) {
m_stringSuites = suites;
}
TestNG中的私有成员变量
private List<String> m_stringSuites = Lists.newArrayList();
*/
testNG.run();
}
}
使用ITestContext共享数据
public class Demo2 {
//个人认为与ServletContent类似!
@Test
public void test1(ITestContext content) {
content.setAttribute("name", "tom");
}
@Test
public void test2(ITestContext content) {
System.out.println(content.getAttribute("name"));
}
}
PS: freemarker 模板引擎,把它和TestNG结合起来 了解即可
ITestResults
结合@AfterMethod使用,可以监听@Test方法的执行状态信息。
ITestResult.getName() 是测试用例名,方法名
ITestResult.getStatus() 测试执行结果: ITestResult.SUCCESS,ITestResult.FAILURE,ITestResult.SKIP
ITestResult.getInstanceName()是类名
ITestResult.getThrowable() 测试的报错信息
示例
@AfterMethod
public void cleanTestCase(ITestResult result) {
//@AfterMethod 当@Test执行完判断是否为失败用例
if (result.getStatus() == ITestResult.FAILURE) {
System.out.println("failed method:" + result.getName());
}
//打印类名
System.out.println("testResult.className():" + result.getInstanceName());
//报错信息
System.out.println("testResult.message():" + result.getThrowable());
}
正式内容!
TestNG 监听器
监听器的种类
以下是 TestNG 提供的几种监听器:
1.IAnnotationTransformer //操作@Test
2.IAnnotationTransformer2 //操作@Configuration、@DataProvider和@Factory
//前两个监听器只能testng.xml里面进行配置 其他既可以注解也可以下xml配置;
3.IHookable
4.IInvokedMethodListener
5.IMethodInterceptor
6.IReporter
7.ISuiteListener
//重点
8.ITestListener
IAnnotationTransformer
public class Transform implements IAnnotationTransformer {
public void transform(ITestAnnotation iTestAnnotation, Class aClass,
Constructor constructor, Method method){
iTestAnnotation.setInvocationCount(2); // 执行2次
}
}
testng.xml如下
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<!-- 监听器的位置在这!! -->
<listeners>
<listener class-name="ch07.testng.Transform"/>
</listeners>
<test name="Nopackage" >
<classes>
<class name="ch07.testng.TestTransform" />
</classes>
</test>
</suite>
ITestListener
直接继承TestListenerAdapter类来实现。该类是一个基于ITestListener 的简单适配器,存储了被运行的所有测试用例。
实现监听器的步骤:
1、创建监听类,实现接口ITestListener ,或者继承类TestListenerAdapter
重写三个方法
onTestStart, onTestSuccess(), onTestFailure()
2、配置testng.xml文件,并设置Lienter范围,或者为测试类设置@Listeners注解
或者利用注解启用监听器:
@Listeners(TestListener.class)
•TestNG 对添加的监听器不做去重判断。因此,如果 testng.xml 和源代码中添加了相同的监听器,该监听器的方法会被调用两次。
这里用了两个监听器
import java.util.List;
//利用注解启用监听器TestListenerAdapterDemo7
@Listeners({TestListenerAdapterDemo7.class,TestListenerAdapterDemo8.class})
public class DemoForTestListenerAdapter {
@Test
public void test1() {
assertEquals(1, 1);
}
@Test
public void test2() {
assertEquals(2, 2);
}
@Test
public void test3() {
assertEquals(1, 2);
}
}
public class TestListenerAdapterDemo7 extends TestListenerAdapter {
//当方法成功时
@Override
public void onTestSuccess(ITestResult tr) {
//ITestResult.getInstanceName()是类名
//ITestResult.getName() 是测试用例名,方法名
String tr_name=tr.getInstanceName()+"_"+tr.getName();
System.out.println(tr_name+"执行成功了");
}
//当方法失败时
@Override
public void onTestFailure(ITestResult tr) {
String tr_name=tr.getInstanceName()+"_"+tr.getName();
System.out.println(tr_name+"执行失败,需要截屏");
}
}
第二个监听器
public class TestListenerAdapterDemo8 extends TestListenerAdapter {
@Override
public void onFinish(ITestContext testContext) {
//
ITestNGMethod[] methods=this.getAllTestMethods();
//创建链表来储存失败用例。
List<ITestResult> fail_list=this.getFailedTests();
//创建链表来储存成功用例。
List<ITestResult> pass_list=this.getPassedTests();
System.out.println("成功的测试用例有:"+pass_list.size());
//for循环遍历并且打印成功的测试用例
for(ITestResult tr:pass_list) {
String method_name=tr.getInstanceName()+"_"+tr.getName();
System.out.println(method_name);
}
}
}
import static org.testng.Assert.assertEquals;
@Listeners(TestListenerDemo6.class)
public class DemoForTestListener {
@Test
public void test1() {
assertEquals(1, 1);
}
@Test
public void test2() {
assertEquals(2, 2);
}
@Test
public void test3() {
assertEquals(1, 2);
}
}
用来监听上面的测试类,并且统计成功和失败的案例
这里要注意有无法统计的情况,原因是方法冲突了,比如在同一个类中既有打印成功用例又有计数的方法,那么答应成功用例的方法获得了成功用例,计数的就无法统计成功用例;所以要用两个类一个打印成功用例和失败用例;另外一个用来计数。
import org.testng.ITestContext;
public class TestListenerDemo6 implements ITestListener {
int count_success;
int count_fail;
// 在每一个成功的测试用例之后执行
@Override
public void onTestSuccess(ITestResult result) {
// String method_name=result.getInstanceName()+"_"+result.getName();
// System.out.println(method_name+"执行通过");
count_success++;
}
// 在每一个失败的测试用例之后执行
@Override
public void onTestFailure(ITestResult result) {
// String method_name=result.getInstanceName()+"_"+result.getName();
// System.out.println(method_name+"执行失败,需要截屏");
count_fail++;
}
@Override
public void onFinish(ITestContext context) {
System.out.println("失败的测试用例"+count_fail);
// ITestNGMethod[] methods=context.getAllTestMethods();
//
// for(ITestNGMethod m:methods) {
// System.out.println(m.getInstance().toString().split("@")[0]);
// System.out.println(m.getMethodName());
}
}
第八章
PO模式:把测试代码和页面定位分离;
Page Object 设计模式的优点
减少代码的复用
//adminloginpages 继承BaseDriver
public WebElement
public WebElement set_user_name(){
}
写一个父类BaseDriver
//adminloginpages1 继承BaseDriver
public class BaseTest {
String url_base = "http://localhost:8032/Mymovie/admin.php/Login/index.html";
WebDriver driver;
@BeforeClass
public void initDriver() {
//打开浏览器
//设置webdriver路径
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
driver = new FirefoxDriver();
}
@AfterClass
public void quiteDriver() {
//关闭浏览器
if(driver!=null) {
driver.quit();
}
}
}
构造方法先执行父类的
一个测试类一个页面类一个父类
重复操作交给父类来做
;
@BeforeClass
public void initDriver() {
//打开浏览器
//设置webdriver路径
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
driver = new FirefoxDriver();
}
@AfterClass
public void quiteDriver() {
//关闭浏览器
if(driver!=null) {
driver.quit();
}
}
}
构造方法先执行父类的
一个测试类一个页面类一个父类
重复操作交给父类来做