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. report源码分析——宏的执行

    uvm_info,uvm_error其实是对uvm_report_info,uvm_report_error的封装. 其中warning,error,fatal,macros默认都是定义为UVM_NO ...

  2. 3.用Thead子类及Runnable接口类实现车站购票的一个场景(static关键字)

    如上图所示,我们这里模拟一下去车站买票的情形:这里有3个柜台同时售票,总共是1000张票,这三个柜台同时买票,但是只能一个柜台卖同一张票,也就是说1号票卖了之后我们就只能买2号票,2号票卖了之后我们只 ...

  3. Java多线程-----单例模式在多线程中的使用用问题

       1.饿汉模式(立即加载模式)与多线程 不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例 package com.thread; /** * 饿汉模式 * * @author yy ...

  4. jsp页面报错 javax.servlet cannot be resolved to a type

    需要引入 Tomcat 中的两个 jar 包: servlet-api jsp-api.jar

  5. 解读 JavaScript 之引擎、运行时和堆栈调用

    https://www.oschina.net/translate/how-does-javascript-actually-work-part-1 随着 JavaScript 变得越来越流行,很多团 ...

  6. flask 的session

    python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...

  7. AtCoder Beginner Contest 082 A - Round Up the Mean

    题目链接:https://abc082.contest.atcoder.jp/tasks/abc082_a Time limit : 2sec / Memory limit : 256MB Score ...

  8. 前端框架VUE----模板字符串

    传统的JavaScript语言,输出模板通常是这样的写的. 1 $('#result').append( 2 'There are <b>' + basket.count + '</ ...

  9. PHP官方文档和phpstorm配置指南

    http://cn2.php.net/manual/zh/ phpstorm安装——>next——>…… 下载PHP.exe 地址:http://www.php.net/ 配置interp ...

  10. The Little Prince-12/14

    The Little Prince-12/14 世界上有那么多的玫瑰花,但是只有你们是一直陪伴在我身边,我们相互灌溉. ————世界上有那么多的人,但是只有你们是一直陪伴在我身边,我们相互关心. “在 ...