`
yanghuidang
  • 浏览: 949974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

浅谈TDD

测试驱动开发,它是敏捷开发的最重要的部分。方法主要是先根据客户的需求编写测试程序,然后再编码使其通过测试。在敏捷开发实施中,开发人员主要从两个方面去理解测试驱动开发。

a)在测试的辅助下,快速实现客户需求的功能。通过编写测试用例,对客户需求的功能进行分解,并进行系统设计。我们发现从使用角度对代码的设计通常更符合后期开发的需求。可测试的要求,对代码的内聚性的提高和复用都非常有益。
b)在测试的保护下,不断重构代码,提高代码的重用性,从而提高软件产品的质量。可见测试驱动开发实施的好坏确实极大的影响软件产品的质量,贯穿了软件开发的始终。
在测试驱动开发中,为了保证测试的稳定性,被测代码接口的稳定性是非常重要的。否则,变化的成本就会急剧的上升。所以,自动化测试将会要求您的设计依赖于接口,而不是具体的类。进而推动设计人员重视接口的设计,体现系统的可扩展性和抗变性。


JUnit4的用法介绍

Java 语言现在支持泛型、枚举、可变长度参数列表和注释,这些特性为可重用的框架设计带来了新的可能。
JUnit4利用 Java 5 的新特性(尤其是注释)的优势,使得单元测试比起用最初的 JUnit 来说更加简单。

测试方法 @Test

以前所有版本的 JUnit 都使用命名约定和反射来定位测试。例如,下面的代码测试 1 + 1 等于 2:

 

import  junit.framework.TestCase;
public   class  AdditionTest  extends  TestCase  {
private   int  x  =   1 ;
private   int  y  =   1 ;
public   void  testAddition()  {
int  z  =  x  +  y;
assertEquals(
2 , z);
}

}


而在 JUnit4 中,测试是由 @Test 注释来识别的,如下所示:

import  org.junit.Test; import  junit.framework.TestCase; public   class  AdditionTest  { private   int  x  =   1 ; private   int  y  =   1 ; @Test public   void  testAddition()  { int  z  =  x  +  y; assertEquals( 2 , z); } }

使用注释来识别测试方法的优点是不再需要将所有的方法命名为 testAddition()、testXXX()的形式等等。
例如,下面的方法也可以工作:

import  org.junit.Test; import  junit.framework.TestCase; public   class  AdditionTest  { private   int  x  =   1 ; private   int  y  =   1 ; @Test public   void  addition()  { int  z  =  x  +  y; assertEquals( 2 , z); } }

使用这种方法的好处是:
a)允许我们遵循最适合的应用程序的命名约定。
我们可以将测试方法使用与被测试的类相同的名称(由开发组规范约定)。例如,LoginAction.login() 由 LoginActionTest.login()方法测试、LoginAction.check()由LoginActionTest.check()方 法测试等等。
b)使用JUnit4后,测试用例类可以不继承TestCase类,所以我们也就可以扩展被测试类了。
这种方法使得测试受保护的方法非常容易,我们只要将测试用例类继承被测试类,就可以测试受保护方法了。

@Before(SetUp)

JUnit 3 测试运行程序会在运行每个测试之前自动调用 setUp() 方法。该方法一般会初始化字段、准备数据等等。例如下面的 setUp() 方法,用于设定要加载的路由文件:

 

public   void  setUp()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}



在 JUnit4 中,我们仍然可以在每个测试方法运行之前初始化字段或准备数据。然而,完成这些操作的方法不再需要叫做 setUp(),只要用 @Before 注释来指示该方法即可,如下所示:

 

@Before
public   void  initialize()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}



JUnit4允许我们使用 @Before 来注释多个方法,这些方法都在每个测试之前运行:

 

@Before
public   void  initialize()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}

@Before
public   void  prepareRetData()  {
//
}


 

@After(TearDown)

清除方法与初始化方法类似。在 JUnit3 中,我们要将方法命名为 tearDown() 才可以实现清除方法,但在JUnit4中,只要给方法添加@After标注即可。
例如:

 

    @After
public   static   void  clearContext()  {
ActionContext.getContext().put(StrutsStatics.HTTP_REQUEST, 
null );
ActionContext.setContext(
null );
}



测试方法结束后清除为此测试用例准备的一些数据。
与 @Before 一样,也可以用 @After 来注释多个清除方法,这些方法都在每个测试之后运行。
最后,我们不再需要显式调用在超类中的初始化和清除方法,只要它们不被覆盖,测试运行程序将根据需要自动为您调用这些方法。
超类中的 @Before 方法在子类中的 @Before 方法之前被调用(这反映了构造函数调用的顺序)。
@After 方法以反方向运行:子类中的方法在超类中的方法之前被调用。否则,多个 @Before 或 @After 方法的相对顺序就得不到保证。

 

@Before和@After小结

假设测试类中有如下方法定义:

 

@Before
public   void  init() { }
@After
public   void  destroy() { }

则Before、After方法的执行流程如图所示:

浅谈TDD

测试驱动开发,它是敏捷开发的最重要的部分。方法主要是先根据客户的需求编写测试程序,然后再编码使其通过测试。在敏捷开发实施中,开发人员主要从两个方面去理解测试驱动开发。

a)在测试的辅助下,快速实现客户需求的功能。通过编写测试用例,对客户需求的功能进行分解,并进行系统设计。我们发现从使用角度对代码的设计通常更符合后期开发的需求。可测试的要求,对代码的内聚性的提高和复用都非常有益。
b)在测试的保护下,不断重构代码,提高代码的重用性,从而提高软件产品的质量。可见测试驱动开发实施的好坏确实极大的影响软件产品的质量,贯穿了软件开发的始终。
在测试驱动开发中,为了保证测试的稳定性,被测代码接口的稳定性是非常重要的。否则,变化的成本就会急剧的上升。所以,自动化测试将会要求您的设计依赖于接口,而不是具体的类。进而推动设计人员重视接口的设计,体现系统的可扩展性和抗变性。


JUnit4的用法介绍

Java 语言现在支持泛型、枚举、可变长度参数列表和注释,这些特性为可重用的框架设计带来了新的可能。
JUnit4利用 Java 5 的新特性(尤其是注释)的优势,使得单元测试比起用最初的 JUnit 来说更加简单。

测试方法 @Test

以前所有版本的 JUnit 都使用命名约定和反射来定位测试。例如,下面的代码测试 1 + 1 等于 2:

 

import  junit.framework.TestCase;
public   class  AdditionTest  extends  TestCase  {
private   int  x  =   1 ;
private   int  y  =   1 ;
public   void  testAddition()  {
int  z  =  x  +  y;
assertEquals(
2 , z);
}

}


而在 JUnit4 中,测试是由 @Test 注释来识别的,如下所示:

 

import  org.junit.Test;
import  junit.framework.TestCase;
public   class  AdditionTest  {
private   int  x  =   1 ;
private   int  y  =   1 ;
@Test
public   void  testAddition()  {
int  z  =  x  +  y;
assertEquals(
2 , z);
}

}


使用注释来识别测试方法的优点是不再需要将所有的方法命名为 testAddition()、testXXX()的形式等等。
例如,下面的方法也可以工作:

 

import  org.junit.Test;
import  junit.framework.TestCase;
public   class  AdditionTest  {
private   int  x  =   1 ;
private   int  y  =   1 ;
@Test
public   void  addition()  {
int  z  =  x  +  y;
assertEquals(
2 , z);
}

}


使用这种方法的好处是:
a)允许我们遵循最适合的应用程序的命名约定。
我们可以将测试方法使用与被测试的类相同的名称(由开发组规范约定)。例如,LoginAction.login() 由 LoginActionTest.login()方法测试、LoginAction.check()由LoginActionTest.check()方 法测试等等。
b)使用JUnit4后,测试用例类可以不继承TestCase类,所以我们也就可以扩展被测试类了。
这种方法使得测试受保护的方法非常容易,我们只要将测试用例类继承被测试类,就可以测试受保护方法了。

@Before(SetUp)

JUnit 3 测试运行程序会在运行每个测试之前自动调用 setUp() 方法。该方法一般会初始化字段、准备数据等等。例如下面的 setUp() 方法,用于设定要加载的路由文件:

 

public   void  setUp()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}


在 JUnit4 中,我们仍然可以在每个测试方法运行之前初始化字段或准备数据。然而,完成这些操作的方法不再需要叫做 setUp(),只要用 @Before 注释来指示该方法即可,如下所示:

 

@Before
public   void  initialize()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}


JUnit4允许我们使用 @Before 来注释多个方法,这些方法都在每个测试之前运行:

 

@Before
public   void  initialize()  {
//  加载此测试用例的servicerouting配置文件
ServiceRouting.loadConfig( " com/demo/servicerouting.conf " );
//  
}

@Before
public   void  prepareRetData()  {
//
}


 

@After(TearDown)

清除方法与初始化方法类似。在 JUnit3 中,我们要将方法命名为 tearDown() 才可以实现清除方法,但在JUnit4中,只要给方法添加@After标注即可。
例如: 

   @After
public   static   void  clearContext()  {
ActionContext.getContext().put(StrutsStatics.HTTP_REQUEST, 
null );
ActionContext.setContext(
null );
}


测试方法结束后清除为此测试用例准备的一些数据。
与 @Before 一样,也可以用 @After 来注释多个清除方法,这些方法都在每个测试之后运行。
最后,我们不再需要显式调用在超类中的初始化和清除方法,只要它们不被覆盖,测试运行程序将根据需要自动为您调用这些方法。
超类中的 @Before 方法在子类中的 @Before 方法之前被调用(这反映了构造函数调用的顺序)。
@After 方法以反方向运行:子类中的方法在超类中的方法之前被调用。否则,多个 @Before 或 @After 方法的相对顺序就得不到保证。

 

@Before和@After小结

假设测试类中有如下方法定义:

 

@Before
public   void  init() { }
@After
public   void  destroy() { }

则Before、After方法的执行流程如图所示:


这种方法有明显的缺陷,如果要初始化的是数据库的链接,或者是一个大的对象的话,而这些资源恰恰是整个测试用例类可以共用的,每次都去申请,确实是种浪费。所以JUnit4引入了@BeforeClass和@AfterClass。

 

@BeforeClass和@AfterClass

JUnit4 也引入了一个 JUnit3 中没有的新特性:类范围的 setUp() 和 tearDown() 方法。任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用 @AfterClass 注释的方法都将在该类中的所有测试都运行之后刚好运行一次。
例如,假设类中的每个测试都使用一个数据库连接、一个非常大的数据结构,或者申请其他一些资源。不要在每个测试之前都重新创建它,您可以创建它一次,用完后将其销毁清除。该方法将使得有些测试案例运行起来快得多。
注意:被注释为 BeforeClass和AfterClass 的方法必须为static方法。
用法如下:

    @BeforeClass public   static   void  classInit()  { Map callRet  =   new  HashMap(); List < ErrorCodeMessageBean >  list  =   new  ArrayList < ErrorCodeMessageBean > (); list.add(createMsgBean( " TDE0001 " " 第一个错误消息 " )); list.add(createMsgBean( " TDP9999 " " 格式化{0}{1} " )); list.add(createMsgBean( " TDE1000~TDF0001 " " 区间错误消息 " )); list.add(createMsgBean( " TDG0001~ " " 有下限的区间错误消息 " )); list.add(createMsgBean( " ~TDD0001 " " 有上限的区间错误消息 " )); list.add(createMsgBean( " ~ " " 默认的消息 " )); callRet.put(ErrorCodeMessageBean.codeMsgBeanKey, list); ServiceCall.expectLastCallReturn(callRet); } @Test public   void  oneTestMethod()  { http://www.blogjava.net/Images/OutliningIndicators/InB
2
1
分享到:
评论

相关推荐

    junit4教程(《Junit4初探》)

    JUnit4是Java编程语言中广泛使用的单元测试框架,它是Java开发者进行软件质量保证的重要工具。本教程将深入浅出地介绍JUnit4的基本概念、核心特性以及如何在实际项目中应用它来编写有效的单元测试。 ## 一、JUnit4...

    JUnit4使用.pdf

    ### JUnit4 使用详解 #### 一、JUnit简介与单元测试概念 JUnit 是一个用于 Java 程序的单元测试框架,它可以帮助开发者确保代码的质量和稳定性。单元测试是一种编程方法,通过这种方式开发者可以在开发过程中编写...

    Junit4使用教程详解+源码下载.rar

    本教程提供的源码可以帮助读者更直观地理解JUnit4的用法,通过实际操作加深对各个特性的理解。下载源码后,可以在IDE中运行测试,观察测试结果,调试测试代码,进一步提升单元测试技能。 总之,JUnit4是Java开发中...

    junit4学习文档

    ### JUnit4 学习知识点详解 #### 一、JUnit4 概述 JUnit4 是 JUnit 测试框架的一个重大更新版本,它充分利用了 Java 5 的注解(Annotation)特性来简化测试用例的编写过程。注解是一种元数据,用于描述程序中的...

    Junit 类包详解

    ### Junit 类包详解 #### Package framework Junit框架的核心包`junit.framework`包含了进行单元测试所需的多个关键类和接口。以下是对该包中重要类及接口的深入解析。 ##### Interface Test - **功能**: `Test`...

    Junit测试详解(ppt,实例,junit4使用)打包下载

    单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块(对象),进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。基于面向面向对象我们测试的对象就是类的实例。...

    Junit4.zip

    《JUnit4:Java单元测试框架详解》 JUnit4是一款广泛应用于Java编程领域的单元测试框架,它的出现极大地简化了测试代码的编写,提升了测试的效率。本文将深入探讨JUnit4的核心特性、使用方法以及如何将其应用到实际...

    JUnit4详解

    最后,JUnit4 还支持使用规则(Rules),这是一种高级的机制,允许自定义测试行为,如超时、重试或者在测试执行前后进行特定操作。规则通过`@Rule`注解应用到测试方法或类上。 总结起来,JUnit4 的核心改进在于引入...

    JUnit4.rar(ppt讲义)

    **JUnit4测试框架详解** JUnit 4 是一个广泛使用的Java编程语言的单元测试框架,它在软件开发过程中扮演着至关重要的角色,确保代码的质量和稳定性。这个"PPT讲义"涵盖了JUnit 4的核心概念和使用方法,对于学习和...

    junit4入门

    《Junit4 入门详解》 JUnit 是一个用于Java编程语言的单元测试框架,而Junit4作为其第四代版本,引入了许多新特性和改进,使得测试代码更加简洁、可读性强,大大提升了测试效率。这篇教程将带你走进Junit4的世界,...

    ant-junit4.jar.zip

    《Ant与JUnit4结合使用详解》 在Java开发过程中,自动化构建工具Ant和单元测试框架JUnit4是不可或缺的两个部分。Ant-junit4.jar.zip是一个包含Ant和JUnit4相关依赖的压缩包,它使得开发者能够方便地在Ant构建环境中...

    Spring整合Junit的使用详解

    Spring整合Junit的使用详解 Spring整合Junit的使用详解是软件开发和测试中一个非常重要的知识点。通过本文,我们将详细介绍如何将Spring框架与Junit单元测试框架进行整合,从而实现对Spring应用程序的正确性测试。 ...

    浪曦][原创]Junit.3.8.详解续二.rar

    4. **测试套件(Test Suites)**:通过`@Suite`注解(Junit 4引入),可以将多个测试类组合成一个测试套件,但在Junit 3.8中,我们需要手动创建一个测试类来包含其他测试类。 5. **异常测试**:可以使用`try-catch-...

    JUnit4单元测试入门详解.pdf

    JUnit 4的使用极大地简化了Java单元测试的编写,并且提高了代码的可读性和可维护性。在实际开发中,它允许开发者在每次代码修改后快速执行测试,确保代码的正确性和稳定性。 JUnit 4不仅简化了测试代码的编写,还...

    surefire-junit4-2.7.2-javadoc.jar

    《深入解析Surefire与JUnit4的整合:2.7.2版API文档详解》 在Java测试领域,Surefire和JUnit4是两个不可或缺的重要工具。Surefire是Maven项目中的一个插件,主要负责执行JUnit和其他兼容的测试框架的测试用例。...

    Junit4入门使用介绍

    ### Junit4入门使用介绍 #### 一、简介 JUnit4是JUnit框架的...对于初学者而言,了解并掌握JUnit4的基本用法是非常重要的一步。希望本教程能够帮助大家顺利进入JUnit的世界,并高效地进行单元测试的编写与执行。

    对JUnit的一点简单讲解包括一点简单的Android JUnit的讲解

    AndroidJUnit4引入了`@RunWith(AndroidJUnit4.class)`,这使得我们可以使用JUnit4的特性,同时利用Android的测试环境。例如,`@UiThreadTest`注解用于表示该测试必须在主线程运行,而`@SmallTest`, `@MediumTest`, ...

Global site tag (gtag.js) - Google Analytics