Junit的安装
Junit的安装还是很简单的,直接将Junit3.8.3放在一个目录下,现在假社这个目录为D:\Junit3.8.1, 那么我们就在CLASSPATH中添加D:\Junit3.8.1\Junit.jar这个路径就可以使用了。当然如果你在其他目录那么相应路径就是 : 其他目录:\ Junit3.8.1\Junit.jar
接下来谈下Junit框架的组成
Junit TC 测试目标与测试方法的集合
TS TestSuite 测试包
TR TestTusult 测试结果的描述
Test Listener 测试实践监听者
Test Failure 测试过程中出现的与预期不一致的地方
AssertionFailedError 测试过程中出现的异常
Junit的各种断言:
1
,assertEquals([String message],
expected,
actual)
这是使用得最多的断言形式。
expected-是你的期望值(通常要硬编码)
actual-被测代码实际产生的值
message-可选的消息,如果提供的话,将会在发生错误的时候报告这个消息。
2
,assertNull([String message],java.lang.Object object)
assertNotNull([String message],java.lang.Object object)
验证一个给定的对象是否为Null(或者为非Null),如果答案为否,则将会失败。message参数是可选的。
3
,assertSame( [String message],
expected,
actual)
验证expected参数和actual
参数所引用的是否为同
一对象,如果不是的
话,将会失败。Message
参数是可选的。
验证给定的二元条件是否为真,如果为假的话,将会失败。Message参数是可选的。
验证给定的二元条件是否为假,如果不为假的话,将会失败。Message参数是可选的
5,fail( String message )
使测试立即失败,其中message参数使可选的。
这种断言通常被用于标记某个不应该到达的分支(例如,在一个预期发生的异常之后)
首先,第一行的import声明引入了必须的junit类。
定义一个类,从TestCase继承下来
定义一个构造函数
测试类中包含名为test……的方法
Junit的框架
1
import
junit.framework.
*
;
2
3
4
5
public
class
TestSimple
extends
TestCase
{
6
7
punlic TestSimple (String name)
{
8
9
super
(name);}
10
11
public
void
testAdd()
{
12
13
assertEquals(
2
,
1
+
1
);
14
15
}
16
17
JUnit中常用的接口和类:
Test接口——运行测试和收集测试结果
TestCase抽象类——定义测试中固定方法
Assert静态类——一系列断言方法的集合
TestSuite测试包类——多个测试的组合
TestResult结果类和其它类与接口
一些使用JUnit经验 :
不要用TestCase的构造函数初始化,而要用setUp()和tearDown()方法。
不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。
避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。
当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。
将测试代码和工作代码放在一起,一边同步编译和更新。
测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。
确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。
如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。
尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。
测试要尽可能地小,执行速度快
Junit的扩展:
JUnit + HttpUnit=WEB功能测试工具
JUnit + hansel =代码覆盖测试工具
JUnit + abbot =界面自动回放测试工具
JUnit + dbunit =数据库测试工具
JUnit + junitperf=性能测试工具
现在来实践一下吧! Junit应用举例:
1
public
class
Money
{
2
3
private
int
fAmount;
//
余额
4
5
private
String fCurrency;
//
货币类型
6
7
public
Money(
int
amount, String currency)
{
8
9
fAmount
=
amount;
10
11
fCurrency
=
currency;
12
13
}
14
15
public
int
amount()
{
16
17
return
fAmount;
18
19
}
20
21
public
String currency()
{
22
23
return
fCurrency;
24
25
}
26
27
public
Money add(Money m)
{
//
加钱
28
29
return
new
Money(amount()
+
m.amount(), currency());
30
31
}
32
33
public
boolean
equals(Object anObject)
{
//
判断钱数是否相等
34
35
if
(anObject
instanceof
Money)
{
36
37
Money aMoney
=
(Money)anObject;
38
39
return
aMoney.currency().equals(currency())
40
41
&&
amount()
==
aMoney.amount();
42
43
}
44
45
return
false
;
46
47
}
48
49
}
50
测试程序:
1
package
test.JunitTest;
2
3
import
junit.framework.TestCase;
4
import
junit.framework.
*
;
5
6
public
class
MoneyTest
extends
TestCase
{
7
8
9
private
Money f12CHF;
//
提取公用的对象
10
11
private
Money f14CHF;
12
13
14
protected
void
setUp()
throws
Exception
{
15
f12CHF
=
new
Money(
12
,
"
CFH
"
);
16
f14CHF
=
new
Money(
14
,
"
CFH
"
);
17
}
18
19
protected
void
tearDown()
throws
Exception
{
20
super
.tearDown();
21
}
22
23
/**/
/*
24
* Test method for 'test.JunitTest.Money.addMoney(Money)'
25
*/
26
public
void
testAddMoney()
{
27
Assert.assertEquals(f12CHF.addMoney(f14CHF),
new
Money(
26
,
"
CFH
"
));
28
}
29
30
/**/
/*
31
* Test method for 'test.JunitTest.Money.equals(Object)'
32
*/
33
public
void
testEqualsObject()
{
34
Assert.assertEquals(f12CHF,f12CHF);
35
}
36
37
}
运行结果 :runs 2/2 error: 0 failur:0
测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,JUnit是一个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCase组合成TestSuit,使测试任务自动化。Eclipse同样集成了JUnit,可以非常方便地编写TestCase。
我们创建一个Java工程,添加一个example.Hello类,首先我们给Hello类添加一个abs()方法,作用是返回绝对值:
下一步,我们准备对这个方法进行测试,确保功能正常。选中Hello.java,右键点击,选择New->JUnit Test Case:
Eclipse会询问是否添加junit.jar包,确定后新建一个HelloTest类,用来测试Hello类。
选中setUp()和tearDown(),然后点击“Next”:
选择要测试的方法,我们选中abs(int)方法,完成后在HelloTest.java中输入:
JUnit会以以下顺序执行测试:(大致的代码)
try {
HelloTest test = new HelloTest(); // 建立测试类实例
test.setUp(); // 初始化测试环境
test.testAbs(); // 测试某个方法
test.tearDown(); // 清理资源
}
catch…
setUp()是建立测试环境,这里创建一个Hello类的实例;tearDown()用于清理资源,如释放打开的文件等等。以test开头的方法被认为是测试方法,JUnit会依次执行testXxx()方法。在testAbs()方法中,我们对abs()的测试分别选择正数,负数和0,如果方法返回值与期待结果相同,则assertEquals不会产生异常。
如果有多个testXxx方法,JUnit会创建多个XxxTest实例,每次运行一个testXxx方法,setUp()和tearDown()会在testXxx前后被调用,因此,不要在一个testA()中依赖testB()。
直接运行Run->Run As->JUnit Test,就可以看到JUnit测试结果:
绿色表示测试通过,只要有1个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变abs()的代码,故意返回错误的结果(比如return n+1;),然后再运行JUnit就会报告错误。
如果没有JUnit面板,选择Window->Show View->Other,打开JUnit的View:
JUnit通过单元测试,能在开发阶段就找出许多Bug,并且,多个Test Case可以组合成Test Suite,让整个测试自动完成,尤其适合于XP方法。每增加一个小的新功能或者对代码进行了小的修改,就立刻运行一遍Test Suite,确保新增和修改的代码不会破坏原有的功能,大大增强软件的可维护性,避免代码逐渐“腐烂”。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目的:
assert(a > 0); // throws an Assertionerror if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。