您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
JUnit测试教程
作者:网络转载 发布时间:[ 2013/8/26 14:42:48 ] 推荐标签:

安装
首先你要获取JUnit的软件包,从JUnit下载新的软件包(截至写作本文时,JUnit的新版本是3.7)。将其在适当的目录下解包。这样在安装目录(也是你所选择的解包的目录)下你找到一个名为junit.jar的文件。将这个jar文件加入你的CLASSPATH系统变量。(IDE的设置会有所不同,参看你所喜爱的IDE的配置指南)JUnit安装完了。太easy了!
你一旦安装完JUnit,有可能想试试我们的Car和testCar类,没问题,我已经运行过了,你得到的结果应该和我列出的结果类似。(以防新版JUnit使我的文章过时)
接下来,你可能会先写测试代码,再写工作代码,或者相反,先写工作代码,再写测试代码。我更赞成使用前一种方法:先写测试代码,再写工作代码。因为这样可以使我们编写工作代码时清晰地了解工作类的行为。
要注意编写一定能通过的测试代码(如文中的例子)并没有任何意义,只有测试代码能帮助我们发现bug,测试代码才有其价值。此外测试代码还应该对工作代码进行全面的测试。如给方法调用的参数传入空值、错误值和正确的值,看看方法的行为是否如你所期望的那样。
你现在已经知道了编写测试类的基本步骤:
1>扩展TestCase类;
2>覆盖runTest()方法(可选);
3>写一些testXXXXX()方法;

Fixture
解下来的问题是,如果你要对一个或若干个的类执行多个测试,该怎么办?JUnit对此有特殊的解决办法。
如果需要在一个或若干个的类执行多个测试,这些类成为了测试的context。在JUnit中被称为Fixture(如testCar类中的 myCar 和 expectedWheels )。当你编写测试代码时,你会发现你花费了很多时间配置/初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不可取,因为我们要求执行多个测试,我并不希望某个测试的结果意外地(如果这是你要求的,那另当别论了)影响其他测试的结果。通常若干个测试会使用相同的Fixture,而每个测试又各有自己需要改变的地方。
为此,JUnit提供了两个方法,定义在TestCase类中。
protected void setUp() throws java.lang.Exception
protected void tearDown() throws java.lang.Exception
覆盖setUp()方法,初始化所有测试的Fixture(你甚至可以在setUp中建立网络连接),将每个测试略有不同的地方在testXXX()方法中进行配置。
覆盖tearDown()(我总想起一首叫雨滴的吉他曲),释放你在setUp()中分配的性资源,如数据库连接。
当JUnit执行测试时,它在执行每个testXXXXX()方法前都调用setUp(),而在执行每个testXXXXX()方法后都调用tearDown()方法,由此保证了测试不会相互影响。

TestCase
需要提醒一下,在junit.work.Assert类中定义了相当多的assert方法,主要有assert(), assert(), assertEquals(), assertNull(), assertSame(), assertTrue(), fail()等方法。如果你需要比较自己定义的类,如Car。assert方法需要你覆盖Object类的equals()方法,以比较两个对象的不同。实践表明:如果你覆盖了Object类的equals()方法,好也覆盖Object类的hashCode()方法。再进一步,连带Object类的toString()方法也一并覆盖。这样可以使测试结果更具可读性。
当你设置好了Fixture后,下一步是编写所需的testXXX()方法。一定要保证testXXX()方法的public属性,否则无法通过内省(reflection)对该测试进行调用。
每个扩展的TestCase类(也是你编写的测试类)会有多个testXXX()方法。一个testXXX()方法是一个测试。要想运行这个测试,你必须定义如何运行该测试。如果你有多个testXXX()方法,你要定义多次。JUnit支持两种运行单个测试的方法:静态的和动态的方法。
静态的方法是覆盖TestCase类的runTest()方法,一般是采用内部类的方式创建一个测试实例:
TestCase test01 = new testCar("test getWheels") {
public void runTest() {
testGetWheels();
}
}
采用静态的方法要注意要给每个测试一个名字(这个名字可以任意起,但你肯定希望这个名字有某种意义),这样你可以区分那个测试失败了。
动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名字是需要调用的测试方法的名字:
TestCase test01 = new testCar("testGetWheels");
JUnit会动态查找并调用指定的测试方法。动态的方法很简洁,但如果你键入了错误的名字会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静态的方法都很好,你可以按照自己的喜好来选择。(先别着急选择,后面还有一种更酷的方法等着你呢。)

上一页123456下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd