Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Junit使用指南及作业规范

1,950 views

Published on

discribe the junit 。

Published in: Technology, Education
  • Be the first to comment

Junit使用指南及作业规范

  1. 1. 使用指南及作业规范 V1.0Keep the bar green keep the code clean! 作者:shaomeng95 BLOG:http://shaomeng95.javaeye.com/
  2. 2. Junit 使用指南及作业规范 目录1. JUNIT 总览 ................................................................................................................................... 3 1.1 简介 ....................................................................................................................................... 3 1.2 特性 ....................................................................................................................................... 3 1.3 适用对象 ............................................................................................................................... 32 JUNIT 使用 ................................................................................................................................... 3 2.1 JUNIT 3.X 使用 ......................................................................................................................... 3 2.1.1 下载与安装 ...................................................................................................................... 3 2.1.2 使用方法 .......................................................................................................................... 4 2.1.2.1 基本流程(我们一般都是这么写) ................................................................................... 4 2.1.2.2 重要概念和类(你必须了解的东西) ............................................................................... 5 2.1.2.3 JUNIT 固件的安装与拆除(测试方法启动和结束之前要做的).................................... 6 2.1.2.4 Eclipse 中使用 junit(有了开发工具对 junit 的支持后) ................................................. 8 2.2 JUNIT 4.X 使用 ....................................................................................................................... 12 2.2.1 下载与安装 .................................................................................................................... 12 2.2.2 使用方法 ........................................................................................................................ 13 2.2.2.1 与 3.x 版本的异同(看谁更简单) .................................................................................. 13 2.2.2.2 常用注解(体验 annotation 的简单便捷) ...................................................................... 13 2.2.2.3 4.x 新特性实战(实践出真知) ....................................................................................... 143 作业规范 ...................................................................................................................................... 214 附录 .............................................................................................................................................. 22 4.1 下版计划 ............................................................................................................................. 22 4.2 修订记录 ............................................................................................................................. 23 4.3 参考文献 ............................................................................................................................. 23Copyright © 2011 shaomeng95 版权所有 Page 2 of 23
  3. 3. Junit 使用指南及作业规范1. JUNIT 总览1.1 简介 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架。Junit测试是程序员测试,即所谓白盒测试。 项目主页:http://www.junit.org/ 下载地址:https://github.com/KentBeck/junit/downloads http://sourceforge.net/projects/junit/files/junit/ 目前主要版本有3.X和4.X,它们之间存在很大的差别,故本文档将分别介绍3.X和4.X.1.2 特性 JUnit 是一个开放源代码的 Java 测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系 xUnit 的一个实例(用于 java 语言)。它包括以下特性: 1、用于测试期望结果的断言(Assertion) 2、用于共享共同测试数据的测试工具 3、用于方便的组织和运行测试的测试套件 4、图形和文本的测试运行器1.3 适用对象 JUnit 可以用于程序开发人员或专业测试人员进行单元测试。2 JUNIT 使用 下面将分别基于 junit 3.8.1 和 junit 4.8.1 分别讲解 junit 的用法。2.1 JUNIT 3.X 使用2.1.1 下载与安装  下载 junit3.8.1 包  将压缩包中的 junit.jar 加入工程的 classpath 中Copyright © 2011 shaomeng95 版权所有 Page 3 of 23
  4. 4. Junit 使用指南及作业规范 至此,在工程中将可以使用 junit 编写测试代码了。2.1.2 使用方法2.1.2.1 基本流程(我们一般都是这么写) 使用 junit 进行测试,一般可以总结为如下 4 个步骤: 1) 写测试类并继承 TestCase 类; 2) 写测试方法 testXXXX(); 3) 写测试套件类将 test case 加入 test suite; 4) 运行 TestRunner 进行测试; 如下代码所示,演示了基本的测试流程: //①继承TestCase类 public class CalculatorTest extends TestCase { //②测试方法必须以 test 开头 public void testAdd() { int result = new CalculatorTest().add(1, 2); Assert.assertEquals(3, result); } //③将testcase加入testsuite public static Test suite(){ return new TestSuite(CalculatorTest.class); } //④使用TestRunner运行测试套件 public static void main(String[] args) {//junit提供了swing,awt,text三种测试运行器 junit.awtui.TestRunner.run(CalculatorTest.class); } Run as Java Application,显示如下结果:Copyright © 2011 shaomeng95 版权所有 Page 4 of 23
  5. 5. Junit 使用指南及作业规范 程序说明: 第③步中的 public static Test suite()为缺省的 TestSuite 入口,默认运行测试类 中的所有测试方法,故一般 suite()方法可以省略不写。 第④步中可以使用的运行器有三种分别为基于 AWT,SWING,TEXT 三种。2.1.2.2 重要概念和类(你必须了解的东西) TestCase(测试用例) 当一个类继承 junit 的 TestCase 类,即成为一个测试类,它以 testXXXX 的形 式包含测试方法(public void 修饰)。Copyright © 2011 shaomeng95 版权所有 Page 5 of 23
  6. 6. Junit 使用指南及作业规范 TestSuite(测试集合或测试套件) 一组测试,将相关的测试归入一组,将多个测试方法归入一个 test suite,例 如上例中的缺省 test suite 默认会扫描测试类中的所有测试方法并归入测试集 合。如果没有为 test case 写 test suite 的话,系统会默认为每个 test case 生成 一个 test suite。 TestRunner(测试运行器) 用于执行 TestSuite,继承抽象类 BaseTestRunner。可以使用 BaseTestRunner 的子类 junit.awtui.TestRunner、junit.swingui.TestRunner、junit.textui.TestRunner 来运行测试集合。 TestResult(测试结果) 用于包含测试中发生的错误,次数等。 Assert(断言) 用于检测条件是否成立,当条件成立则 Assert 方法通过,否则抛出异常。例 如 Assert.assertEquals(3, result);判断 result 是否跟期望的 3 相等,如果相等则 通过,否则测试失败。 主要有如下几个断言方法: 1.assertTrue/False(); 判断一个条件是 true 还是 false。 2.fail(); 失败,可以有消息,也可以没有消息。 3.assertEquals(); 判断是否相等,可以指定输出错误信息。 注意不同数据类型所使用的 assertEquals 方法参数有所不同。 4.assertNotNull/Null(); 判读一个对象是否非空。 5.assertSame/NotSame(); 判断两个对象是否指向同一个对象。 7.failNotSame/failNotEquals() 当不指向同一个内存地址或者不相等的时候,输出错误信息。 错误信息为指定的格式。2.1.2.3 JUNIT 固件的安装与拆除(测试方法启动和结束之前要做的) 回顾上面例子中的 testAdd 方法,我们看到为了得到测试目标类,我们必须 要 new CalculatorTest() , 如 果 要 再 写 一 个 测 试 方 法 , 仍 然 要 再 次 new CalculatorTest(),其实不需要这么麻烦的,Junit 已经为我们考虑到了,可以Copyright © 2011 shaomeng95 版权所有 Page 6 of 23
  7. 7. Junit 使用指南及作业规范 在测试类中 override 如下两个方法:改写之前的代码如下: //①继承TestCase类 public class CalculatorTest extends TestCase { private Calculator cal; @Override public void setUp() throws Exception { System.out.println("执行setup"); cal = new Calculator(); } @Override public void tearDown() throws Exception { System.out.println("执行tearDown "); } //②测试方法必须以 test 开头 public void testAdd() { int result = cal.add(1, 2); Assert.assertEquals(3, result); } public void testAdd2() { int result = cal.add(1, 3); Assert.assertEquals(4, result); } //③将testcase加入testsuite public static Test suite(){ return new TestSuite(CalculatorTest.class); } //④使用TestRunner运行测试套件 public static void main(String[] args) {//junit提供了swing,awt,text三种测试运行器 junit.awtui.TestRunner.run(CalculatorTest.class); }Copyright © 2011 shaomeng95 版权所有 Page 7 of 23
  8. 8. Junit 使用指南及作业规范执行后的输入如下:结果说明,每执行一个测试方法之前和之后都会分别执行 setUp 和 tearDown 方法。2.1.2.4 Eclipse 中使用 junit(有了开发工具对 junit 的支持后) Eclipse IDE 已经内置了对 junit 的支持,下面将演示在 eclipse 中的基本使用。 1) 在需要进行测试的类上右击->NEW->Other(如果能看到 junit 菜单则不 必选择 other) 2) 选择 Java->JUnit->JUnit Test Case(可直接在过滤栏中输入 junit,如下 图),然后 next。Copyright © 2011 shaomeng95 版权所有 Page 8 of 23
  9. 9. Junit 使用指南及作业规范 3) 对 Test Case 进行如下的设置。Copyright © 2011 shaomeng95 版权所有 Page 9 of 23
  10. 10. Junit 使用指南及作业规范 4) 选择需要测试的方法,生成测试方法的桩代码。Copyright © 2011 shaomeng95 版权所有 Page 10 of 23
  11. 11. Junit 使用指南及作业规范 5) 选择需要测试的方法,生成测试方法的桩代码。 6) 运行测试,右击->RUN AS->JUnit Test,由于 eclipse 对 junit 的支持,此 处我们无需调用 junit 的 TestRunner 来运行测试,eclipse 会自动检测到这 是 junit test case 并通过 eclipse 的 junit 插件来运行。Copyright © 2011 shaomeng95 版权所有 Page 11 of 23
  12. 12. Junit 使用指南及作业规范 7) 运行的结果如下图所示2.2 JUNIT 4.X 使用 Junit 4.x 利用了 java 5 的特性(annotation)的优势,使得测试比起 3.x 版本更加的方便简单,junit 4.x 不是旧版本的简单升级,它是一个全新的框架,整个框架的包结构已经彻底改变, 4.x 版本仍然能够很好的兼容旧版本的测试套件。 但2.2.1 下载与安装  下载 junit4.8.1 包  将压缩包中的 junit-4.8.1.jar 加入工程的 classpath 中Copyright © 2011 shaomeng95 版权所有 Page 12 of 23
  13. 13. Junit 使用指南及作业规范 至此,在工程中将可以使用 junit 编写测试代码了。2.2.2 使用方法2.2.2.1 与 3.x 版本的异同(看谁更简单)JUnit3.x JUnit4.x必须引入类 junit.framework.TestCase 必须引入 org.junit.Test;org.junit.Assert.* (static import)必须继承类 TestCase 不需要测试方法必须以 test 开头 不需要,但是必须加上@test 注解 通过 assertXXXX()方法来判断结果2.2.2.2 常用注解(体验 annotation 的简单便捷) ★ @Before:初始化方法,在任何一个测试执行之前必须执行的代码; 跟3.X中的setUp()方法具有相同功能。格式:@Before public void method()Junit 3.x Junit 4.xpublic void setUp() throws Exception @Before{ cal = new Calculator(); public void setUp() throws Exception} { cal = new Calculator(); }覆盖父类TestCase的setUp()方法 使用@Before注解,方法名称随意 ★ @After:释放资源,在任何测试执行之后需要进行的收尾工作。跟 3.x 中的 tearDown()方法具有相同功能。格式:@After public void method() ★ @Test:测试方法,表明这是一个测试方法。在 Junit 中将会自动被执行。对 于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必 须为 void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异 常。该 annotation 可以测试期望异常和超时时间,如 @Test(timeout = 100),我 们给测试函数设定一个执行时间,超过了这个时间(100 毫秒),它们就会被系统Copyright © 2011 shaomeng95 版权所有 Page 13 of 23
  14. 14. Junit 使用指南及作业规范 强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可 以 发 现 这 些 Bug 了 。 同 时 还 可 以 测 试 期 望 的 异 常 , 例 如 : @Test(expected=IllegalArgumentException.class) ★ @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参 与此次测试” ;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。 一旦你完成了相应函数,只需要把@Ignore 标注删去,就可以进行正常的测试。 ★ @BeforeClass:针对所有测试,在所有测试方法执行前执行一次,且必须为 public static void;此 annotataion 为 4.x 新增功能。格式:@BeforeClass public void method() ★ @AfterClass:针对所有测试,在所有测试方法执行结束后执行一次,且必 须为 public static void; 此 annotataion 为 4.x 新增功能。格式: AfterClass public @ void method() 所以 Junit 4 的单元测试用例执行顺序为: @BeforeClass –> @Before –> @Test –> @After –> @AfterClass; 每一个测试方法的调用顺序为: @Before –> @Test –> @After。2.2.2.3 4.x 新特性实战(实践出真知) 1) @Test 测试异常和超时Copyright © 2011 shaomeng95 版权所有 Page 14 of 23
  15. 15. Junit 使用指南及作业规范 通过对@Test 传入 expected 参数值,即可测试异常。通过传入异常类后,测试 类如果没有抛出异常或者抛出一个不同的异常,测试方法就将失败。 或者 输出结果: @Test(expected=IndexOutOfBoundsException.class) public void outOfBounds() { new ArrayList<Object>().get(1); } @Test(expected=Exception.class) public void outOfBounds() { new ArrayList<Object>().get(1); }Copyright © 2011 shaomeng95 版权所有 Page 15 of 23
  16. 16. Junit 使用指南及作业规范 如果将期望的异常修改为其他的异常(IllegalArgumentException),则测试不通 过Copyright © 2011 shaomeng95 版权所有 Page 16 of 23
  17. 17. Junit 使用指南及作业规范 通过对@Test 传入 timeout 参数值即可进行超时测试,如果测试运行时间超过指 定的毫秒数,则测试失败。 @Test(timeout=1) public void verifyReg() { Matcher matcher=pattern.matcher("2010-10-2"); boolean isValid=matcher.matches(); assertTrue("pattern is not match",isValid); } 结果如下: 修改代码,延时 1s @Test(timeout=1) public void verifyReg() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Matcher matcher=pattern.matcher("2010-10-2"); boolean isValid=matcher.matches(); assertTrue("pattern is not match",isValid); }Copyright © 2011 shaomeng95 版权所有 Page 17 of 23
  18. 18. Junit 使用指南及作业规范 2) 测试套件 JUnit4 中最显著的特性是没有套件(套件机制用于将测试从逻辑上的分组并将这这些测试作为一个单元测试来运行)。为了替代老版本的套件测试,套件被两个新注释代替:@RunWith、@SuteClasses。通过@RunWith 指定一个特殊的运行器:Suite.class 套件运行器,并通过@SuiteClasses 注释,将需要进行测试的类列表作为参数传入 编写流程如下:  创建一个空类作为测试套件的入口;  将@RunWith、@SuiteClasses 注释修饰这个空类;  把 Suite.class 作为参数传入@RunWith 注释,以提示 JUnit 将此类指定为运行器;  将需要测试的类组成数组作为@SuiteClasses 的参数。如下例所示:Copyright © 2011 shaomeng95 版权所有 Page 18 of 23
  19. 19. Junit 使用指南及作业规范 /* * @RunWith(Suite.class) * @SuiteClasses({CalculatorTest.class,ExceptionTest.class}) * 也可以; * CalculatorTest.class为基于junit3,ExceptionTest.class为基于junit4 * 的用例,由此可见junit4是可以兼容junit3运行的,故在旧系统中可以直接升级 * 为junit4 */ @RunWith(value = Suite.class) @SuiteClasses(value = { CalculatorTest.class,ExceptionTest.class}) public class TestAll{ }结果如下,运行了两个 test case,一个通过一个未通过: 3) 参数化测试 为测试程序健壮性,可能需要模拟不同的参数对方法进行测试,不可能为不同的参数创建一个测试方法。参数化测试能够创建由参数值供给的通用测试,从而为每个参数都运行一次,而不必要创建多个测试方法。 参数化测试编写流程如下:Copyright © 2011 shaomeng95 版权所有 Page 19 of 23
  20. 20. Junit 使用指南及作业规范 为参数化测试类用@RunWith 注释指定特殊的运行器:Parameterized.class; 在测试类中声明几个变量,分别用于存放测试数据和对应的期望值,并创建一个带参 数的构造函数(参数为测试数据和期望值); 创建一个静态(static)测试数据供给方法,其返回类型为 Collection,并用@Parameter 注释以修饰; 编写测试方法。 @RunWith(Parameterized.class)//1.使用参数化运行器 public class ParameterTest { private String dateReg; private Pattern pattern; //2.测试数据与对应期望值的变量 private String phrase; private boolean match; //3.带参数的构造函数(参数为测试数据和对应期望值变量) public ParameterTest(String phrase, boolean match) { this.phrase = phrase; this.match = match; } //4.数据供给方法(静态,用@Parameter注释,返回类型为Collection) @Parameters public static Collection<Object[]> dateFeed() { return Arrays.asList(new Object[][] { { "2010-1-2", true }, { "2010-10-2", true }, { "2010-123-1", false }, { "2010-12-45", true } }); } @Before public void init() { dateReg = "^d{4}(-d{1,2}){2}"; pattern = Pattern.compile(dateReg); } @Test public void verifyDate() { Matcher matcher = pattern.matcher(phrase); boolean isValid = matcher.matches(); assertEquals("Pattern dont validate the data format", isValid, match);Copyright} 2011 shaomeng95 版权所有 © Page 20 of 23 }
  21. 21. Junit 使用指南及作业规范运行结果如下,执行了四次测试:3 作业规范 本规范来自 junit 自身的编程规则以及最佳实践,本规范未提及的注释,代码格式等请参考公司其他规范,此处只针对单元测试代码。 1) 单元测试代码应位于单独的 Source Folder 下 此 Source Folder 通常为 test,这样可以方便管理业务代码与测试代码。 2) 测试类应跟被测试类位于统一 package 下 便于进行管理同时减少引入带测试类的麻烦。Copyright © 2011 shaomeng95 版权所有 Page 21 of 23
  22. 22. Junit 使用指南及作业规范 3) 选择有意义的测试方法名 无论是 junit4.x 还是 3.x,单元测试方法名均需使用 test<待测试方法名称>[概要描 述],如 public void testDivideDivisorIsZero(),很容易知道测试方法的含义。 4) 保持测试的独立性 每项单元测试都必须独立于其他所有单元测试而运行,因为单元测试须能以任何 顺序运行。 5) 为暂未实现的测试代码抛出失败(fail)或忽略(ignore) 如果是 junit3.x,可以在未实现的测试方法中使用 fail("Not yet implemented");以告 知失败是因为测试方法未实现,如果是 junit4.x,可以在测试方法上使用注解 @Ignore("Not yet implemented "),需要注意的是一定要在 ignore 中加入忽略的原因 (Not yet implemented)。 6) 在调用断言(assert)方法时给出失败的原因 在使用断言方法时,请使用带有 message 参数的 api,并在调用时给出失败时的原 因描述,如 assertNotNull(“对象为 null”,new Object())。4 附录4.1 下版计划执行动作 描述 对应版本 时间增加 常见单元测试设计方法 V1.1 2011-03-10~2011-03-20增加 与容器相关测试 V1.2 2011-04-02~2011-04-20Copyright © 2011 shaomeng95 版权所有 Page 22 of 23
  23. 23. Junit 使用指南及作业规范4.2 修订记录主题 描述 修订者 修订时间4.3 参考文献 1) 《JUnit in action》 2) Junit 官方网站:http://www.junit.org 3) 维基百科Copyright © 2011 shaomeng95 版权所有 Page 23 of 23

×