`
djsl6071
  • 浏览: 593453 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

测试实践:Eclipse 之 JUnit

阅读更多
测试实践:Eclipse 之 JUnit<!---->

<!---->21newtimes@163.net

转自:http://www.uml.org.cn/Test/200504084.htm<!---->

<!---->
    自动化测试(automated testing)在好多书籍中被介绍了,但很少注意讲怎样去组织这些测试。 当测试写的越多时,很难知道把这些测试放到哪或者用什么去调用它们。 在极限编程---Extreme Programming(xp),测试驱动开发 Test-Driven Development (TDD)盛行的时代,这成了一个很大的问题。 你可以把 测试驱动开发(TDD)认为是"Development through testing" 开发由经测试。

 TDD的主要条款:

  • 在任何代码片段之前,必须先写好自动检测这段代码功能的程序。既然代码不存在,那么测试在一开始就失败。
  • 在 测试通过之后,复制的代码必须删掉。

 象这样的方式每个程序员都可以应用,并不需要特定的方法论。但在我们开始写test之前, 值得我们注意的是,先考虑一下如何组织自动化测试。这里有几种我们需要考虑的测试

  • 单元测试(Unit test) :这些是为检查个别模块(比如classes类)服务的。 如果对象需要访问外部的数据源,比如Database,就需要通过一些模拟的对象(MOCK object)来模拟Database, (但这也只有在真实环境的数据与测试环境不同的时候。 比如测试环境里面没有真实Datebase,就需要MOCK Object)
  • 用户测试 (Customer's test):这里是功能的,系统的并且认可的测试。系统中所有的行为检查都做为一个整体。 在XP理论中,这些测试,是由用户编写的,给出测试案例提纲。
  • 集成测试 (Itegration tests): 这些测试象是在用户测试和单元测试之间的十字路口。 集成测试帮助程序测试几个级别中交互。 ,Mock Object不会出现在集承测试中,他会增加测试时间。同样,集成测试也经常需要存在的特定的测试环境,比如从数据库中放一些测试数据。集成测试也许使用外部的lib。 Cactus就是这样一个J2EE集成的lib。 解释这些测试已经超出了本篇文章的范围,并需详细的理论叙述,所以,你仅需要知道这种测试存在就可以了。
  • 开发测试(Developer's test) : 这种测试就是那些开发者校验 整段代码,新加的代码,新加的函数函数。 对于每个开发而言, 随时生成新的的测试去检查代码是很重要的。 组织这些测试和组织这些代码有着同样的重要性。至于本文其他地方,只要说到"测试",就是专指开发测试(Developer's test)。 在开发期间, 一个程序员有时可能问自己:系统中这个行为有test么,这个test存在么,哪里可以找到这个test?每次发现错误,都是靠最基础修改bug而不是通过自动测试,这是一个典型的例子。 在这种形下事情进展可能是:
  1. 去找到这个函数的测试(可能测试已经写了,但里面还有一些小错误)
  2. 如果这样的测试还没有,或者测试不能盖住这种错误,我们就写一个新的测试来盖住这种错误。
  3. 现在 我们深信,程序在新的测试中不会通过。
  4. 修复程序中的bug。
  5. 再运行测试
  6. 确定程序在测试中通过了。

 当然,可能出现各种各样的处理, 但思想必须很明确:你只需纠正那些被测试找出那些错误。现在,让我们告诉你一个开发人员怎样解决这种情形。 通过存在的功能性的测试

  • 我利用一些集成的开发环境(IDE)来查找 被修正那些类和方法的放在什么地方。
  • 制造一个已知的错误环境,来查找那些代码判断存在错误。
  • 最后但不是最不重要的,写好测试并且放到一个现有的测试类中去。 如果你不小心出了错误, 期望你和你的同事能注意到副本,并且纠正它

 都准就绪,开始建立测试了, 所以现在需要给测试取一个名称。 你可能说,“这不是问题: 在每个类面前加个Test就是了!” 但并不是那么简单的, 让我告诉你这样如果可能造成的问题:

 

  • 当时候我们在使用TDD的方式开发时, 需要测试的class或者method可能都不存在。

 

  • 也可能一个test 含盖了好几个方法,甚至好几个classes。

 

 这些仅仅是最普通的问题, 下面还有更多。

 给个在test命名上的建议: test 类的取名首先应该表达出这个类是一个test类,并且能确切的表示出他要检查哪些,留有这个原class名的味道。 其实这很容易,请别担心这个名称会变的很长或者很丑陋,自己随便怎样取都可以。

 下面我们将使用Eclipse中的JUnit工具建立我们的第一个测试,假定你已经下载了这个产品的当前版本, 如果没有,你随时可以从它的官方网站(www.eclipse.org)下载。我们需要JUnit,你也可以从它的官方网站(www.junit.org)上下载,下载并解压缩到你硬盘中存放java libaries的地方。

 打开Eclipse.我们将建立一个新的工程的工作空间(workplace project) 点 File -> New ->Project,选择Java一路Next。 输入工程名称(project name),比如ProjectWithJUnit. 点击完成。 这样就建立了一个新工程,让我们配置一下我们的Eclipse,于是,我们把JUnit library 添加到build path. 点击 Project-->Properties, 选择Java Build Path Libraries, 点Add Exteranal JARs 选中JUnit.jar。 你将会看到JUnit将会出现在的屏幕上 libraries列表中。 点Okay,Eclipse将强制rebuild所有的buildpaths.

 我们已经准备好,开始写我们的"Hello World"了 . 让我们遵照TDD规范:在编码之前就建立测试。为了, 我们将假顶我们将要写的类名是HelloWorld 有一个返回字符串的方法 say().

 要建立这样一个test, 在ProjectWithJUnit标题上右键, 选择New -> Other,展开"Java", 选择JUnit. 在对话框的右边一拦里选择TestCase,接着点Next. 参见图1。

 图1。 在Eclipse 中建立JUnit test

 

在Test class:一拦里输入我们需要测试的class--HelloWorld。并且给Test case取个名称--- 比如,TestThatWeGetHelloWorldPrompt(是的,这看上去太长了,但是它能很清楚表达出它的意思) 点Finish完成。

 下面是 TestThatWeGetHelloWorldPrompt.java的代码:

  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. (TestCase 在JUnit的javadoc里定义是"用来运行多个Test的固定装置")。 JUnit也定义了TestSuite 由于一组关联的TestCase组成..


    通过以下两步来建立我们简单的Test Case;
  1. 建立Junit.framework.TestCase的实例.
  2. 定义一些 以"test"开头的测试函数, 并且返回一空值.(比如 testWasTranscationSuccessful(),testShow()等等).

 TestThatWeGetHelloWorldPrompt.java 同时遵循这些标准: 这些TestCase的子类含有一个testSay()的方法. 这个方法由assertEquals()方法调用, 用于检验say()的返回值(按照这里的做法返回应该是不一致,因为一开始建立的HelloWorld 我们让say()返回的值是null).

 main()主函数是用来运行test并且显示输出的结果. JUnit的TestRunnery以(swing.u)图形和本文(text.ui)的的方式来执行我们的test并反馈信息。我们就使用文本(text.ui),这个Eclipse肯定支持. (译注:这里可能翻译的不怎么好,所谓文本和图形,是指你在建立TestCase的时候,有一个选项,Which method stubs would you like to create,选择text.ui|| swing.ui||awt.ui,一般是选择text.ui因为Eclipse肯定支持这个), 依照这些文本的信息,Eclipse同时会生成图形显示。(在Package Exploer的下面Tab条上会多个JUnit,点它就看到了:)。

 又一个所以,按照现在这样测试驱动的开发的做法, 一旦我们跑起了我们的test,我们应该看到返回一些错误的信息。 点Run-> Run as -> JUnit Test(注意啊, 这个TestThatWeGetHelloWorldPrompt.java应该在Package Explorer被点中,在左边那个window中),你点到的因该是JUnit window(就是下面的那个Tab条,注意不是Package Exploer),这样你就看到了JUnit window, 他会显示一个红色条,表示是一个失败的Test。 (如果你按了运行它没有自动转到这个窗口,你可以点做下Tab条 上的JUnit标签。)

一按运行, 太好了,果然出错了。好,现在正式开始建立用于工作的HelloWorld代码,---点New->Class,可能和原来的的重复,那就把原来的删掉。代码如下:

 HelloWolrd.java

public class HelloWorld {

    public String say() {
        return("Hello World!");

    }

}

 这及为简单的,都用不着注释。现在再来测试一下看看结果。就用上面的方法,点Run-> Run As Jnit. 在左边的JUnit窗口中出现了一个绿条。 看图三。 出现绿色的条表示测试通过了。

现在,再变个条件,让测试不通过。 这将帮助我们理解JUnit test怎样覆盖并且报出不同的错误。 编辑 assertEquals()方法,把它的返回值从"Hello World!"变成另外一个值 比如"Hello ME!". 这样,当你再运行这个JUnit test,那个显示条又变成红的了,并且在Failuer Trace里看到是不是什么导致了错误。 如图:

 

总结。我想说一些自己的想法(这里还是原文不是翻译过来的)。 我过去并不认为测试代码是开发过程中很重要的一部分。 但在最近几年发展的很快,多亏了那些方法论(比如基于异常开发"exceptions-based development"等),他们促进了测试以及测试工具的发展。

如果你对本文感兴趣, 您可以花点时间正式的学习一下测试理论,把它应用到你的工作中去。.

分享到:
评论

相关推荐

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    eclipse下利用ant、junit进行自动化测试例子源码

    通过研究和实践这个例子,开发者不仅可以掌握ANT和JUnit的基本用法,还能了解如何在Eclipse中整合这两个工具,实现高效、自动化的测试流程。这对于提升个人或团队的软件开发质量和效率都具有重要意义。

    Eclipse中使用Junit插件测试

    在软件开发过程中,单元测试是保证代码质量的关键步骤。Eclipse作为一个流行的Java集成开发环境,内置了对JUnit的支持,使得开发者可以...这种持续的测试实践确保了软件的稳定性和可维护性,有助于构建高质量的代码。

    eclipse中junit测试实例

    在提供的压缩包“JUNIT测试实例”中,可能包含了详细的文档和源码示例,你可以参考这些材料进一步学习如何在Eclipse中编写和运行Junit测试,理解测试用例的编写方法,以及如何通过测试驱动开发(TDD)提升代码质量。...

    junit-libs:junit测试包

    4. TDD(测试驱动开发)与JUnit: - 测试驱动开发是一种编程实践,先编写测试用例,然后编写刚好能让测试通过的代码。JUnit是TDD的重要工具,帮助开发者确保代码的质量。 5. 集成测试工具: - JUnit与Mockito结合...

    在Eclipse中使用JUnit4进行单元测试(转)

    在Eclipse中使用JUnit4进行单元测试是一种常见的开发实践,它可以帮助程序员确保代码的质量和可靠性。JUnit4是Java编程语言中最流行的单元测试框架之一,它提供了丰富的注解、断言和测试工具,使得测试过程更加简洁...

    使用eclipse与Junit4进行单元测试的最简单例子(包括文档与源码)

    Eclipse是一款广泛使用的Java集成开发环境(IDE),而JUnit则是Java编程语言中主流的单元测试框架。本教程将详细介绍如何在Eclipse中使用JUnit4进行最基础的单元测试,同时提供相关文档和源码供学习参考。 首先,...

    软件测试与Junit实践

    本篇文章将深入探讨软件测试的重要性和JUnit的实践应用。 首先,理解软件测试的重要性。测试是为了确保软件功能的正确性、性能、可靠性以及兼容性。通过测试,我们可以尽早发现并修复问题,避免潜在的bug在生产环境...

    软件测试与Junit实践.rar

    2. 安装与配置:JUnit通常作为IDE(如Eclipse、IntelliJ IDEA)的插件安装,通过简单的设置即可开始编写测试代码。 三、JUnit核心概念 1. 测试类与测试方法:每个测试类通常对应一个被测试的类,每个测试方法用于...

    软件测试规范 软件工程 测试 Junit Eclipse

    本文将深入探讨“软件测试规范”、“软件工程”、“测试”以及“Junit”和“Eclipse”在其中的应用,这些都是构建高效、可靠的软件系统的关键要素。 首先,软件测试规范是一套详细指导测试过程的规则和标准,它定义...

    软件测试与Junit实践 pdg

    同时,良好的测试实践也能促进代码的模块化和可读性,降低维护成本。在实际项目中,应当结合TDD(测试驱动开发)理念,先编写测试再实现功能,确保代码质量从一开始就得到保障。 总之,软件测试是保障软件质量的...

    软件测试与junit实践Java测试

    通过集成到IDE如Eclipse、IntelliJ IDEA中,开发者可以快速运行测试,查看测试报告,定位并解决问题。 在使用JUnit进行测试时,有以下几点关键知识点: 1. **创建测试类和测试方法**:每个测试类对应于被测试的...

    junit单元测试实验

    本文将通过一个经典的案例,讲解如何使用JUnit结合Eclipse进行单元测试。 知识点1:什么是单元测试 单元测试是软件测试的一种,它专门针对软件中的最小单元(通常是类或方法)进行测试。单元测试的目的是为了确保...

Global site tag (gtag.js) - Google Analytics