序言:
JUnit文档内容较少,用词也较简单,适合我这种低水平的人以学习之用。
两位作者都是望尘莫及的大师,他们的简介wiki为:
Kent Beck:http://en.wikipedia.org/wiki/Kent_Beck
Erich Gamma:http://en.wikipedia.org/wiki/Erich_Gamma
以下进入主题,若翻译对读者误导了,还请海涵。
[b]JUnit Cookbook[/b]
Kent Beck, Erich Gamma
本简要手册将告诉你使用JUnit进行书写和组织测试代码的步骤。
[b]简单的测试用例[/b]
你是如何写测试代码的?
最简单的方式是在调试器调试语句。你可以不重新编译而改变调试语句(step into,step over等),并且当你观察到正在运行的对象时,你可以判断对象中写了什么数据(原句:You can change debug expressions without recompiling, and you can wait to decide what to write until you have seen the running objects. 翻译地很别扭)。你也可以写反映状态的测试语句,让它们输出在标准输出流中。这两种方式都是有缺陷的,因为人们要根据自己的判断力去分析这些测试语句的结果。并且,它们合作地也不漂亮--你只能同时执行一条调试语句,并且一个程序中有太多打印语句的话会引起恐怖的"Scroll Blindness"。
JUnit测试不需要人们去分析,并且它很容易同时运行多个程序。当你需要测试程序时,你要做的只是:
1.使用@org.junit.Test注解一个方法
2.当你想检查一个变量时,首先静态import org.junit.Assert.*,然后调用assertTrue()并且传递一个表示boolean值的参数,如果测试成功它将显示判断是正确的
例如,要测试两个Money对象的和是否等于两个Money对象的值的和,可以这么写:
[b]装置[/b]
如果你有两个或多个测试使用到了相同的对象设置呢?
测试运行前需要对一些对象进行设置。这种对对象的设置我们称之为测试装置(原文:Tests need to run against the background of a known set of objects. This set of objects is called a test fixture.太晦涩了)。写测试代码的时候,你经常会发现建立这种装置比实际测试代码花费了更多的时间。
在某种程度上,你可以在构造函数中实现这些装置代码。不管怎样,通过共享装置代码可以节省更多的时间。通常,你将在不同的测试中使用相同的装置。每个测试用例在装置中有细微的差别,并且使用被装置的对象去检测不同的结果。
当你使用一个普通装置时,你可以这么做:
1.添加一个成员变量
2.使用@org.junit.Before注解一个方法,并在这个方法中初始化变量
3.使用@org.junit.After注解一个方法,用以释放在setUp中分配的资源空间
例如,写一些测试用例,要使用12 Swiss Francs、14 Swiss Francs和28 US Dollars的不同组合,我们首先新建一个装置:
一旦你恰当地使用了装置,你可以随心所欲地写很多测试用例。添加一堆的测试方法即可(通过@Test来注解)。
[b]运行测试[/b]
你是如何运行测试和收集结果的?
一旦写好了测试代码,你就想去运行它们。JUnit提供了一些工具去定义套件,来运行测试和显示结果。在控制台上显示结果,使用Java程序来运行:
或者使用命令行来运行,另还需要设置测试代码的class和junit的jar包到classpath中:
java org.junit.runner.JUnitCore TestClass1.class [...other test classes...]
你可以让JUnit 4的测试代码运行在早期版本的TestRunner中,只需定义一个返回test的静态方法suite:
[b]预期的异常[/b]
你是如何检验那些将要抛出预期异常的代码?
检验代码通常只是编写代码的一部分。例如:
这行代码将会抛出IndexOutOfBoundsException。@Test有一个可选参数“expected”,它的值为Throwable的子类。如果我们想要验证ArrayList是否抛出了正确的异常,可以这么做:
JUnit文档内容较少,用词也较简单,适合我这种低水平的人以学习之用。
两位作者都是望尘莫及的大师,他们的简介wiki为:
Kent Beck:http://en.wikipedia.org/wiki/Kent_Beck
Erich Gamma:http://en.wikipedia.org/wiki/Erich_Gamma
以下进入主题,若翻译对读者误导了,还请海涵。
[b]JUnit Cookbook[/b]
Kent Beck, Erich Gamma
本简要手册将告诉你使用JUnit进行书写和组织测试代码的步骤。
[b]简单的测试用例[/b]
你是如何写测试代码的?
最简单的方式是在调试器调试语句。你可以不重新编译而改变调试语句(step into,step over等),并且当你观察到正在运行的对象时,你可以判断对象中写了什么数据(原句:You can change debug expressions without recompiling, and you can wait to decide what to write until you have seen the running objects. 翻译地很别扭)。你也可以写反映状态的测试语句,让它们输出在标准输出流中。这两种方式都是有缺陷的,因为人们要根据自己的判断力去分析这些测试语句的结果。并且,它们合作地也不漂亮--你只能同时执行一条调试语句,并且一个程序中有太多打印语句的话会引起恐怖的"Scroll Blindness"。
JUnit测试不需要人们去分析,并且它很容易同时运行多个程序。当你需要测试程序时,你要做的只是:
1.使用@org.junit.Test注解一个方法
2.当你想检查一个变量时,首先静态import org.junit.Assert.*,然后调用assertTrue()并且传递一个表示boolean值的参数,如果测试成功它将显示判断是正确的
例如,要测试两个Money对象的和是否等于两个Money对象的值的和,可以这么写:
@Test public void simpleAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF);
assertTrue(expected.equals(result));
}
[b]装置[/b]
如果你有两个或多个测试使用到了相同的对象设置呢?
测试运行前需要对一些对象进行设置。这种对对象的设置我们称之为测试装置(原文:Tests need to run against the background of a known set of objects. This set of objects is called a test fixture.太晦涩了)。写测试代码的时候,你经常会发现建立这种装置比实际测试代码花费了更多的时间。
在某种程度上,你可以在构造函数中实现这些装置代码。不管怎样,通过共享装置代码可以节省更多的时间。通常,你将在不同的测试中使用相同的装置。每个测试用例在装置中有细微的差别,并且使用被装置的对象去检测不同的结果。
当你使用一个普通装置时,你可以这么做:
1.添加一个成员变量
2.使用@org.junit.Before注解一个方法,并在这个方法中初始化变量
3.使用@org.junit.After注解一个方法,用以释放在setUp中分配的资源空间
例如,写一些测试用例,要使用12 Swiss Francs、14 Swiss Francs和28 US Dollars的不同组合,我们首先新建一个装置:
public class MoneyTest {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
@Before public void setUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}
一旦你恰当地使用了装置,你可以随心所欲地写很多测试用例。添加一堆的测试方法即可(通过@Test来注解)。
[b]运行测试[/b]
你是如何运行测试和收集结果的?
一旦写好了测试代码,你就想去运行它们。JUnit提供了一些工具去定义套件,来运行测试和显示结果。在控制台上显示结果,使用Java程序来运行:
org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);
或者使用命令行来运行,另还需要设置测试代码的class和junit的jar包到classpath中:
java org.junit.runner.JUnitCore TestClass1.class [...other test classes...]
你可以让JUnit 4的测试代码运行在早期版本的TestRunner中,只需定义一个返回test的静态方法suite:
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(Example.class);
}
[b]预期的异常[/b]
你是如何检验那些将要抛出预期异常的代码?
检验代码通常只是编写代码的一部分。例如:
new ArrayList<Object>().get(0)
这行代码将会抛出IndexOutOfBoundsException。@Test有一个可选参数“expected”,它的值为Throwable的子类。如果我们想要验证ArrayList是否抛出了正确的异常,可以这么做:
@Test(expected= IndexOutOfBoundsException.class) public void empty() {
new ArrayList<Object>().get(0);
}