参数化测试 junit_使用JUnitParams进行参数化的JUnit测试

参数化测试 junit

参数化的单元测试用于在不同条件下测试相同的代码。 借助参数化的单元测试,我们可以建立一种测试方法,该方法从某个数据源中检索数据。 该数据源可以是测试数据对象,外部文件甚至数据库的集合。 一般的想法是使使用相同的单元测试方法测试不同的条件变得容易,这将限制我们需要编写的源代码并使测试代码更健壮。 我们可以将这些测试称为数据驱动的单元测试。 junit-logo

在JUnit中实现数据驱动的单元测试的最佳方法是使用JUnit的自定义运行程序- Parameterized或JUnitParams的 JUnitParamsRunner 。 使用JUnit的方法可能在许多情况下都可以使用,但后者似乎更易于使用且功能更强大。

基本例子

在我们的例子中,一个扑克骰子,我们需要计算满屋的分数。 就像纸牌扑克一样,“满座”是一副掷骰子,您同时拥有3个和一对。 为了简单起见,分数是一卷中所有骰子的总和。 因此,让我们看一下代码:

class FullHouse implements Scoreable {@Overridepublic Score getScore(Collection dice) {Score pairScore = Scorables.pair().getScore(dice);Score threeOfAKindScore = Scorables.threeOfAKind().getScore(pairScore.getReminder());if (bothAreGreaterThanZero(pairScore.getValue(), threeOfAKindScore.getValue())) {return new Score(pairScore.getValue() + threeOfAKindScore.getValue()); // no reminder}return new Score(0, dice);}private boolean bothAreGreaterThanZero(int value1, int value2) {return value1 > 0 && value2 > 0;}
}

我想确保该掷骰正确得分(当然我已经对Pair和ThreeOfAKind进行了单元测试)。 因此,我想测试以下条件:

  • 分数是11:1、1、3、3、3
  • 2、2、2、1、1的得分是8
  • 分数是0代表:2、3、4、1、1
  • 分数是25,表示:5、5、5、5、5

让我们研究为该方法编写数据驱动的测试的两种可能方法。 首先, JUnit的参数化

@RunWith(Parameterized.class)
public class FullHouseTest {private Collection rolled;private int score;public FullHouseTest(Collection rolled, int score) {this.rolled = rolled;this.score = score;}@Testpublic void fullHouse() {assertThat(new FullHouse().getScore(rolled).getValue()).isEqualTo(score);}@Parameterized.Parameterspublic static Iterable data() {return Arrays.asList(new Object[][]{{roll(1, 1, 3, 3, 3), score(11)},{roll(2, 2, 2, 1, 1), score(8)},{roll(2, 3, 4, 1, 1), score(0)},{roll(5, 5, 5, 5, 5), score(25)}});}private static int score(int score) {return score;}
}

另一个是JUnitParams

@RunWith(JUnitParamsRunner.class)
public class FullHouseTest {@Test@Parameterspublic void fullHouse(Collection rolled, int score) {assertThat(new FullHouse().getScore(rolled).getValue()).isEqualTo(score);}public Object[] parametersForFullHouse() {return $($(roll(1, 1, 3, 3, 3), score(11)),$(roll(2, 2, 2, 1, 1), score(8)),$(roll(2, 3, 4, 1, 1), score(0)),$(roll(5, 5, 5, 5, 5), score(25)));}private static int score(int score) {return score;}
}

乍一看,两者看起来非常相似。 没错 那么JUnit Parameterized (1)和JUnitParams(2)之间有什么区别? 最重要的一种是传递参数的方法,因此实际上是解决方案的体系结构。 在(1)中,参数在构造函数中传递,而在(2)中,参数直接传递到测试方法。 我应该在乎吗? 是。 原因之一是,在(2)中,我们可以有多个参数化测试方法,每种方法的数据都不同,如以下示例所示:

@RunWith(JUnitParamsRunner.class)
public class NumberOfAKindTest {@Test@Parameterspublic void pair(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(2);doTest(rolled, expected, score, sut);}@Test@Parameterspublic void threeOfAKind(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(3);doTest(rolled, expected, score, sut);}public Object[] parametersForPair() {return $($(roll(1, 1, 1, 2, 3), hand(1, 1), score(2)),$(roll(2, 1, 1, 1, 1), hand(1, 1), score(2)),$(roll(2, 3, 4, 1, 1), hand(1, 1), score(2)),$(roll(2, 3, 5, 5, 5), hand(5, 5), score(10)),$(roll(2, 1, 5, 4, 3), null, score(0)));}public Object[] parametersForThreeOfAKind() {return $($(roll(1, 1, 1, 2, 3), hand(1, 1, 1), score(3)),$(roll(2, 1, 1, 1, 3), hand(1, 1, 1), score(3)),$(roll(2, 3, 1, 1, 1), hand(1, 1, 1), score(3)),$(roll(2, 3, 5, 5, 5), hand(5, 5, 5), score(15)),$(roll(2, 5, 5, 5, 6), hand(5, 5, 5), score(15)),$(roll(2, 2, 5, 5, 3), null, score(0)));}private static int[] hand(int... dice) {return dice;}private static int score(int score) {return score;}}

在更简单的示例中,可以通过值方法直接在@Parameters批注中将参数定义为String数组。 我们还可以将数据提取到一个外部类中,并使我们的测试更加清晰易读。 对NumberOfAKind的完整测试如下:

@RunWith(JUnitParamsRunner.class)
public class NumberOfAKindTest {@Test@Parameters(source = NumberOfAKindProvider.class, method = "providePair")public void pair(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(2);doTest(rolled, expected, score, sut);}@Test@Parameters(source = NumberOfAKindProvider.class, method = "provideThreeOfAKind")public void threeOfAKind(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(3);doTest(rolled, expected, score, sut);}@Test@Parameters(source = NumberOfAKindProvider.class, method = "provideFourOfAKind")public void fourOfAKind(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(4);doTest(rolled, expected, score, sut);}@Test@Parameters(source = NumberOfAKindProvider.class, method = "provideFiveOfAKind")public void fiveOfAKind(Collection rolled, int[] expected, int score) {NumberOfAKind sut = new NumberOfAKind(5);doTest(rolled, expected, score, sut);}private void doTest(Collection rolled, int[] expected, int score, NumberOfAKind sut) {Collection consecutiveDice = sut.getConsecutiveDice(rolled);assertDiceContainsValues(consecutiveDice, expected);assertThat(sut.getScore(rolled).getValue()).isEqualTo(score);}private void assertDiceContainsValues(Collection dice, int[] expected) {Collection values = toInts(dice);if (expected == null) {assertThat(values).isEmpty();return;}for (int i = 0; i < expected.length; i++) {assertThat(values).hasSize(expected.length).contains(expected[i]);}}private Collection toInts(Collection dice) {return Collections2.transform(dice, new Function() {@Overridepublic Integer apply(Dice input) {return input.getValue();}});}}

每个方法都指定提供程序类和提供程序的方法名称。 查看以下提供者:

public class NumberOfAKindProvider {public static Object[] providePair() {return $($(roll(1, 1, 1, 2, 3), hand(1, 1), score(2)),$(roll(2, 1, 1, 1, 1), hand(1, 1), score(2)),$(roll(2, 3, 4, 1, 1), hand(1, 1), score(2)),$(roll(2, 3, 5, 5, 5), hand(5, 5), score(10)),$(roll(2, 1, 5, 4, 3), null, score(0)));}public static Object[] provideThreeOfAKind() {return $($(roll(1, 1, 1, 2, 3), hand(1, 1, 1), score(3)),$(roll(2, 1, 1, 1, 3), hand(1, 1, 1), score(3)),$(roll(2, 3, 1, 1, 1), hand(1, 1, 1), score(3)),$(roll(2, 3, 5, 5, 5), hand(5, 5, 5), score(15)),$(roll(2, 5, 5, 5, 6), hand(5, 5, 5), score(15)),$(roll(2, 2, 5, 5, 3), null, score(0)));}public static Object[] provideFourOfAKind() {return $($(roll(1, 1, 1, 1, 3), hand(1, 1, 1, 1), score(4)),$(roll(2, 1, 1, 1, 1), hand(1, 1, 1, 1), score(4)),$(roll(2, 5, 5, 5, 5), hand(5, 5, 5, 5), score(20)),$(roll(2, 3, 4, 5, 5), null, score(0)));}public static Object[] provideFiveOfAKind() {return $($(roll(1, 1, 1, 1, 1), hand(1, 1, 1, 1, 1), score(5)),$(roll(6, 6, 6, 6, 6), hand(6, 6, 6, 6, 6), score(30)),$(roll(6, 6, 6, 6), null, score(0)),$(roll(2, 3, 4, 6, 6), null, score(0)));}private static int[] hand(int... dice) {return dice;}private static int score(int score) {return score;}
}

摘要

对我而言, JUnitParams是编写良好的数据驱动的单元测试的更好的解决方案。 但是上面介绍的并不是库必须提供给开发人员的所有内容。 还有更多功能。 参数可以作为CSV字符串传递,我们可以混合参数化测试和非参数化测试,仅举几例。

请访问该项目的网站以了解有关此库的更多信息: https : //code.google.com/p/junitparams

参考:来自Codeleak.pl博客的JCG合作伙伴 Rafal Borowiec的JUnitParams进行的 参数化JUnit测试 。

翻译自: https://www.javacodegeeks.com/2013/12/parameterized-junit-tests-with-junitparams.html

参数化测试 junit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】电大中专混凝土结构作业 题库

1.下列测试方法中不是混凝土内部空洞和缺陷的检测方法的是() A.钻孔法 B.盲孔法 C.对测法 D.斜测法 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2.选择测量仪器时&#xff0c;最大被测值一般不宜大于选用仪器最大量程的() A.70% B.80% C.90% D. 100% 正确 正确答…

计算机二级office学习之Excel操作题考点整理

考点1 页面设置 页面布局-页边距、纸张方向、纸张大小、打印区域、页面背景、打印标题、页眉页脚、缩印 页面布局-选中打印区域-打印标题-顶端标题行-选中第二行 考点2 获取外部数据和删除重复值 1、获取外部数据 1.1 自网页 右击文件-打开方式为IE浏览器&#xff08;360可…

【渝粤教育】电大中专职业应用写作_1作业 题库

1.每个大学生最应该具备的写作能力是&#xff08;&#xff09; A.诗歌创作 B.小说创作 C.应用文写作 D.散文创作 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.下面说法正确的是&#xff08;&#xff09; A.应用文可以发挥依据和凭证的作用 B.应用文不能规范人们…

Jsoup V的幕后秘密:优化的技巧和窍门

我们做对了&#xff0c;现在是时候更快地做事了。 我们会牢记Donald Knuth的警告&#xff1a;“大约97&#xff05;的时间&#xff0c;我们应该忘记效率低下&#xff1a;过早的优化是万恶之源”。 根据Jonathan Hedley的介绍&#xff0c;他使用YourKit Java Profiler来测量内存…

【渝粤教育】广东开放大学 会议运行管理 形成性考核 (38)

选择题 题目&#xff1a; 会议的含义是 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 报告、发言、讲话、辩论等口头交流的方式是与会人员传递信息、交流思想、表达意志和阐明立场的主要手段。这是指的会议的什么性质 选择一项&#xff1a; 答案&#xff1…

计算机二级选择题复习整理(公共基础部分)

主要列个人不太熟悉或较为重要的点&#xff0c;不求全。 一、计算机基础 1、计算机最早应用领域是数值计算 2、冯诺依曼型体系计算机引进概念&#xff1a;二进制、存储程序 3、CAD&#xff1a;设计&#xff1b;CAM&#xff1a;制造&#xff1b;CAI&#xff1a;教育&#xff1…

【渝粤教育】广东开放大学 动画概论 形成性考核 (44)

选择题 题目&#xff1a;“动画”这个词最早是哪国人提出的 答案&#xff1a;看左侧 题目&#xff1a;被誉为“动画的鼻祖”的是 答案&#xff1a;看左侧 题目&#xff1a;被公认为世界上第一部动画影片的是 答案&#xff1a;看左侧 题目&#xff1a;动画片是电影的一种特殊类…

【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)

选择题 题目&#xff1a;SQL语句中的条件用以下哪一项来表达&#xff08; &#xff09; 题目&#xff1a;“Create Unique Index AAA On 学生表&#xff08;学号&#xff09;”将在学生表上创建名为I_xsb的&#xff08; &#xff09;。 题目&#xff1a;&#xff08; &#xff…

移动通信学习笔记03_蜂窝原理

教学大纲&#xff1a;组网技术 基本内容&#xff1a;典型的多址接入技术&#xff1b;话务量与呼损率的计算&#xff1b;蜂窝的概念、频率复用原则和区群的概念&#xff1b;信道的分配策略和分配原则&#xff1b;蜂窝系统的基本网络结构和各部分的功能&#xff1b;切换和漫游&am…

【渝粤教育】广东开放大学 影视艺术概论 形成性考核 (52)

选择题 题目&#xff1a; 电影被称为 。 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 《淘金记》是 的作品。 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#xff1a; 《母与法》是由 拍摄的。 选择一项&#xff1a; 答案&#xf…

java rmi 使用管道_使用Java RMI时要记住的两件事

java rmi 使用管道这是一篇简短的博客文章&#xff0c;介绍使用Java RMI时应注意的两个常见陷阱。 设置java.rmi.server.hostname 如果您感到陌生&#xff0c;Connection拒绝托管&#xff1a; RMI客户端上的错误消息&#xff0c;并且您确定连接应该正常工作&#xff08;您仔细…

【渝粤教育】广东开放大学 文化产业项目案例分析 形成性考核 (51)

选择题 题目&#xff1a;《武林外传》发生在虚拟的唐代。 答案&#xff1a;看左侧 题目&#xff1a;《武林外传》中李大嘴是一个厨师。 答案&#xff1a;看左侧 题目&#xff1a;《疯狂动物城》是一部动画片。 答案&#xff1a;看左侧 题目&#xff1a;影片的整体框架是“小镇少…

01_2_数字基带传输及其频谱特性

一、数字基带信号的表示 g(t)g(t)g(t)是一个基本的脉冲&#xff0c;有不同形状&#xff1b;ana_nan​从信源出来的信息码序列&#xff0c;只有电平特性。 二、功率谱密度的推导过程 ① 广义平稳随机信号的自相关函数和功率谱密度之间互为傅立叶变换关系 ② 计算基带信号的自相…

【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (53)

选择题 题目&#xff1a; 根据《标准化法》规定&#xff0c;企业生产的产品没有国家标准、行业标准和地方标准的&#xff0c;应当制定相应的企业标准作为( )。 答案&#xff1a;看左侧 题目&#xff1a; 现阶段常用的标准的载体包括( )。 答案&#xff1a;看左侧 题目&#x…

Linux环境变量剖析

一、什么是环境变量 概念&#xff1a;环境变量&#xff08;environment variables&#xff09;一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;是在操作系统中一个具有特定名字的对象&#xff0c;它包含了一个或多个应用程序所将使用到的信息&#xff0c…

APIGEE:用于API代理的CI / CD管道

在本文中&#xff0c;我们将看到如何为APIGEE API代理创建CI / CD管道。 我已经参考了APIGEE社区上同一主题的几篇文章。 这些给了一些关于如何为API代理设置CI / CD管道的想法。 这是我用来设置CI / CD的工具。 詹金斯 节点 蜂胶 新人 APIGEE管理API 确保已创建APIGEE边…

【渝粤教育】广东开放大学 知识产权法 形成性考核 (34)

选择题 题目&#xff1a;作品的独创性要求作品系作者独立完成&#xff0c;不是抄袭而来。 题目&#xff1a;下列关于发行权的表述&#xff0c;不正确的是&#xff08; &#xff09; 题目&#xff1a;下列哪一情形可以授予专利&#xff1f;&#xff08; &#xff09; 题目&#…

01_3基带传输的常用码型和码间串扰

第十七讲 基带传输的常用码型和码间串扰 第一节 基带传输的常用码型 一、数字基带信号的编码规则 基带传输对信号的要求&#xff08;即独立又有联系&#xff09; 对传输码型的要求&#xff1a;原始消息码必须编成适合于信道传输用的码型&#xff08;码型的选择&#xff09; …

【渝粤教育】广东开放大学 网络市场调查与预测 形成性考核 (23)

选择题 题目&#xff1a;&#xff08;&#xff09;是利用互联网发掘和了解顾客需求、市场机会、竞争对手、行业潮流、分销渠道以及战略合作伙伴等方面的情况。 题目&#xff1a;市场调查首先要解决的问题是&#xff08; &#xff09;。 题目&#xff1a;为了在市场调查方案实施…

移动通信考前预习_第1章_无线通信系统概述

下周考试&#xff0c;开始预习。 第一章为概念&#xff0c;直接copyPPT。 第1章 无线通信系统概述 一、移动通信发展 1、第一代 80年代——模拟通信时代&#xff08;1G&#xff09; 典型系统&#xff1a;AMPS系统&#xff08;先进移动电话系统&#xff09;、TACS系统&#…