原文地址http://blog.csdn.net/yqj2065/article/details/39967065

参数化测试

正如数组替代int a0,a1,a2一样,测试加法时assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要测试100个怎么办。

所以,有了参数化测试,使用一个Collection收集所有的数据——加法时每一次测试需要的几个数据构成一组,n个组构成Collection。

然后按照JUnit的用法要求,写出单元测试类。(偷懒一下,不想写被测试的业务类X了。下面的例子中假设要测试的方法是,判断一个数是否奇数。)

  1. package myTest.param;
  2. import java.util.Arrays;
  3. import java.util.Collection;
  4. import org.junit.Test;
  5. import org.junit.runners.Parameterized;
  6. import org.junit.runners.Parameterized.Parameters;
  7. import org.junit.runner.RunWith;
  8. import static org.junit.Assert.assertEquals;
  9. @RunWith(Parameterized.class)//1.必须
  10. public class ParametTestUnit {
  11. private int input;
  12. private boolean expected;//expected result
  13. /**
  14. * 2.public 构造器赋值一组测试数据
  15. */
  16. public ParametTestUnit(int input,boolean expected ) {
  17. this.input = input;
  18. this.expected = expected;
  19. }
  20. /**
  21. * 3.由@Parameterized.Parameters修饰一个
  22. * public static Collection xxx()
  23. */
  24. @Parameterized.Parameters
  25. public static Collection data() {
  26. return Arrays.asList(new Object[][] {
  27. { 1, true },
  28. { 3, true },//
  29. { 6, false },
  30. { 11, true },
  31. { 22, false },
  32. { 23, true }
  33. });
  34. }
  35. /**
  36. * 4.JUnit循环地使用各组数据
  37. */
  38. @Test
  39. public void testOdd() {
  40. System.out.println("Parameterized Number is : " + input);
  41. assertEquals(expected, input%2!=0);
  42. }
  43. }

现在这个单元测试类编写完成,但是在BlueJ中不能够直接运行它(不支持?),自己写一个Main好了。

  1. package myTest.param;
  2. import org.junit.runner.JUnitCore;
  3. import org.junit.runner.Result;
  4. import org.junit.runner.notification.Failure;
  5. public class Main {
  6. public static void go() {
  7. Result result = JUnitCore.runClasses(ParametTestUnit.class);
  8. for (Failure failure : result.getFailures()) {
  9. System.out.println(failure.toString());
  10. }
  11. System.out.println(result.wasSuccessful());
  12. }
  13. }

运行结果:

Parameterized Number is : 1
Parameterized Number is : 3
Parameterized Number is : 6
Parameterized Number is : 11
Parameterized Number is : 22
Parameterized Number is : 23
true

现在,将某个数据修改一下,如{ 11, true }改成{ 10, true },运行结果:
Parameterized Number is : 1
Parameterized Number is : 3
Parameterized Number is : 6
Parameterized Number is : 10
Parameterized Number is : 22
Parameterized Number is : 23
testOdd[3](myTest.param.ParametTestUnit): expected:<true> but was:<false>
false

表示第3个数据(基于0)有问题。

成组测试

有很多单元测试类需要测试,将它们组成一个Suite,大家一起测试。例如新写了两个单元测试类:

  1. package myTest.param;
  2. import static org.junit.Assert.assertEquals;
  3. public class AddUnit1 {
  4. @org.junit.Test
  5. public void testAdd() {
  6. System.out.println("Inside AddUnit1");
  7. assertEquals(3, 1+2);
  8. }
  9. }
  10. package myTest.param;
  11. import static org.hamcrest.CoreMatchers.*;
  12. import static org.junit.Assert.*;
  13. public class AddUnit2 {
  14. @org.junit.Test
  15. public void testSth() {
  16. System.out.println("Inside AddUnit2");
  17. assertThat("Zero is one", 0, is(not(1))); // passes
  18. assertThat("Zero is one", 0, is(1)); //fail
  19. }
  20. }

将它们组成一个Suite,需要写捆绑代码,清晰起见,单独用一个类。

  1. package myTest.param;
  2. import org.junit.runner.RunWith;
  3. import org.junit.runners.Suite;
  4. @RunWith(Suite.class)
  5. @Suite.SuiteClasses({
  6. AddUnit1.class,
  7. AddUnit2.class,
  8. //ParametTestUnit.class
  9. })
  10. public class SuiteUnit {}

还是用上面的Main,修改为runClasses(SuiteUnit.class); 运行结果:
Inside AddUnit1.testAdd()
Inside AddUnit2.testSth()
testSth(myTest.param.AddUnit2): Zero is one
Expected: is <1>
     got: <0>

false

可以把对ParametTestUnit.class的测试也加进来。运行结果:

Inside AddUnit1.testAdd()
Inside AddUnit2.testSth()
Parameterized Number is : 1
Parameterized Number is : 3
Parameterized Number is : 6
Parameterized Number is : 10
Parameterized Number is : 22
Parameterized Number is : 23
testSth(myTest.param.AddUnit2): Zero is one
Expected: is <1>
     got: <0>

testOdd[3](myTest.param.ParametTestUnit): expected:<true> but was:<false>
false

JUnit之参数化测试、套件/成组测试的使用的更多相关文章

  1. junit测试套件

    在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的.为了解决这个问题,JUnit 提供了一种批量运行测试类的方法, ...

  2. unittest测试套件

    测试套件就是测试集,测试集是测试用例的集合. a.按用例顺序执行(addtest) 当addtest与unittest的测试规则冲突时,仍然按照ASCII码的顺序执行. import unittest ...

  3. Python+Selenium笔记(四):unittest的Test Suite(测试套件)

    (一) Test Suite测试套件 一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行. 应用unittest的TestSui ...

  4. Robot Framework(四)创建测试套件

    2.3.1测试用例文件 Robot Framework测试用例是使用测试用例文件中的测试用例表创建的.这样的文件会自动从它包含的所有测试用例中创建一个测试套件.可以有多少测试用例没有上限,但建议少于1 ...

  5. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

    今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...

  6. junit 测试套件Suite

    junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...

  7. JUnit4中的测试套件

    测试套件 JUnit3.8中,用测试套件同时运行多个测试类(http://www.cnblogs.com/mengdd/archive/2013/04/07/3006265.html). 在JUnit ...

  8. 安卓CTS官方文档之兼容性测试套件简介-attach

    官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite  兼容性测试套件 H ...

  9. 安卓CTS官方文档之兼容性测试套件简介

    官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite 兼容性测试套件 Ho ...

随机推荐

  1. sql one

    查询的话 子查询什么的都很正常 添加的话 尽量把东西都添加在一个表单里 这是源头 有个这个方便的源头 查询和删除都会方便很多 组建一个网站,不可避免的要进行调试,有些功能需要添加或者删除,对于后台来讲 ...

  2. 解决cookie跨域访问.2

    v一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入 ...

  3. epplus excel数据导出(数据量有点大的情况) Web和Client

    Asp.net MVC后台代码 public ActionResult Export() { OfficeOpenXml.ExcelPackage ep = new OfficeOpenXml.Exc ...

  4. Red Hat系统安装Redis

    环境 RHLinux-6.4-64-EN, 红帽6.4 64位,英文正式公布版 安装 安装非常easy,先下载redis的压缩包,下载地址见这里.然后复制到你的linux机器.接着运行以下的命令. 1 ...

  5. LoadRunner学习---脚本编写(4)(比较重要)

    今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了. Web用户Action 在VuGen中,脚本产生的默 ...

  6. kotlin gradle的修改

    Kotlin插件包括一个让我们配置Gradle的工具.但是我还是倾向于保持我对Gradle文件读写的控制权,否则它只会变得混乱而不会变得简单.不管怎么样,在使用自动工具之前知道它是怎么工作的是个不错的 ...

  7. Zabbix-3.0.3实现微信(WeChat)告警

    导读 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告 ...

  8. 技术宅之flappy bird 二逼鸟

    师雪坤和刘阳 风靡一时的虐心小游戏<Flappy Bird>,以玩法简单.难度超高著称,不过,最近这款让全世界玩家几欲怒摔手机的游戏,被两位中国技术宅设计的"玩鸟机器人" ...

  9. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  10. time-based DB

    这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...