JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术,甚至没有读过一篇博客文章,更不用说一本书了。 也许这是一件好事,因为它们看起来足够简单且易于理解,因此我们无需任何手册即可立即使用它们,但这也意味着它们还没有得到充分利用。 在本文中,我们将介绍一些我认为非常有用的JUnit功能。

参数化测试

有时我们需要使用许多不同的输入和不同的预期结果来运行相同的方法或功能。 一种方法是为每种情况创建单独的测试,或者您可以使用循环,但是要跟踪可能的测试失败的源将更加困难。

例如,如果我们有以下表示有理数的值对象:

public class RationalNumber {private final long numerator;private final long denominator;public RationalNumber(long numerator, long denominator) {this.numerator = numerator;this.denominator = denominator;}public long getNumerator() {return numerator;}public long getDenominator() {return denominator;}@Overridepublic String toString() {return String.format("%d/%d", numerator, denominator);}
}

我们有一个名为App的服务类,其中包含一个方法转换,该方法将数字除为四舍五入的十进制小数:

public class App {/*** THE Logic** @param number some rational number* @return BigDecimal rounded to 5 decimal points*/public static BigDecimal convert(RationalNumber number) {BigDecimal numerator = new BigDecimal(number.getNumerator()).setScale(5, RoundingMode.HALF_UP);BigDecimal result = numerator.divide(new BigDecimal(number.getDenominator()),RoundingMode.HALF_UP);return result;}
}

对于实际的AppTest类,我们有

@RunWith(Parameterized.class)
public class AppTest {private RationalNumber input;private BigDecimal expected;public AppTest(RationalNumber input, BigDecimal expected) {this.input = input;this.expected = expected;}@Parameterized.Parameters(name = "{index}: number[{0}]= {1}")public static Collection<Object> data() {return Arrays.asList(new Object[][]{{new RationalNumber(1, 2), new BigDecimal("0.50000")},{new RationalNumber(1, 1), new BigDecimal("1.00000")},{new RationalNumber(1, 3), new BigDecimal("0.33333")},{new RationalNumber(1, 5), new BigDecimal("0.20000")},{new RationalNumber(10000, 3), new BigDecimal("3333.33333")}});}@Testpublic void testApp() {//given the test data//whenBigDecimal out = App.convert(input);//thenAssert.assertThat(out, is(equalTo(expected)));}}

参数化的运行器或@RunWith(Parameterized.class)启用“参数化”,换句话说,将使用@ Parameterized.Parameters注释的值的集合注入到Test构造函数中,其中每个子列表都是一个参数列表。 这意味着data()方法中的每个RationalNumber对象将被注入到输入变量中,而每个BigDecimal值将是期望值,因此在我们的示例中,我们有5个测试。

注释中还添加了对生成的测试的可选自定义命名,因此“ {index}:number [{0}] = {1} ”将被data()方法中定义的适当参数和“ {index}”占位符将成为测试用例索引,如下图所示

在IntelliJ Idea中运行参数化测试

JUnit规则的最简单定义是,它们在某种意义上是拦截器,并且与面向Spring方面的编程或Java EE拦截器API非常相似。 基本上,您可以在执行测试之前和之后做一些有用的事情。

好的,让我们从一些内置的测试规则开始。 其中之一是ExternalResource ,其想法是我们设置一个外部资源,并在拆卸小工具后释放该资源。 这种测试的一个典型例子是创建文件,因此,我们有一个内置的TemporaryFolder类,但我们也可以为其他资源创建自己的类:

public class TheRuleTest {@Rulepublic TemporaryFolder folder = new TemporaryFolder();@Testpublic void someTest() throws IOException {//givenfinal File tempFile = folder.newFile("thefile.txt");//whentempFile.setExecutable(true)  ;//thenassertThat(tempFile.canExecute(), is(true));}
}

我们本可以在@Before@After块中完成此操作,并使用Java临时文件,但在某些测试失败的情况下,很容易忘记某些东西,并且未关闭某些文件。

例如,还有一个方法的超时规则,如果在给定的时间限制内执行未完成,则测试将失败,并出现超时异常。 例如,将运行时间限制为20毫秒:

@Rule
public MethodRule globalTimeout = new Timeout(20);

我们可以实施自己的规则,以执行政策或进行各种项目特定的更改。 唯一需要做的就是让我们实现TestRule接口。

解释该行为的一个简单方案是添加一个在测试之前和之后都打印一些东西的规则。

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;public class MyTestRule implements TestRule {public class MyStatement extends Statement {private final Statement statement;public MyStatement(Statement statement) {this.statement = statement;}@Overridepublic void evaluate() throws Throwable {System.out.println("before statement" );statement.evaluate();System.out.println("after statement");}}@Overridepublic Statement apply(Statement statement,Description description) {System.out.println("apply rule");return new MyStatement(statement);}}

因此,现在有了我们的规则,我们可以在测试中使用它了,因为测试只会打印出不同的值:

public class SomeTest {@Rulepublic MyTestRule folder = new MyTestRule();@Testpublic void testA()  {System.out.println("A");}@Testpublic void testB()  {System.out.println("B");}
}

当我们运行测试时,将在控制台输出上创建以下输出:

apply rule
before statement
A
after statement
apply rule
before statement
B
after statement

内置的一个名为ExpectedException的异常在尝试测试错误时非常有用。 此外,还有一个选项可以链接规则,这些规则在许多情况下都非常有用。

总结一下

如果您想说Spock或TestNG或在JUnit之上构建的某些库比JUnit具有更多的功能,那可能就是事实。

但是你知道吗? 我们的课程路径上并不总是有那些,而且JUnit在那里并已经在各处使用的可能性很大。 为什么不利用它的全部潜力呢?

参考: 运行,JUnit! 跑!!! 在Java Advent Calendar博客上从我们的JCG合作伙伴 Attila Mihaly Balazs那里获得。

翻译自: https://www.javacodegeeks.com/2013/12/run-junit-run.html

运行,JUnit! 跑!!!相关推荐

  1. junit 循环测试_重复运行JUnit测试而没有循环

    junit 循环测试 最近,我遇到了一个问题,我不得不编写一种方法的测试,该方法需要计算在一定可能性范围内的随机分布值1 . 更准确地说,如果您假设签名看起来像 interface RandomRan ...

  2. 重复运行JUnit测试而没有循环

    最近,我遇到了一个问题,我不得不编写一种方法的测试,该方法需要计算在一定可能性范围内的随机分布值1 . 更准确地说,如果您假设签名看起来像 interface RandomRangeValueCalc ...

  3. IDEA 运行 Junit 测试用例报 !!! JUnit version 3.8 or later expected 错误

    问题介绍 在使用 IDEA 运行 Junit 测试用例的时候,控制台报了!!! JUnit version 3.8 or later expected错误,完整报错信息如下: !!! JUnit ve ...

  4. 玩转Zynq连载32——SDK在线运行裸跑程序

    特权同学玩转Zynq连载32--SDK在线运行裸跑程序 1 SDK在线运行裸跑程序 以zstar_ex50为例,演示如何将裸跑程序在Zstar板上在线运行起来. 点击SDK的菜单Run --> ...

  5. keil在线仿真STM32,需要点三次全速运行才能跑起来

    keil在线调试STM32,点三次运行才能跑起来 现象 1.使用keil开发STM32,下载完程序后,不能运行. 2.st-link仿真,需要点击三次全速运行,程序才能跑起来. 问题原因 工程中用到p ...

  6. ant接口自动化 junit_Jenkins + Ant自动运行Junit测试

    自动化测试脚本需要频繁执行,也可能需要定时执行,执行的方法可能有很多种,下面我们来讲讲怎么使用Jenkins+Ant的方式来执行用例. 一.使用工具 Jenkins Ant Junit 二.Ant T ...

  7. Android项目运行junit测试类时出现错误Internal Error (classFileParser.cpp:3494)的解决办法...

    以前的项目运行好好的,升级了ADT后,进行junit测试时出现错误: # # A fatal error has been detected by the Java Runtime Environme ...

  8. Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)

    Maven单元测试 分类: maven  2012-05-09 15:17  1986人阅读  评论(1)  收藏  举报 maven 测试 junit 单元测试 java random 目录(?)[ ...

  9. 柔性输送带运行时跑偏了怎么办?

    输送带跑偏是带式输送机最常见的故障,如果处理不及时,任凭输送带跑偏,会导致输送带与机架剧烈磨擦,输送带边被拉毛甚至撕裂,不但影响输送带的寿命,同时也容易向外撒料,影响文明生产.跑偏严重时输送带将脱离托 ...

  10. java junit 运行_运行Junit方法项目启动不了

    从控制台看不出任何有用信息,通过JUnit右键"Copy Failure List"将信息拷贝出来 TestStart.start initializationError(org. ...

最新文章

  1. Java基础之IO笔记
  2. mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息
  3. 使用ramdisk 优化nagios IO性能
  4. 服务器中显示存储设备,服务器节点信息集中显示方法、系统、设备及存储介质...
  5. les物流执行系统_物流LES系统上线啦
  6. 【操作系统】请求调页
  7. Spring Security OAuth2.0_实现分布式认证授权_扩展用户信息_Spring Security OAuth2.0认证授权---springcloud工作笔记156
  8. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(1)
  9. Debian更新软件源提示There is no public key available for the following key IDs的解决方法
  10. jenkins linux虚拟机,Jenkins实战演练之Linux节点任务配置
  11. win10开始菜单添加磁贴_IT之家学院:Win10 自定义开始菜单磁贴背景颜色及图标...
  12. 【源码系列】MyBatis原理源码
  13. Python每日一练(23)-基于百度 AI 识别抓取的表情包
  14. 大数据项目实战——基于某招聘网站进行数据采集及数据分析(六)
  15. .NET Core、DNX、DNU、DNVM、MVC6学习资料
  16. HttpClient 同时支持发送http及htpps请求
  17. 计算机网络笔记(王道考研) 第三章:数据链路层
  18. 深入剖析eMule 【for_wind】
  19. 哔哩哔哩 BV、AV互转 Java版
  20. 执行时遇到 For apos;context.set_contextapos;, package type xxx support apos;devic

热门文章

  1. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...
  2. git连接到github(SSH无密码登陆)
  3. apigee 安装_APIGEE – API网关简介
  4. cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?
  5. Java 9:Process API的增强
  6. wso2 安装_WSO2注册表安装简介
  7. javadocs_不会吸引人的JavaDocs源样本
  8. 基于按位与的 就散策略_比较散列策略
  9. eclipse m2e配置_使用此首选项可加快Eclipse m2e配置
  10. java 性能调优_Java性能调优调查结果(第三部分)