欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

}




构造方法先执行父类的

一个测试类一个页面类一个父类

重复操作交给父类来做

相关标签: Selenium