GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java library Unit Test Làm thế nào để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit?

Làm thế nào để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit?

Đăng vào 23/03/2019 Được đăng bởi GP Coder 1994 Lượt xem

Trong bài này chúng ta sẽ cùng tìm hiểu về JUnit Listener và cách để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit.

Nội dung

  • 1 Listener là gì?
  • 2 Ví dụ JUnit Test Listener

Listener là gì?

Listener giúp lắng nghe các event (sự kiện) mà chúng ta quan tâm, chẳng hạn chúng ta thêm listener để ghi log, tracking thời gian mỗi khi một event phát sinh.

JUnit cung cấp một cách để chúng ta lắng nghe các sự kiện trong khi thực thi các phương thức test thông qua class RunListener.

Để tạo một Listener trong JUnit, chúng ta chỉ đơn giản tạo một class Listener kế thừ từ class RunListener và đăng ký (override) các event mà chúng ta muốn lắng nghe.

Một số sự kiện chúng ta có thể đăng ký với RunListener:

  • testRunStarted(Description description) : được gọi trước khi bất kỳ test đã được chạy và chỉ được gọi một lần. Description chứa các thông tin về một test được chạy như tên phương thức, số lượng phương thức, …
  • testRunFinished(Result result) : được gọi sau khi tất cả các test đã được chạy.
  • testStarted(Description description) : được gọi mỗi khi một phương thức test được chạy (@Test).
  • testFinished(Description description) : được gọi mỗi khi một phương thức test đã được chạy.
  • testFailure(Failure failure) : được gọi mỗi khi một phương thức test failed.
  • testAssumptionFailure(Failure failure) : được gọi mỗi khi một assumption failed.
  • testIgnored(Description description) : được gọi mỗi khi một phương thức bị bỏ qua (@Ignore).

Ví dụ JUnit Test Listener

Chúng ta có các class test sau:

AssertTest.java


package com.gpcoder.junit.listener;

import org.junit.Assert;
import org.junit.Test;

public class AssertTest {

	@Test
	public void assertTrueTest() {
		Assert.assertTrue(true);
	}

	@Test
	public void assertFalseTest() {
		Assert.assertFalse(false);
	}
}

IgnoreTest.java


package com.gpcoder.junit.listener;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

public class IgnoreTest {

	@Test
	@Ignore("This test case will be ignored")
	public void ignoreTest() {
		String expected = "gpcoder.com";
		Assert.assertEquals(expected, "gpcoder.com");
	}
}

Tiếp theo chúng ta sẽ tạo một Listener để lắng nghe các sự kiện khi mỗi một phương thức được thực thi:


package com.gpcoder.junit.listener;

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;

public class ExecutionListener extends RunListener {

	private long startTime;
	private long endTime;

	/**
	 * Called before any tests have been run.
	 */
	@Override
	public void testRunStarted(Description description) throws java.lang.Exception {
		System.out.println("Tests started! Number of tests to execute : " + description.testCount());
		startTime = System.currentTimeMillis();
	}

	/**
	 * Called when all tests have finished
	 */
	@Override
	public void testRunFinished(Result result) throws java.lang.Exception {
		System.out.println("Tests finished! Number of tests executed: " + result.getRunCount());

		endTime = System.currentTimeMillis();
		long elapsedMiliSeconds = endTime - startTime;
		System.out.println("Elapsed time of tests execution: " + elapsedMiliSeconds + " milliseconds");
	}

	/**
	 * Called when an atomic test is about to be started.
	 */
	@Override
	public void testStarted(Description description) throws java.lang.Exception {
		System.out.println(String.format("Starting execution of test case : %s()", description.getMethodName()));
	}

	/**
	 * Called when an atomic test has finished, whether the test succeeds or fails.
	 */
	@Override
	public void testFinished(Description description) throws java.lang.Exception {
		System.out.println(String.format("Finished execution of test case : %s()", description.getMethodName()));
	}

	/**
	 * Called when an atomic test fails.
	 */
	@Override
	public void testFailure(Failure failure) throws java.lang.Exception {
		System.out.println(String.format("Execution of test case failed : %s('%s')",
				failure.getDescription().getMethodName(), failure.getMessage()));
	}

	/**
	 * Called when a test will not be run, generally because a test method is
	 * annotated with Ignore.
	 */
	@Override
	public void testIgnored(Description description) throws java.lang.Exception {
		Ignore ignore = description.getAnnotation(Ignore.class);
		String ignoreMessage = String.format("Execution of test case ignored : %s('%s')", description.getMethodName(),
				ignore.value());
		System.out.println(ignoreMessage);
	}
}

Để đăng ký Listener đã tạo ở trên với JUnit chúng ta có thể thực hiện một trong các cách sau:

  • Đăng ký với JUnitCore trong trường hợp chạy JUnit test một cách thủ công:

package com.gpcoder.junit.listener;

import org.junit.runner.JUnitCore;

public class JUnitListenerExample1 {

	public static void main(String[] args) {
        JUnitCore runner = new JUnitCore();
        runner.addListener(new ExecutionListener());
        runner.run(AssertTest.class, IgnoreTest.class);
    }
}

Kết quả thực thi class Test trên:


Tests started! Number of tests to execute : 4
Starting execution of test case : assertFalseTest()
Finished execution of test case : assertFalseTest()
Starting execution of test case : assertEqualsTest()
Execution of test case failed : assertEqualsTest('This test case is failed')
Finished execution of test case : assertEqualsTest()
Starting execution of test case : assertTrueTest()
Finished execution of test case : assertTrueTest()
Execution of test case ignored : ignoreTest('This test case will be ignored')
Tests finished! Number of tests executed: 3
Elapsed time of tests execution: 12 milliseconds

  • Đăng ký với @RunWith trong trường hợp thực thi các phương thức test trong class Test:

Đầu tiên chúng ta sẽ tạo một class Custom Runner, class này kế thừa từ class BlockJUnit4ClassRunner


package com.gpcoder.junit.listener;

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 CustomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {

	public CustomBlockJUnit4ClassRunner(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 ExecutionListener());

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

Bây giờ chúng ta có thể sử dụng với @RunWith như sau:


package com.gpcoder.junit.listener;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(CustomBlockJUnit4ClassRunner.class)
public class JUnitListenerExample2 {

	@Test
	public void assertTrueTest() {
		Assert.assertTrue(true);
	}

	@Test
	public void assertFalseTest() {
		Assert.assertFalse(false);
	}

	@Test
	@Ignore("This test case will be ignored")
	public void ignoreTest() {
		String expected = "gpcoder.com";
		Assert.assertEquals(expected, "gpcoder.com");
	}
}

  • Đăng ký với @RunWith trong trường hợp thực thi các phương thức test trong class Suite:

Đầu tiên chúng ta sẽ tạo một class Custom Runner, class này kế thừa từ class Suite


package com.gpcoder.junit.listener;

import java.util.List;

import org.junit.AssumptionViolatedException;
import org.junit.internal.runners.model.EachTestNotifier;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import org.junit.runner.notification.StoppedByUserException;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import org.junit.runners.model.Statement;

public class CustomSuite extends Suite {

	public CustomSuite(Class<?> klass, List<Runner> runners) throws InitializationError {
		super(klass, runners);
	}

	public CustomSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
		super(klass, builder);
	}

	public CustomSuite(RunnerBuilder builder, Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
		super(builder, klass, suiteClasses);
	}

	public CustomSuite(RunnerBuilder builder, Class<?>[] classes) throws InitializationError {
		super(builder, classes);
	}

	protected CustomSuite(Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
		super(klass, suiteClasses);
	}

	@Override
	public void run(RunNotifier notifier) {
		System.out.println("Executing run()");
		// Add Listener. This will register our JUnit Listener.
		notifier.addListener(new ExecutionListener());

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

Bây giờ chúng ta có thể sử dụng với @RunWith như sau:


package com.gpcoder.junit.listener;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(CustomSuite.class)
@Suite.SuiteClasses({ AssertTest.class, IgnoreTest.class })
public class JUnitListenerExample3 {

}

Tài liệu tham khảo:

  • https://examples.javacodegeeks.com/core-java/junit/junit-runlistener-example/
5.0
03
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

Chuyên mục: Unit Test Được gắn thẻ: JUnit

Làm thế nào để chạy lại một failed Test trong JUnit?
JUnit – HTML Report với Surefire maven plugin

Có thể bạn muốn xem:

  • Đơn giản hóa Unit Test với JUnit Rule (11/03/2019)
  • Mockito – Annotations (28/03/2019)
  • Một số API của JUnit – Assert, Assume, Test Runner (06/03/2019)
  • Tổng hợp các bài viết về Unit Test trong Java (15/04/2019)
  • JUnit – Hamcrest Matchers (14/03/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020
  • Sử dụng Alternate Exchange trong RabbitMQ 10/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (65882 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (64371 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (60598 lượt xem)
  • Giới thiệu Design Patterns (57268 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (53777 lượt xem)

Nội dung bài viết

  • 1 Listener là gì?
  • 2 Ví dụ JUnit Test Listener

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP Performance PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2023 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Google
Hacker News
Line
LinkedIn
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
Xing
Yahoo! Mail

Copy short link

Copy link