实例总结

1. 参数化测试

有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个问题。参数化测试就好比把一个“输入值,期望值”的集合传入给测试方法,达到一次性测试的目的。

  1. package test;
  2. import static org.junit.Assert.*;
  3. import java.util.Arrays;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.junit.runners.Parameterized;
  7. import org.junit.runners.Parameterized.Parameters;
  8. @RunWith(Parameterized.class)
  9. public class FibonacciTest {
  10. @Parameters(name = "{index}: fib({0})={1}")
  11. public static Iterable<Object[]> data() {
  12. return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
  13. { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
  14. }
  15. private int input;
  16. private int expected;
  17. public FibonacciTest(int input, int expected) {
  18. this.input = input;
  19. this.expected = expected;
  20. }
  21. @Test
  22. public void test() {
  23. assertEquals(expected, Fibonacci.compute(input));
  24. }
  25. }
  26. class Fibonacci {
  27. public static int compute(int input) {
  28. int result;
  29. switch (input) {
  30. case 0:
  31. result = 0;
  32. break;
  33. case 1:
  34. case 2:
  35. result = 1;
  36. break;
  37. case 3:
  38. result = 2;
  39. break;
  40. case 4:
  41. result = 3;
  42. break;
  43. case 5:
  44. result = 5;
  45. break;
  46. case 6:
  47. result = 8;
  48. break;
  49. default:
  50. result = 0;
  51. }
  52. return result;
  53. }
  54. }

@Parameters注解参数name,实际是测试方法名称。由于一个test()方法就完成了所有测试,那假如某一组测试数据有问题,那在Junit的结果页面里该如何呈现?因此采用name实际上就是区分每个测试数据的测试方法名。如下图:

2. 打包测试

同样,如果一个项目中有很多个测试用例,如果一个个测试也很麻烦,因此打包测试就是一次性测试完成包中含有的所有测试用例。

  1. package test;
  2. import org.junit.runner.RunWith;
  3. import org.junit.runners.Suite;
  4. @RunWith(Suite.class)
  5. @Suite.SuiteClasses({ AssertTests.class, FibonacciTest.class, JDemoTest.class })
  6. public class AllCaseTest {
  7. }

这个功能也需要使用一个特殊的Runner ,需要向@RunWith注解传递一个参数Suite.class 。同时,我们还需要另外一个注解@Suite.SuiteClasses,来表明这个类是一个打包测试类。并将需要打包的类作为参数传递给该注解就可以了。至于AllCaseTest随便起一个类名,内容为空既可。运行AllCaseTest类即可完成打包测试

3. 异常测试

异常测试与普通断言测试不同,共有三种方法,其中最为灵活的是第三种,可以与断言结合使用

第一种:

  1. @Test(expected= IndexOutOfBoundsException.class)
  2. public void empty() {
  3. new ArrayList<Object>().get(0);
  4. }

第二种:

  1. @Test
  2. public void testExceptionMessage() {
  3. try {
  4. new ArrayList<Object>().get(0);
  5. fail("Expected an IndexOutOfBoundsException to be thrown");
  6. } catch (IndexOutOfBoundsException anIndexOutOfBoundsException) {
  7. assertThat(anIndexOutOfBoundsException.getMessage(), is("Index: 0, Size: 0"));
  8. }
  9. }

第三种:

  1. @Rule
  2. public ExpectedException thrown = ExpectedException.none();
  3. @Test
  4. public void shouldTestExceptionMessage() throws IndexOutOfBoundsException {
  5. List<Object> list = new ArrayList<Object>();
  6. thrown.expect(IndexOutOfBoundsException.class);
  7. thrown.expectMessage("Index: 0, Size: 0");
  8. list.get(0);
  9. Assert.assertEquals(1, list.get(0));
  10. }

在上述几种方法中,无论是expected还是expect都表示期望抛出的异常,假如某一方法,当参数为某一值时会抛出异常,那么使用第一种方法就必须为该参数单独写一个测试方法来测试异常,而无法与其他参数值一同写在一个测试方法里,所以显得累赘。第二种方法虽然解决这个问题,但是写法不仅繁琐也不利于理解。而第三种犯法,不仅能动态更改期望抛出的异常,与断言语句结合的也非常好,因此推荐使用该方法来测试异常。

4. 限时测试

有时为了防止出现死循环或者方法执行过长(或检查方法效率),而需要使用到限时测试。顾名思义,就是超出设定时间即视为测试失败。共有两种写法。

第一种:

  1. @Test(timeout=1000)
  2. public void testWithTimeout() {
  3. ...
  4. }

第二种:

  1. public class HasGlobalTimeout {
  2. public static String log;
  3. @Rule
  4. public Timeout globalTimeout = new Timeout(10000); // 10 seconds max per method tested
  5. @Test
  6. public void testInfiniteLoop1() {
  7. log += "ran1";
  8. for (;;) {
  9. }
  10. }
  11. @Test
  12. public void testInfiniteLoop2() {
  13. log += "ran2";
  14. for (;;) {
  15. }
  16. }
  17. }

其中,第二种方法与异常测试的第三种方法的写法类似。也是推荐的写法。

Junit使用第二弹的更多相关文章

  1. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  2. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  3. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)

    继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...

  4. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

  5. LCA问题第二弹

    LCA问题第二弹 上次用二分的方法给大家分享了对 LCA 问题的处理,各位应该还能回忆起来上次的方法是由子节点向根节点(自下而上)的处理,平时我们遇到的很多问题都是正向思维处理困难而逆向思维处理比较容 ...

  6. 线段树+RMQ问题第二弹

    线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...

  7. Hadoop基础-MapReduce的工作原理第二弹

    Hadoop基础-MapReduce的工作原理第二弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Split(切片)  1>.MapReduce处理的单位(切片) 想必 ...

  8. 『PyTorch』第二弹重置_Tensor对象

    『PyTorch』第二弹_张量 Tensor基础操作 简单的初始化 import torch as t Tensor基础操作 # 构建张量空间,不初始化 x = t.Tensor(5,3) x -2. ...

  9. Java基础-程序流程控制第二弹(循环结构)

    Java基础-程序流程控制第二弹(循环结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 流程控制有三种基本结构:顺序结构,选择结构和循环结构.一个脚本就是顺序结构执行的,选择结 ...

随机推荐

  1. [jzoj 5775]【NOIP2008模拟】农夫约的假期 (前缀和+递推)

    传送门 Description 在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为"魔音"······ 农夫约也有自己的假期呀!他要 ...

  2. [IOI2007]矿工配餐

    状态是f[i][a][b][c][d]表示第i个餐车,1号矿洞最近两顿是a,b,2号矿洞最近两顿是c,d. 给的空间是16MB,滚动数组滚动了第一维就行了 (给的变量是char是因为这个不超过256, ...

  3. C#学习笔记_04_流程控制

    04_流程控制 程序的执行结构: 顺序结构 分支结构 循环结构 可以通过某些特定的控制语句来控制代码的执行结构 分支流程控制 if else 基本语法 可以只有if没有else,但是不能没有if只有e ...

  4. d正则表达式相关

    控件看Delphi正则表达式使用方法(TPerlRegEx)的介绍: 使用正则表达式获取Sql查询语句各项(表名.字段.条件.排序) 希望在线测试正则表达式  在线正则表达式测试 有许多常规表达式 希 ...

  5. 【hihocoder 1473】小Ho的强迫症

    [题目链接]:http://hihocoder.com/problemset/problem/1473 [题意] [题解] 假定初始为在在0位置(相对它左边那条线); 则考虑; 多少步之后,人又能这到 ...

  6. linux 中使用iptables 防止ddocs及cc攻击配置 。

    #防止SYN攻击,轻量级预防 iptables -N syn-floodiptables -A INPUT -p tcp –syn -j syn-floodiptables -I syn-flood ...

  7. javascript的函数、创建对象、封装、属性和方法、继承

    转自原文javascript的函数.创建对象.封装.属性和方法.继承 一,function 从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 如:functi ...

  8. uva 704

    自己之前的不见了.. 这题是双向广搜即可过.. // Colour Hash (色彩缤纷游戏) // PC/UVa IDs: 110807/704, Popularity: B, Success ra ...

  9. [React] Update Application State with React Apollo ApolloConsumer Component

    In this lesson I refactor some code that utilizes the Mutation component to update client-side cache ...

  10. MEAN框架介绍

    近期在Angular社区的原型开发人员间.一种全Javascript的开发架构MEAN正突然流行起来.其首字母分别代表的是:(M)ongoDB--NoSQL的文档数据库,使用JSON风格来存储数据,甚 ...