天天看点

在Eclipse中使用JUnit

这篇文章将向你介绍junit,一个用来在项目中进行测试和调试的工具。在介绍完tdd(以测试驱动开发)理论后,将进一步讲解怎样在流行的eclipse中建立你自己的junit测试。向你展示如何测试hello world这样简单的程序。

    许 多书上都讨论了自动测试,但是只有很少的著作注意到这么一个问题,那就是怎样把这些测试组织起来。随着测试的增加,放置和调用这些测试却变得更加麻烦。这 将成为一个重要问题,以至于出现了tdd,极限编程(xp)使tdd得以普及。另外,你可以这样理解tdd:通过测试来开发。

    tdd的主要规范:

    在编写程序代码之前,与之对应的自动测试必须被写好。甚至程序代码并不存在,那也要看见一个失败的测试结果。

    在测试通过后,副本代码必须被丢弃。

    有一个具体步骤(可能指的是《extreme programming》)可以被任何一个程序员来参考,而不需要特殊的其他方法。在我们开始写测试之前,这些步骤(章节)应该被首先阅读——怎样组织自动测试。

    讲解一下不同种类的测试:

    单元测试:检测模块(也就是类)的正确性。如果对象需要访问外部的数据资源,例如数据库,就需要模拟一个mock objects,但在实际中真实数据与测试环境是不同的。

    客户测试:这是功能性、系统、和验收测试。用来测试整体的系统特性。在xp中,这些测试由用户编写。

    开发人员测试:这是用来让开发人员检验自己代码或新函数的。对于每一个开发人员,只要有可能,就需要有更多的测试来检验代码。组织这些测试和组织程序代码一样重要。

    在以下章节,只要提到“测试”,那就指的是开发人员测试。

    我们几乎准备好开始建立测试了,先应该为我们的测试选择名字。你也许会说,“这不是问题:把‘test’这个字放在类名前面,就好了!”不会这么快!让我来说一下这个步骤存在的问题:

    在tdd中,被测试的类或者方法还不存在。

    一个测试能够覆盖多个方法,甚至多个类,这是可能的。

    以上只是一些普遍问题;还存在更多的问题。

    让我来提一个建议,在测试命名时:测试类的名字应该让人一眼就知道这是一个测试类,且能说明它要测试什么,注意是否和其他类重名。按照以上建议做,就很简单了,也不用担心名字太长或难听。

    即 将在eclipse中用junit工具创建我们第一个测试了。假设你已经下载了一个最新的eclipse版本。如果还没有,你应该去官方站点 http://www.eclipse.org下载。还需要junit,也可以从http://www.junit.org/下载。

    运行eclipse。新建一个workplace项目,点击文件->新建->项目,选择java项目,点击下一步。起一个项目名称,例如projectwithjunit。点击完成。这样就完成新项目的建立了。再来配置一下eclipse,在构建路径中添加junit类库。在工具条上点击项目->属性,选择java构建路径,库,选择添加外部jar,浏览junit被存储的目录,选择junit.jar,点击打开。你将会看见junit出现在库的列表中。点击确定,让eclipse重建路径。

    现在开发我们的“hello world”例子。按照tdd的规则,应该在代码建立以前先把测试写好。为了能够在某出开始,我们假设未来的类名是helloworld,并且有一个方法say(),这个方法返回string的值(例如“hello world!”)。

    建立测试,在projectwithjunit的标题上面点击右键,选择新建->其他,展开“java”选项,选择junit。在右边的栏目对话框中选择测试案例,然后下一步。参考图1。

在Eclipse中使用JUnit

                    图1. 在eclipse中建立junit测试

    在测试类这一栏中,写上将要被测试的类名helloworld。选择一个测试案例的名字,例如testthatwegethelloworldprompt(是的,看上去很长,但是很清楚它的行为。)点击完成。

    testthatwegethelloworldprompt的代码如下:

    import junit.framework.testcase;

    public class testthatwegethelloworldprompt

    extends testcase {

        public testthatwegethelloworldprompt(

            string name) {

            super(name);

        }

        public void testsay() {

            helloworld hi = new helloworld();

            assertequals("hello world!", hi.say());

        public static void main(string[] args) {

            junit.textui.testrunner.run(

                testthatwegethelloworldprompt.class);

    }

    代码并不复杂;只是有点与众不同。然而,让我们考察一下细节。我们继承了junit的testcase类,它在junit的javadocs定义为“运行众多测试的夹具。”junit也有testsuite类,它是一组测试案例的集合,但在本文中不做讨论。

    建立测试案例的步骤如下:

    1、建立一个junit.framework.testcase的实例。

    2、定义一些以“test”开头的无返回方法(例如testwastransactionsuccessful(),testshow(),等等)。

    testthatwegethelloworldprompt.java包含这些:testcase的子类和一个叫做testsay()的方法。这个方法调用了assertequals()函数,它用来比较我们预期的值和由say()返回的值。

    main() 方法用来运行测试和显示输出的。junit的testrunner处理测试,提供基于图像和文本的输出表现形式。我们使用基于文本的版本,因为 eclipse支持它,且也适合我们。当开始运行后,基于文本的版本测试会以文本形式输出,eclipse会把这些输出自动变成图像界面的输出。

    按照tdd规范,首次运行测试,应该故意让它失败。点击运行->运行为->junit测试(记住testthatwegethelloworldprompt.java应该被突出的显示在包资源管理器中)。在左边窗口,应该看见junit窗口而不是包资源管理器,它显示一个红条,一次失败的测试,具体的失败原因参看图2。如果没有自动显示这些内容,点击junit标签(在底部的左边)。

在Eclipse中使用JUnit

                    图2. junit中失败的测试

    很好!的却失败了。现在我们来建立被测试代码:在包资源管理器窗口的projectwithjunit标题上右击,选择新建->类。选择类名,我们已经假设了它叫helloworld,然后直接点击完成。为helloworld.java填入下列代码:

        public class helloworld {

            public string say() {

                return("hello world!");

            }

    这段代码很简单,甚至不需要注解,我们再来看看结果。按照上面描述过的方式,在junit的窗口中显示了一个绿条,参看图3。绿条证明测试成功。

在Eclipse中使用JUnit

                     图3. junit中成功的测试

    现在,我们想再让测试失败一次,但原因不同。这有助于展示junit测试中不同的报错信息。修改assertequals()代码,把“hello world!”变成“hello me!”。当再次运行junit时,结果变成了红条,在junit窗口的底部输出了失败原因,参看图4。

在Eclipse中使用JUnit

                    图4. junit中的comparisonerror

    最后,我想说一下关于测试是开发过程中的必要部分的话题。测试代码一直是开发中的重要部分。经过近几年的发展,已得到了很大的提高,这要归功于强大的理论研 究(比如“expectations-based development”等等),和快速发展的测试工具包,还有测试过程的改进。如果你对这篇文章感兴趣,那请你花一些时间来正式的学习一下测试理论吧, 这对你的工作很有用。

本文出自seven的测试人生公众号最新内容请见作者的github页:http://qaseven.github.io/