Java----junit

在介绍JUnit之前,先谈一谈XP、TDD以及Refactor

XP(极限编程)是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。

TDD(测试驱动开发)是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。

Refactor(软件重构)是指在不改变软件的功能和外部可见性的情况下,为了改善软件的结构,提高清晰性、可扩展性和可重用性而对软件进行的改造。简而言之,重构就是改进已经写好的软件的设计。

再谈谈测试的相关知识以及重要性:

静态测试在不运行程序的情况下检查程序的运行情况。(需求评审,设计评审以及代码检查)

动态测试运行程序代码。(单元测试,集成测试,系统测试,用户的验收测试以及回归测试)

黑盒测试:在不了解系统结构的情况下以说明书为基础进行测试,属于功能测试

白盒测试:以系统内部结构和相关知识为基础进行测试,属于结构测试。

单元测试又称为模块测试,是针对软件设计的最小单位--程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。它需要从程序内部结构触发设计测试用例。多个模块的单元测试可以并行进行。

在单元测试时,测试者需要依据详细的设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。



JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。是用于单元测试框架体系XUnit的一个实例。它由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驱之一)编写的。

Junit与XP

在XP编程中,基本过程是这样的:构思-->编写测试代码-->编写代码-->测试。其中编写测试和编写代码都是增量式的、迭代式的(在UP统一过程中也是这样的),写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。它适用于中小型编程。并非所有的构思全出来了,然后再编写所有的测试代码,然后编写所有的代码,再来测试,而是根据任务优先级,先构建核心任务的测试,编写其实现代码,进行测试,然后再其基础上一点点扩充增强其功能,不会存在瞻前顾后的情况。它关注的就是单元测试,可见JUnit在其中扮演多么重要的角色。

JUnit与Refactor

重构就是修改现有的代码使之设计良好。设计模式是重构的目标。重构通常不会对代码进行大量的测试,而是改一点测一点,这样可以得到我们可以信赖的代码,减少回归错误造成的时间消耗。

怎么使用?

(1)在Eclipse下新建一个Java项目,然后把Junit的包添加到项目中来。


(2)在弹出的对话框中,选择Add Library -->Junit-->Next

 

(3)在弹出的对话框中,选择JUnit版本(选择Eclipse安装目录下现有的JUnit版本),点击Finish即可将JUnit的包加到当前项目中。

 

(4)在项目的src下的Filter包里有一个Add.java文件,现在为Add类添加测试用例。选中该文件,然后右键New->Junit Test Case即可。先看一下Add.java

public class Add {

private int n;
    public Add(int n) {
        this.n = n;
    }
    // 返回绝对值:
    public int foo() {
    return n>0 ? n : (-n);
    }

}

 

(5)在打开的New Junit Test Case对话框中,选择JUnit版本,测试用例名称(缺省使用“类名+Test ”作为用例名称),选择要创建的方法setUp()和tearDown()(这两个方法相当于C++类中的构造器和析构器),最后点击Next。

 

(5)在Next对话框中,选择要测试的方法(类自身的方法Add的父类中的一些方法),这儿选择Add的foo()方法,然后点击Finish,这样一个AddTest类就创建好了。


AddTest.java

package Filter;

import junit.framework.TestCase;

public class AddTest extends TestCase {

private Add s1, s2;

    protected void setUp() throws Exception {
        super.setUp();
        s1 = new Add(10);
        s2 = new Add(-7);
    }

    public void testFoo() {
   
        assertTrue(s1.foo()==10);
        assertTrue(s2.foo()==7);
    }

}

这时,运行该java即可得到测试的结果。



结果为:



绿条表示测试通过,如果有错误就用红条表示,同时双击错误提示会具体定位到测试类的错误代码行。

这是单个Test Case,还可以创建一组Test Case套件,即Test Suite。Test Suite会使用反射动态的创建一个包含所有的testXxxx方法的测试套件。怎么创建呢?

选中项目,右键New-->Other-->Java-->JUnit -->JUnit Test Suite-->Next。如下图:

选择要在套件中包含的所有Test Case所在的Package,并选择要包含的Test Case(这儿还有另外一个原理同Add的类的Test Case一样的Time类的Test Case:TimeTest.java )。该套件命名为AllTests,然后点击Finish。这样就可以生成一个AllTests.java的文件,只要执行它,所有的测试用例都被执行了,测试结果同测试用例的结果一样显示,节省了每个Test Case分别执行的麻烦。

AllTests.java的代码如下:(Time.java以及TimeTest.java的代码略)

package Filter;

import junit.framework.Test;
import junit.framework.TestSuite;

public class AllTests {

public static Test suite() {
   TestSuite suite = new TestSuite("Test for Filter");
  //$JUnit-BEGIN$
   suite.addTestSuite(TimeTest.class);
   suite.addTestSuite(AddTest.class);
  //$JUnit-END$
   return suite;
}

}

AllTests.java的执行结果如下:




JUnit编写测试代码的最佳实践

(1)不要用TestCase的构造函数初始化,而要用setUp()和tearDown()方法

(2)不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法,所以不同的平台会按照不同的顺序从Vector中取出测试方法。

(3)避免编写有副作用的TestCase。例如,如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据,简单的回滚就可以了。

(4)当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。

(5)将测试代码和工作代码放在一起,一边同步编译和更新。

(6)测试类和测试方法应该有一致的命名方案。如在工作类名钱加上test从而形成测试类名。

(7)确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。

(8)如果编写的软件面向国际市场, 编写测试时要考虑国际化的因素,不要仅用国语的Locale进行测试。

(9)尽可能地利用JUnit提供的assert/fail方法以及异常处理的方法,可以使代码更为简洁。

(10)测试要尽可能的小,执行速度快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值