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 . 3419 Lượt xem . Toàn màn hình

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é! Và Donate tác giả

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:

  • Làm sao test một Abstract Class trong Java? (12/04/2019)
  • JUnit – Parameterized Test (08/03/2019)
  • Tìm hiểu về kiểm thử (Tesing) trong phát triển phần mềm (27/02/2019)
  • Test REST Web Service đơn giản hơn với REST Assured (26/08/2019)
  • JUnit – Custom Hamcrest Matchers (18/03/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • 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

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98059 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97700 lượt xem)
  • Giới thiệu Design Patterns (87764 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86435 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83839 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 PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger 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.

Donate tác giả

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 2025 © 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
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link