Junit使用教程(三)

四、实例总结

1. 参数化测试

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

[java] view plaincopy

  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. 打包测试

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

[java] view plaincopy

  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. 异常测试

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

第一种:

[java] view plaincopy

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

第二种:

[java] view plaincopy

  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. }

第三种:

[java] view plaincopy

  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. 限时测试

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

第一种:

[java] view plaincopy

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

第二种:

[java] view plaincopy

  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的教程总结性文章已介绍完了。通过系统总结也进一步加深了对Junit的认识,希望也能同样帮助到对Junit还不太理解的朋友。如果大家还有什么好的建议和用法,很欢迎能提出来一起交流。

时间: 2024-08-14 21:26:58

Junit使用教程(三)的相关文章

Junit 4 Tutorials(Junit 4 教程) 三、Junit4 断言方法

Junit 4 断言方法允许检查测试方法的期望结果值和真实返回值.Junit的org.junit.Assert类提供了各种断言方法来写junit测试.这些方法被用来检查方法的真实结果值和期望值.下列一些有用的断言方法列表: Junit 4 Assert Methods Method Description assertNull(java.lang.Object object) 检查对象是否为空 assertNotNull(java.lang.Object object) 检查对象是否不为空 as

Junit 4 Tutorials(Junit 4 教程) 一、Junit简介及Junit Eclipse 教程

Junit 测试框架简介 测试框架是最流行的Java单元测试框架.Junit被用来开发对Java类的单元测试.它就是一个类包,提供了各种方法来测试Java类中的方法(method). Junit 4 特性 简单的注解,提供书写Junit测试的基本特性 断言方法(Assert Methods)比较测试的方法执行结果值和期望值 @Ignore 注解,忽略测试方法或者测试类的执行 期望异常测试 超时测试 , 测试方法的执行时间 测试组件,一起运行一些测试类 参数化测试, 以不同的输入参数值测试方法 J

JUnit单元测试教程(翻译自Java Code Geeks)

JUnit单元测试教程--终极指南 JUnit单元测试教程终极指南 说明 单元测试简介 1 什么是单元测试 2 测试覆盖 3 Java中的单元测试 JUnit简介 1 使用Eclipse实现简单JUnit测试例子 使用Eclipse实现完整的JUnit例子 1 创建工程 2 创建要被测试的Java类 3 创建并运行JUnit测试用例 4 使用Ignore注解 5 创建测试套件suite tests 6 创建参数化测试parameterized tests 7 规则Rules 8 策略Catego

微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台

原文:微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 公众号第三方平台的开放,是为了让公众号运营者,在面向垂直行业需求时,可以一键登录授权给第三方的公众号运营平台,通过第三方开发者提供的公众号第三

struts2 官方系列教程三:使用struts2 标签 tag

避免被爬,先贴上本帖地址:struts2 官方系列教程一:使用struts2 标签 tag http://www.cnblogs.com/linghaoxinpian/p/6901316.html 本教材假定你已完成了HelloWorld项目,你可以在 struts2 官方系列教程三:使用struts2 标签 tag 下载本章节的代码 在上一节教程中,我们在index.jsp中使用 url tag 创建了一个超链接hello.action 这节我们将探索struts2中其它tags Web应用程

Junit 4 Tutorials(Junit 4 教程)

本教程是比较全面的.较新的Junit 4 实用教程,译自:http://www.javatutorials.co.in/junit-4/,希望对大家有所帮助! 以下是本教程的内容设置,读者可以点击以下标题进行阅读: Junit测试框架介绍 Junit 测试框架是最流行的Java单元测试框架.Junit被用来开发Java类的单元测试. Junit Eclipse教程 介绍eclipse IDE 中junit的相关特性及其使用方法.在eclipse IDE中书写和运行单元测试代码的样例. Junit

Junit 4 Tutorials(Junit 4 教程) 四、Junit4 参数化测试

Junit 4 参数化测试 允许通过变化范围的参数值来测试方法.参数擦测试可以通过以下简单的步骤实现: 对测试类添加注解 @RunWith(Parameterized.class) 将需要使用变化范围参数值测试的参数定义为私有变量 使用上一步骤声明的私有变量作为入参,创建构造函数 .创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回. 使用定义的私有变量定义测试方法 Junit 4 参数化测试样例 EvenNumberChecker.java 校验输

Swift中文教程(三)--流程控制

原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花括号包住这个循环体是必须的: 1 let individualScores = [75, 43, 103, 87, 12] 2 var teamScore = 0 3 for score in individualScores { 4 if score > 50 { 5 teamScore += 3

Struts2.x教程(三) Struts2拦截器

一.Struts2拦截器介绍 Struts2拦截器是使用AOP实现的,主要是针对action对象进行拦截,可以在访问action的某个方法.字段之前或之后实施拦截. 可以为action配置多个拦截器,Struts2会将这一组拦截器按照一定顺序组织成一个拦截器栈.action可以直接引用某个拦截器栈来实现配置多个拦截器的目的. 对于继承struts_default的package中的action,都会默认引用name=defaultStack的拦截器栈(在struts_default中定义了Str