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

MyExecutionListener

 

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

MyTestRunner
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

ListenerExampleTest

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的更多相关文章

  1. WebDriver - 添加失败截图

    WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDrive ...

  2. 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener

    使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解,那么JUnit将会采用默认的执行类Suite执行,如下类: public  ...

  3. 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 ...

  4. [Java] Spring + SpringMVC + Maven + JUnit 搭建

    示例项目下载: https://github.com/yangyxd/SpringDemo 利用前面 SpringMVC 项目的配置方式,完成初步的项目创建.下面只讲一些不同之处. 传送门: [Jav ...

  5. 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 ...

  6. 监听器Listener

    监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...

  7. maven+springMVC+mybatis+junit详细搭建过程 ***

    springMVC+mybatis框架搭建 在上一遍博客中以及讲诉了新建maven项目的流程,现在紧跟上一遍文章,接着搭建spring项目 首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什 ...

  8. 使用JUnit单元测试入门

    一.JUnit是什么? JUnit是一个开发源代码的java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).JUnit最初是由Erich Gam ...

  9. 获取JUnit的执行结果

    junit执行之后会有一个结果展示,下面就来看一下怎么获取这些结果并将其存储为一个对象 junit代码如下: package test; import org.junit.After; import ...

随机推荐

  1. 26.如何获得select被选中option的value和text

    如何获得select被选中option的value和text 一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById( ...

  2. vue中使用ckeditor

    1.第一步首先去ckeditor官网去下载editor文件,这里以ckeditor4为例 首先在index.html里引入js代码 <script type="text/javascr ...

  3. 第四章 CSS3概述

    1.CSS3新增常用选择器(1)结构性伪类选择器:root 文档根元素 :nth-child(n) 第N个子元素"first-child 第一个元素 :kast-child 最后一个子元素 ...

  4. 【AngularJS】解决ng-if中的ng-model值无效的问题(转)

    from:http://blog.csdn.net/u013451157/article/details/60866210 与其他指令一样,ng-if指令也会创建一个子级作用域,因此,如果在ng-if ...

  5. Permutation Bo (数学证明)

    当在两端时:共有n * (n - 1)种组合,满足条件的有,计算可得, counter = n * (n - 1) / 2. 其他位置时:共有n * (n - 1) * (n - 2) 种组合,满足条 ...

  6. Spark学习之路 (二十八)分布式图计算系统

    一.引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 二.图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,GraphL ...

  7. 【Elasticsearch学习之三】Elasticsearch 搜索引擎案例

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 elasticsearch-2.2.0 第一步:获取数据主流 ...

  8. QTCreator 调试:unknown debugger type "No engine"

    [1]QTCreator调试,应用程序输出:unknown debugger type "No engine" 如图:下断点->调试程序->应用程序输出 说明:调试器无 ...

  9. 从windows本地IDE启动远程Linux文件进行调试

    1)  因为WingIDE调用putty和plink进行ssh连接,需要先设置putty. 点击下载putty,并解压,把解压路径附到操作系统PATH环境变量中,之后重新启动WingIDE,让它重新读 ...

  10. CBV源码解析

    1.CBV(class based view) 首先定义一个视图函数,用类的方式定义: 举例: class LoginView(View): def get(self,request): return ...