SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
使用指南及作业规范 V1.0

Keep the bar green keep the code clean!




                作者:shaomeng95
                BLOG:http://shaomeng95.javaeye.com/
Junit 使用指南及作业规范




                                                                        目录

1.     JUNIT 总览 ................................................................................................................................... 3

     1.1        简介 ....................................................................................................................................... 3

     1.2        特性 ....................................................................................................................................... 3

     1.3        适用对象 ............................................................................................................................... 3

2      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 新特性实战(实践出真知) ....................................................................................... 14


3      作业规范 ...................................................................................................................................... 21

4      附录 .............................................................................................................................................. 22

     4.1        下版计划 ............................................................................................................................. 22

     4.2        修订记录 ............................................................................................................................. 23

     4.3        参考文献 ............................................................................................................................. 23




Copyright © 2011 shaomeng95 版权所有                                                                                                    Page 2 of 23
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
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
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
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
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
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
Junit 使用指南及作业规范




    3) 对 Test Case 进行如下的设置。




Copyright © 2011 shaomeng95 版权所有           Page 9 of 23
Junit 使用指南及作业规范




    4) 选择需要测试的方法,生成测试方法的桩代码。




Copyright © 2011 shaomeng95 版权所有           Page 10 of 23
Junit 使用指南及作业规范




    5) 选择需要测试的方法,生成测试方法的桩代码。




    6) 运行测试,右击->RUN AS->JUnit Test,由于 eclipse 对 junit 的支持,此
        处我们无需调用 junit 的 TestRunner 来运行测试,eclipse 会自动检测到这
        是 junit test case 并通过 eclipse 的 junit 插件来运行。




Copyright © 2011 shaomeng95 版权所有                         Page 11 of 23
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
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.x
public 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
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
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
Junit 使用指南及作业规范




 如果将期望的异常修改为其他的异常(IllegalArgumentException),则测试不通
 过




Copyright © 2011 shaomeng95 版权所有           Page 16 of 23
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
Junit 使用指南及作业规范




    2) 测试套件
     JUnit4 中最显著的特性是没有套件(套件机制用于将测试从逻辑上的分组并
将这这些测试作为一个单元测试来运行)。为了替代老版本的套件测试,套件被
两个新注释代替:@RunWith、@SuteClasses。通过@RunWith 指定一个特殊的运
行器:Suite.class 套件运行器,并通过@SuiteClasses 注释,将需要进行测试的类
列表作为参数传入
     编写流程如下:
      创建一个空类作为测试套件的入口;

      将@RunWith、@SuiteClasses 注释修饰这个空类;

      把 Suite.class 作为参数传入@RunWith 注释,以提示 JUnit 将此类指定为运行器;

      将需要测试的类组成数组作为@SuiteClasses 的参数。



如下例所示:




Copyright © 2011 shaomeng95 版权所有                   Page 18 of 23
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
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 don't validate the data format", isValid,
    match);
Copyright} 2011 shaomeng95 版权所有
          ©                                                     Page 20 of 23
    }
Junit 使用指南及作业规范




运行结果如下,执行了四次测试:




3   作业规范

    本规范来自 junit 自身的编程规则以及最佳实践,本规范未提及的注释,代码
格式等请参考公司其他规范,此处只针对单元测试代码。
    1) 单元测试代码应位于单独的 Source Folder 下
        此 Source Folder 通常为 test,这样可以方便管理业务代码与测试代码。




    2) 测试类应跟被测试类位于统一 package 下
        便于进行管理同时减少引入带测试类的麻烦。




Copyright © 2011 shaomeng95 版权所有                Page 21 of 23
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-20




Copyright © 2011 shaomeng95 版权所有                             Page 22 of 23
Junit 使用指南及作业规范




4.2 修订记录



主题               描述                修订者      修订时间




4.3 参考文献

    1) 《JUnit in action》
    2) Junit 官方网站:http://www.junit.org
    3) 维基百科




Copyright © 2011 shaomeng95 版权所有                 Page 23 of 23

Más contenido relacionado

Destacado

Mengenal Manhaj Salaf
Mengenal Manhaj SalafMengenal Manhaj Salaf
Mengenal Manhaj Salafyanto abdulah
 
Kisi uas ipa ix, tp 2015 2016
Kisi uas ipa ix, tp 2015 2016Kisi uas ipa ix, tp 2015 2016
Kisi uas ipa ix, tp 2015 2016yanto abdulah
 
Новая презентация БРЕМАНИ - "Советы на лето"
Новая презентация БРЕМАНИ - "Советы на лето"Новая презентация БРЕМАНИ - "Советы на лето"
Новая презентация БРЕМАНИ - "Советы на лето"Алексей Белецкий
 
Framtiden och det livslånga lärandet prakticum 20 10 2010
Framtiden och det livslånga lärandet prakticum 20 10 2010Framtiden och det livslånga lärandet prakticum 20 10 2010
Framtiden och det livslånga lärandet prakticum 20 10 2010Heidi Backman
 
Pembahasan ringkas tentang zina
Pembahasan ringkas tentang zinaPembahasan ringkas tentang zina
Pembahasan ringkas tentang zinayanto abdulah
 
Gaya dan penerapannya
Gaya dan penerapannyaGaya dan penerapannya
Gaya dan penerapannyayanto abdulah
 
Kisi kisi ipa vii, tp 2015-2016, k 2013
Kisi kisi ipa vii, tp 2015-2016, k 2013Kisi kisi ipa vii, tp 2015-2016, k 2013
Kisi kisi ipa vii, tp 2015-2016, k 2013yanto abdulah
 
Table Top Box Gardens
Table Top Box GardensTable Top Box Gardens
Table Top Box Gardensjmehau
 
Reading for High-Ability Students
Reading for High-Ability StudentsReading for High-Ability Students
Reading for High-Ability Studentsannieorsini
 
Industry profile
Industry profileIndustry profile
Industry profileSaket Chugh
 

Destacado (17)

Mengenal Manhaj Salaf
Mengenal Manhaj SalafMengenal Manhaj Salaf
Mengenal Manhaj Salaf
 
Безраздельная преданность
Безраздельная преданностьБезраздельная преданность
Безраздельная преданность
 
Cables atlas bekker
Cables atlas bekkerCables atlas bekker
Cables atlas bekker
 
Kisi uas ipa ix, tp 2015 2016
Kisi uas ipa ix, tp 2015 2016Kisi uas ipa ix, tp 2015 2016
Kisi uas ipa ix, tp 2015 2016
 
Новая презентация БРЕМАНИ - "Советы на лето"
Новая презентация БРЕМАНИ - "Советы на лето"Новая презентация БРЕМАНИ - "Советы на лето"
Новая презентация БРЕМАНИ - "Советы на лето"
 
Yrke2025 april 2011
Yrke2025 april 2011Yrke2025 april 2011
Yrke2025 april 2011
 
Коллекция NSP "Коралловый Риф"
Коллекция NSP "Коралловый Риф"Коллекция NSP "Коралловый Риф"
Коллекция NSP "Коралловый Риф"
 
Framtiden och det livslånga lärandet prakticum 20 10 2010
Framtiden och det livslånga lärandet prakticum 20 10 2010Framtiden och det livslånga lärandet prakticum 20 10 2010
Framtiden och det livslånga lärandet prakticum 20 10 2010
 
Pembahasan ringkas tentang zina
Pembahasan ringkas tentang zinaPembahasan ringkas tentang zina
Pembahasan ringkas tentang zina
 
Gaya dan penerapannya
Gaya dan penerapannyaGaya dan penerapannya
Gaya dan penerapannya
 
Kisi kisi ipa vii, tp 2015-2016, k 2013
Kisi kisi ipa vii, tp 2015-2016, k 2013Kisi kisi ipa vii, tp 2015-2016, k 2013
Kisi kisi ipa vii, tp 2015-2016, k 2013
 
Rpp gaya
Rpp gayaRpp gaya
Rpp gaya
 
Table Top Box Gardens
Table Top Box GardensTable Top Box Gardens
Table Top Box Gardens
 
Каталог продукции Natria New
Каталог продукции Natria NewКаталог продукции Natria New
Каталог продукции Natria New
 
Trailoftears
TrailoftearsTrailoftears
Trailoftears
 
Reading for High-Ability Students
Reading for High-Ability StudentsReading for High-Ability Students
Reading for High-Ability Students
 
Industry profile
Industry profileIndustry profile
Industry profile
 

Similar a Junit使用指南及作业规范

Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit utfangdeng
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發AgileCommunity
 
Skan it 6.0 user manual chinese
Skan it 6.0 user manual chineseSkan it 6.0 user manual chinese
Skan it 6.0 user manual chineseLenin TaMe
 
LABVIEW的自动化测试之路
LABVIEW的自动化测试之路LABVIEW的自动化测试之路
LABVIEW的自动化测试之路Dean Lee
 
同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告Kerry Zhu
 
Introduction to software quality assurance and its implementation
Introduction to software quality assurance and its implementationIntroduction to software quality assurance and its implementation
Introduction to software quality assurance and its implementationYung-Chun Chang
 
Testing in python 2.7.3
Testing in python 2.7.3Testing in python 2.7.3
Testing in python 2.7.3Wen Liao
 
Phpunit入门 r2
Phpunit入门 r2Phpunit入门 r2
Phpunit入门 r2Baohua Cai
 
GTest交流与经验总结
GTest交流与经验总结GTest交流与经验总结
GTest交流与经验总结coderzh
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =guesta6295f3
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
OpenSTACK Installation on Ubuntu
OpenSTACK Installation on UbuntuOpenSTACK Installation on Ubuntu
OpenSTACK Installation on Ubuntu康志強 大人
 
测试用例浅析 V1.1
测试用例浅析 V1.1测试用例浅析 V1.1
测试用例浅析 V1.1shijian_dev
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理frankwsj
 
Se2009 ch8
Se2009 ch8 Se2009 ch8
Se2009 ch8 浒 刘
 

Similar a Junit使用指南及作业规范 (20)

Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit ut
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發
 
Skan it 6.0 user manual chinese
Skan it 6.0 user manual chineseSkan it 6.0 user manual chinese
Skan it 6.0 user manual chinese
 
LABVIEW的自动化测试之路
LABVIEW的自动化测试之路LABVIEW的自动化测试之路
LABVIEW的自动化测试之路
 
Unit test
Unit testUnit test
Unit test
 
同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告
 
Introduction to software quality assurance and its implementation
Introduction to software quality assurance and its implementationIntroduction to software quality assurance and its implementation
Introduction to software quality assurance and its implementation
 
Testing in python 2.7.3
Testing in python 2.7.3Testing in python 2.7.3
Testing in python 2.7.3
 
Phpunit入门 r2
Phpunit入门 r2Phpunit入门 r2
Phpunit入门 r2
 
GTest交流与经验总结
GTest交流与经验总结GTest交流与经验总结
GTest交流与经验总结
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
OpenSTACK Installation on Ubuntu
OpenSTACK Installation on UbuntuOpenSTACK Installation on Ubuntu
OpenSTACK Installation on Ubuntu
 
测试用例浅析 V1.1
测试用例浅析 V1.1测试用例浅析 V1.1
测试用例浅析 V1.1
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
manual
manualmanual
manual
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理
 
Se2009 ch8
Se2009 ch8 Se2009 ch8
Se2009 ch8
 

Junit使用指南及作业规范

  • 1. 使用指南及作业规范 V1.0 Keep the bar green keep the code clean! 作者:shaomeng95 BLOG:http://shaomeng95.javaeye.com/
  • 2. Junit 使用指南及作业规范 目录 1. JUNIT 总览 ................................................................................................................................... 3 1.1 简介 ....................................................................................................................................... 3 1.2 特性 ....................................................................................................................................... 3 1.3 适用对象 ............................................................................................................................... 3 2 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 新特性实战(实践出真知) ....................................................................................... 14 3 作业规范 ...................................................................................................................................... 21 4 附录 .............................................................................................................................................. 22 4.1 下版计划 ............................................................................................................................. 22 4.2 修订记录 ............................................................................................................................. 23 4.3 参考文献 ............................................................................................................................. 23 Copyright © 2011 shaomeng95 版权所有 Page 2 of 23
  • 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. 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. 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. 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. 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. 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. Junit 使用指南及作业规范 3) 对 Test Case 进行如下的设置。 Copyright © 2011 shaomeng95 版权所有 Page 9 of 23
  • 10. Junit 使用指南及作业规范 4) 选择需要测试的方法,生成测试方法的桩代码。 Copyright © 2011 shaomeng95 版权所有 Page 10 of 23
  • 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. 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. 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.x public 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. 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. 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
  • 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. Junit 使用指南及作业规范 2) 测试套件 JUnit4 中最显著的特性是没有套件(套件机制用于将测试从逻辑上的分组并 将这这些测试作为一个单元测试来运行)。为了替代老版本的套件测试,套件被 两个新注释代替:@RunWith、@SuteClasses。通过@RunWith 指定一个特殊的运 行器:Suite.class 套件运行器,并通过@SuiteClasses 注释,将需要进行测试的类 列表作为参数传入 编写流程如下:  创建一个空类作为测试套件的入口;  将@RunWith、@SuiteClasses 注释修饰这个空类;  把 Suite.class 作为参数传入@RunWith 注释,以提示 JUnit 将此类指定为运行器;  将需要测试的类组成数组作为@SuiteClasses 的参数。 如下例所示: Copyright © 2011 shaomeng95 版权所有 Page 18 of 23
  • 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. 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 don't validate the data format", isValid, match); Copyright} 2011 shaomeng95 版权所有 © Page 20 of 23 }
  • 21. Junit 使用指南及作业规范 运行结果如下,执行了四次测试: 3 作业规范 本规范来自 junit 自身的编程规则以及最佳实践,本规范未提及的注释,代码 格式等请参考公司其他规范,此处只针对单元测试代码。 1) 单元测试代码应位于单独的 Source Folder 下 此 Source Folder 通常为 test,这样可以方便管理业务代码与测试代码。 2) 测试类应跟被测试类位于统一 package 下 便于进行管理同时减少引入带测试类的麻烦。 Copyright © 2011 shaomeng95 版权所有 Page 21 of 23
  • 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-20 Copyright © 2011 shaomeng95 版权所有 Page 22 of 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