【单元测试】Junit 4--junit4 内置Rule

2023-12-17 05:20

本文主要是介绍【单元测试】Junit 4--junit4 内置Rule,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.0 Rules

​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为。测试人员可以重复使用或扩展下面提供的Rules之一,或编写自己的Rules。

1.1 TestName

​ TestName Rule使当前的测试名称在测试方法中可用。用于在测试执行过程中获取测试方法名称。在starting()中记录测试方法名,在getMethodName()中返回

例如:

import static org.junit.Assert.*;import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;public class NameRuleTest {@Rulepublic final TestName name = new TestName();@Testpublic void testA() {assertEquals("testA", name.getMethodName());}@Testpublic void testB() {assertEquals("testB", name.getMethodName());}
}

1.2 TemporaryFolder

​ TemporaryFolder Rule允许创建文件和文件夹,这些文件和文件夹在测试方法结束时被删除(无论通过还是失败)。默认情况下,如果资源不能被删除,则不会抛出异常。

import java.io.*;import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;public class HasTempFolder {@Rulepublic TemporaryFolder folder= new TemporaryFolder();@Testpublic void testUsingTempFolder() throws IOException {File createdFile = folder.newFile("myfile.txt");File createdFolder = folder.newFolder("subfolder");// ...}}

TemporaryFolder#newFolder(String… folderNames)可以根据输入的参数创建目录。如果是多级目录,可以递归创建。

TemporaryFolder#newFile()可以创建一个随机名字的临时文件;

TemporaryFolder##newFolder() 可以创建一个随机名字的临时目录。

1.3 ExternalResource

​ ExternalResource是一个规则(如TemporaryFolder)的基类,它在测试前设置了一个外部资源(一个文件、套接字、服务器、数据库连接等),并保证在测试后将其拆除。

可以设置测试前后需要做的事情(比如:文件、socket、服务、数据库的连接与关闭)。

 public static class UsesExternalResource {Server myServer = new Server();@Rulepublic ExternalResource resource = new ExternalResource() {@Overrideprotected void before() throws Throwable {myServer.connect();};@Overrideprotected void after() {myServer.disconnect();};};@Testpublic void testFoo() {new Client().run(myServer);}}

ExternalResource#before会在每个测试之前处理;#after会在每个测试之后处理;

关于ExternalResource与@Before已经@After等标记步骤的执行顺序,我们会在本文后面部分介绍。

1.4 ErrorCollector

ErrorCollector这个Rule,在出现一个错误后,还可以让测试继续进行下去。

他提供三个方法:

checkThat(final T value, Matcher matcher)
checkSucceeds(Callable callable)
addError(Throwable error)
前面两个是用来处理断言的,最后一个是添加错误至错误列表中。

看下面例子:

 package mytest;import static org.hamcrest.CoreMatchers.is;import static org.junit.Assert.assertThat;import java.util.concurrent.Callable;import org.junit.Rule;import org.junit.Test;import org.junit.rules.ErrorCollector;public class JUnitCoreErrorControllerRuleTest {private final int multiplesOf2[] = { 0, 2, 4, 7, 8, 11, 12 };@Rulepublic ErrorCollector errorCollector = new ErrorCollector();/** 下面这个测试,会报告两个failures。这一点和下面的checkSucceeds测试不同*/@Testpublic void testMultiplesOf2() {int multiple = 0;for (int multipleOf2 : multiplesOf2) {// Will count the number of issues in this list// - 3*2 = 6 not 7, 5*2 = 10 not 11 : 2 FailureserrorCollector.checkThat(2 * multiple, is(multipleOf2));multiple++;}}/** 下面代码中有两个断言会失败,但每次运行JUnit框架只会报告一个。这一点和上面的checkThat测试不同,可以对比一下。*/@Testpublic void testCallableMultiples() {errorCollector.checkSucceeds(new Callable<Object>() {public Object call() throws Exception {assertThat(2 * 2, is(5));assertThat(2 * 3, is(6));assertThat(2 * 4, is(8));assertThat(2 * 5, is(9));return null;}});}/** 下面运行时,会报告2个错误*/@Testpublic void testAddingAnError() {assertThat(2 * 2, is(4));errorCollector.addError(new Throwable("Error Collector added an error"));assertThat(2 * 3, is(6));errorCollector.addError(new Throwable("Error Collector added a second error"));}}

运行结果:

 Failed tests: testCallableMultiples(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <5>but: was <4>testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <7>but: was <6>testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <11>but: was <10>Tests in error: testAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added an errortestAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added a second error

从这个例子,可以看出:

ErrorCollector#checkThat 会报告测试中的每一个failures
ErrorCollector#checkSucceeds 只会检查是否成功,如果不成功,只报告第一个导致不成功的failure
ErrorCollector#addError 是添加一个错误(error)。

1.5 Verifier

如果,你想在每个测试之后,甚至是在@After之后,想检查些什么,就可以使用Verifier这个Rule.

看例子:

 private static String sequence;public static class UsesVerifier {@Rulepublic Verifier collector = new Verifier() {@Overrideprotected void verify() {sequence += " verify ";}};@Testpublic void example() {sequence += "test";}@Testpublic void example2() {sequence += "test2";}@Afterpublic void after() {sequence += " after";}}@Testpublic void verifierRunsAfterTest() {sequence = "";assertThat(testResult(UsesVerifier.class), isSuccessful());assertEquals("test after verify test2 after verify ", sequence);}

从上面例子可以看出:Verifier#verify针对每个测试都会运行一次,并且运行在@After步骤之后。

需要说明:如果某测试出现失败(fail),那么这个测试之后就不会做verify,这一点,可以结合下面的例子看出

1.6 TestWatcher

对测试的每个步骤进行监控。

看例子:

 package tangzhi.mytest;import static org.junit.Assert.*;  import static org.hamcrest.CoreMatchers.*;import org.junit.After;import org.junit.Rule;import org.junit.Test;import org.junit.rules.TestRule;import org.junit.rules.TestWatcher;import org.junit.rules.Verifier;import org.junit.runner.Description;import org.junit.runners.model.Statement;public class WatchmanTest {private static String watchedLog;@Rulepublic TestRule watchman = new TestWatcher() {@Overridepublic Statement apply(Statement base, Description description) {Statement s = super.apply(base, description);watchedLog="";System.out.println("watch apply.");return s;}@Overrideprotected void succeeded(Description description) {watchedLog += description.getDisplayName() + " " + "success!";System.out.println("watch succeed:"+watchedLog);}@Overrideprotected void failed(Throwable e, Description description) {watchedLog += description.getDisplayName() + " " + e.getClass().getSimpleName();System.out.println("watch failed:"+watchedLog);}@Overrideprotected void starting(Description description) {super.starting(description);System.out.println("watch starting.");}@Overrideprotected void finished(Description description) {super.finished(description);System.out.println("watch finished.");}};@Rulepublic Verifier collector = new Verifier() {@Overrideprotected void verify() {System.out.println("@Verify:"+watchedLog);}};@Testpublic void fails() {System.out.println("in fails");assertThat("ssss", is("sss"));}@Testpublic void succeeds() {System.out.println("in succeeds");}@Afterpublic void after() {System.out.println("@After");}}

1.7 Timeout

对于添加了TimeoutRule 的测试类,当测试类中的测试方法执行超过TimeoutRule 配置的时间时,测试方法执行就会被标记为失败

public class TimeoutRuleTest {@Rulepublic Timeout globalTimeout = Timeout.seconds(5);@Testpublic void timeout() throws InterruptedException {TimeUnit.SECONDS.sleep(10);}@Testpublic void onTime() throws InterruptedException {TimeUnit.SECONDS.sleep(2);}}

执行上面测试用例,onTime方法执行通过,timeout()方法则抛出TestTimedOutException:

org.junit.runners.model.TestTimedOutException: test timed out after 5 seconds

还有很多Rule就不一一介绍了


             【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通


二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

这篇关于【单元测试】Junit 4--junit4 内置Rule的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503224

相关文章

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

Linux内置的审计跟踪工具:last命令

如果你是一个服务器管理员,你或许知道你要保护你的服务器的话,不仅是从外部,还要从内部保护。Linux有一个内置工具来看到最后登陆服务器的用户,可以帮助你保护服务器。   这个命令是last。它对于追踪非常有用。让我们来看一下last可以为你做些什么。   last命令的功能是什么   last显示的是自/var/log/wtmp文件创建起所有登录(和登出)的用户。这个文件是二进制

内置带so的APK为系统APK方法

(1)若内置为可卸载的APK,可以无需解压出lib直接编译就可以 具体参考http://blog.csdn.net/a462533587/article/details/46380795 (2)若内置为system APP,上述blog也有两种方式: 方法一:   如下例,在Android.mk中添加并配置变量(注意路径对应): LOCAL_PREBUILT_JNI_LIBS = \

请解释JSP中的九大内置对象及其作用。什么是Java Web中的请求转发和重定向?它们有什么区别?

请解释JSP中的九大内置对象及其作用。 JSP(JavaServer Pages)中的九大内置对象(也称为隐式对象或自动对象)是JSP容器为每个页面提供的Java对象,这些对象在JSP页面被转换成Servlet时自动可用,无需显式声明。这些对象极大地简化了JSP页面的开发,因为它们提供了对Web应用程序中常见功能的直接访问。以下是九大内置对象及其作用的详细解释: request:javax.

最强虚拟机,内置强大插件,绝!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 天给大家安利两款移动端的虚拟机软件,均支持超级权限、Xposed框架和谷歌服务,而其中一款可谓称得上最强虚拟机,不仅含有虚拟机的基本功能,还能多开分身、模拟器以及强大的插件社区,能实现的功能超乎你的想象,一起来看看吧! X8沙箱(安卓) 软件介绍 X8沙箱(手机版的安卓模拟器、虚拟机、多开分身、游戏双开多开挂机)是一款极简、

PowerMock 单元测试总结与常见坑解决方案

PowerMock 单元测试总结与常见坑解决方案 官方文档: PowerMock GitHub PowerMock 在单元测试中能够帮助我们解决静态类、final 方法、私有方法等无法轻易 mock 的问题。下面是我在实际使用 PowerMock 时踩过的一些坑,并结合 PowerMock 的一些方法进行总结。 基本依赖和设置 在 Maven 中添加 PowerMock 依赖。在测试

javaweb-day01-2(Junit测试工具用法)

JUnit 注释是给人看的,注解是给程序和编译器看的。 写好一个没有main函数的实体Person类,并且不想在main函数中来测试这个类中的方法: 我们一般使用JUnit测试: 建一个Junit.test包在这个包下建一个Junit test case,命名为PersonTest.java在Junit的测试用例PersonTest.java类中,建 testRun()、t

python内置装饰器@staticmethod,@classmethod

2.@staticmethod,@classmethod 有了@property装饰器的了解,这两个装饰器的原理是差不多的。@staticmethod返回的是一个staticmethod类对象,而@classmethod返回的是一个classmethod类对象。他们都是调用的是各自的__init__()构造函数。 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@stat