How to use Junit Listener
JUnit Listeners
If you want to do some operations when your tests are started, passed, finished, failed, or skipped/ignored, you can use Listeners. Both JUnit and TestNG provide us Listeners, and in this article, I will explain how to add JUnit Listeners in your automation framework.
Listeners listen and handle events while your automation code is running. We can add a listener by creating a custom Runner. Then, we can use this custom runner in our test class with @RunWith annotation.
First, let’s write our Listener class by extending JUnit’s RunListener class and overriding its methods. I called our listener class as MyExecutionListener.
MyExecutionListener.java
package junitexamples.listener; /**
* Created by ONUR BASKIRT on 27.03.2016.
*/ import org.junit.Ignore;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener; import java.util.Date; public class MyExecutionListener extends RunListener { //Start and End time of the tests
long startTime;
long endTime; @Override
public void testRunStarted(Description description) throws Exception {
//Start time of the tests
startTime = new Date().getTime();
//Print the number of tests before the all tests execution.
System.out.println("Tests started! Number of Test case: " + description.testCount() + "\n");
} @Override
public void testRunFinished(Result result) throws Exception {
//End time of the tests
endTime = new Date().getTime();
//Print the below lines when all tests are finished.
System.out.println("Tests finished! Number of test case: " + result.getRunCount());
long elapsedSeconds = (endTime-startTime)/1000;
System.out.println("Elapsed time of tests execution: " + elapsedSeconds +" seconds");
} @Override
public void testStarted(Description description) throws Exception {
//Write the test name when it is started.
System.out.println(description.getMethodName() + " test is starting...");
} @Override
public void testFinished(Description description) throws Exception {
//Write the test name when it is finished.
System.out.println(description.getMethodName() + " test is finished...\n");
} @Override
public void testFailure(Failure failure) throws Exception {
//Write the test name when it is failed.
System.out.println(failure.getDescription().getMethodName() + " test FAILED!!!");
} //O.B: IntelliJ ignored by default. I did not succeed to run this method.
//If you know any way to accomplish this, please write a comment.
@Override
public void testIgnored(Description description) throws Exception {
super.testIgnored(description);
Ignore ignore = description.getAnnotation(Ignore.class);
String ignoreMessage = String.format(
"@Ignore test method '%s()': '%s'",
description.getMethodName(), ignore.value());
System.out.println(ignoreMessage + "\n");
}
}
Java
Second, we need to add the listener to the test execution. We can add the listener by calling the RunNotifier.addListener() method. This will register our JUnit Listener. I faced with a problem when I tried to use RunListener class’s testRunStarted method. Then, I found a solution that triggers this method after registering the listener in the run method. I wrote a comment about this solution in below code.
MyTestRunner.java
package junitexamples.listener; /**
* Created by ONUR BASKIRT on 27.03.2016.
*/ import org.junit.AssumptionViolatedException;
import org.junit.internal.runners.model.EachTestNotifier;
import org.junit.runner.notification.RunNotifier;
import org.junit.runner.notification.StoppedByUserException;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement; public class MyTestRunner extends BlockJUnit4ClassRunner { public MyTestRunner(Class<?> klass) throws InitializationError {
super(klass);
} @Override
public void run (RunNotifier notifier){
System.out.println("Executing run()");
//Add Listener. This will register our JUnit Listener.
notifier.addListener(new MyExecutionListener()); //Get each test notifier
EachTestNotifier testNotifier = new EachTestNotifier(notifier,
getDescription());
try {
//In order capture testRunStarted method
//at the very beginning of the test run, we will add below code.
//Invoke here the run testRunStarted() method
notifier.fireTestRunStarted(getDescription());
Statement statement = classBlock(notifier);
statement.evaluate();
} catch (AssumptionViolatedException e) {
testNotifier.fireTestIgnored();
} catch (StoppedByUserException e) {
throw e;
} catch (Throwable e) {
testNotifier.addFailure(e);
}
}
}
Java
Third, we need to write a test to verify our listener’s functionality. We register our custom runner with @RunWith(MyTestRunner.class) annotation and for alphabetic test execution, we add @FixMethodOrder(MethodSorters.NAME_ASCENDING) annotation.
Extra: Also, you can combine listeners with custom Retry Rule which described in other JUnit article. Thus, when your test fails, it will rerun the failed test according to given retry count.
ListenerExampleTest.java
package junitexamples.listener; import jdk.nashorn.internal.ir.annotations.Ignore;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver; import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals; /**
* Created by ONUR on 27.03.2016.
*/
@RunWith(MyTestRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ListenerExampleTest { static WebDriver driver;
final private static String URL = "http://www.swtestacademy.com"; @BeforeClass
public static void setupTest(){
driver = new HtmlUnitDriver();
driver.get(URL);
} /*
//If you want, you can add Retry Rule. (I explained it in another post.)
//Thus, when your test fails, it will rerun by given retry count.
@Rule
public RetryRule retryRule = new RetryRule(3);
*/ @Test
public void T01_PassTest() {
//Check title
assertThat(driver.getTitle(), is("Software Test Academy"));
} @Test
public void T02_FailTest() {
//Check title
assertEquals("Title is wrong!!!", "WRONG TITLE", driver.getTitle());
} //IntelliJ ignored by default
@Ignore
public void T03_IgnoreTest() {
//Check title is correct
assertThat(driver.getTitle(), is("Software Test Academy"));
} //Throw Exception
@Test
public void T04_ExceptionTest() {
throw new RuntimeException();
}
}
Java
Result:

How to use Junit Listener的更多相关文章
- WebDriver - 添加失败截图
WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDrive ...
- 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener
使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解,那么JUnit将会采用默认的执行类Suite执行,如下类: public ...
- Junit : how to add listener, and how to extends RunListener to override behaviors while failed
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html org.junit.runner ...
- [Java] Spring + SpringMVC + Maven + JUnit 搭建
示例项目下载: https://github.com/yangyxd/SpringDemo 利用前面 SpringMVC 项目的配置方式,完成初步的项目创建.下面只讲一些不同之处. 传送门: [Jav ...
- How to Use JUnit With JMeter
Do you need to use JUnit in your testing processes? To answer this question, let's take a look first ...
- 监听器Listener
监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...
- maven+springMVC+mybatis+junit详细搭建过程 ***
springMVC+mybatis框架搭建 在上一遍博客中以及讲诉了新建maven项目的流程,现在紧跟上一遍文章,接着搭建spring项目 首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什 ...
- 使用JUnit单元测试入门
一.JUnit是什么? JUnit是一个开发源代码的java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).JUnit最初是由Erich Gam ...
- 获取JUnit的执行结果
junit执行之后会有一个结果展示,下面就来看一下怎么获取这些结果并将其存储为一个对象 junit代码如下: package test; import org.junit.After; import ...
随机推荐
- 第五章:creat statechart diagrams for classes and use cases
- c# 在mongo中查询经纬度范围
#region 索引 //IndexKeysDocument doc = new IndexKeysDocument();//新建索引 //2d 平面坐标索引,适用于基于平面的坐标计算.也支持球面距离 ...
- RabbitMQ CentOS6.5 安装
1.安装前准备工作 1)安装RbbitMQ之前先安装ErLang 2)安装ErLang之前需要安装最新的socat 3)安装方式有多种,可以下包安装,可以直接下载rpm文件安装,推荐前者. 4)安装的 ...
- python SQLite说一点点, python使用数据库需要注意的几点
SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...
- 写自动更新程序出现"远程服务器返回错误: (404) 未找到"
在win2003配置后,在客户端运行时能够下载exe和dll文件,但是在更新lib文件时总是报“远程服务器返回错误: (404) 未找到”错误,不明白咋会出现这个问题,去网上一查,发现以下解决办法: ...
- 20165215 2017-2018-2 《Java程序设计》第7周学习总结
20165215 2017-2018-2 <Java程序设计>第七周学习总结 教材学习内容总结 chapter11 下载安装MySQL服务器 启动MySQL数据库服务器 在bin子目录中, ...
- 什么是FEBS
FEBS后台权限管理系统 FEBS是一个简单高效的后台权限管理系统.项目基础框架采用全新的Java Web开发框架 —— Spring Boot2.0.4,消除了繁杂的XML配置,使得二次开 ...
- flask框架----蓝图
蓝图(flask中多py文件拆分都要用到蓝图) 如果代码非常多,要进行归类.不同的功能放在不同的文件,吧相关的视图函数也放进去.蓝图也就是对flask的目录结构进行分配(应用于小,中型的程序), 小中 ...
- 纯js实现移动端滑动控件,以上下滑动自取中间位置年龄为例;
<!-- 需求:上下滑动,在一个大的div块里显示5个小的值,滑动过程中自动获取中间位置的值 需要注意的是: 1 touchmove会多次被触发: 2 获取中间位置的值可以通过定位得top值来获 ...
- Hybrid App中原生页面 VS H5页面(分享)
本文部分转自 http://www.jianshu.com/p/00ff5664e000 现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有“混合的” ...