`

Junit测试(转载)

 
阅读更多
@Test(timeout=1000)
  public void selfXMLReader(){
    ……
}

  忽略测试方法

  JUnit 提供注解 org.junit.Ignore 用于暂时忽略某个测试方法,因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行。例如下面的代码便表示由于没有了数据库链接,提示 JUnit 忽略测试方法 unsupportedDBCheck:

@ Ignore(“db is down”)
@Test(expected=UnsupportedDBVersionException.class)
  public void unsupportedDBCheck(){
    ……
}

  但是一定要小心。注解 org.junit.Ignore 只能用于暂时的忽略测试,如果需要永远忽略这些测试,一定要确认被测试代码不再需要这些测试方法,以免忽略必要的测试点。

  测试运行器

  又一个新感念出现了——测试运行器,JUnit 中所有的测试方法都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器,但 JUnit 并没有限制您必须使用默认的运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),而且还可以为每一个测试类指定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要使用的运行器即可:

@RunWith(CustomTestRunner.class)
public class TestWordDealUtil {
……
}

  显而易见,如果测试类没有显式的声明使用哪一个测试运行器,JUnit 会启动默认的测试运行器执行测试类(比如上面提及的单元测试代码)。一般情况下,默认测试运行器可以应对绝大多数的单元测试要求;当使用 JUnit 提供的一些高级特性(例如即将介绍的两个特性)或者针对特殊需求定制 JUnit 测试方式时,显式的声明测试运行器就必不可少了。

测试套件

  在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。测试套件的写法非常简单,您只需要遵循以下规则:

  创建一个空类作为测试套件的入口。

  使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。

  将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。

  将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。

  保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。

package com.ai92.cooljunit;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
……
/**
* 批量测试 工具包 中测试类
* @author Ai92
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({TestWordDealUtil.class})
public class RunAllUtilTestsSuite {
}

  上例代码中,我们将前文提到的测试类 TestWordDealUtil 放入了测试套件 RunAllUtilTestsSuite 中,在 Eclipse 中运行测试套件,可以看到测试类 TestWordDealUtil 被调用执行了。测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件,这样可以很方便的分层管理不同模块的单元测试代码。但是,您一定要保证测试套件之间没有循环包含关系,否则无尽的循环就会出现在您的面前……。

参数化测试

  回顾一下我们在小节“JUnit 初体验”中举的实例。为了保证单元测试的严谨性,我们模拟了不同类型的字符串来测试方法的处理能力,为此我们编写大量的单元测试方法。可是这些测试方法都是大同小异:代码结构都是相同的,不同的仅仅是测试数据和期望值。有没有更好的方法将测试方法中相同的代码结构提取出来,提高代码的重用度,减少复制粘贴代码的烦恼?在以前的 JUnit 版本上,并没有好的解决方法,而现在您可以使用 JUnit 提供的参数化测试方式应对这个问题。

  参数化测试的编写稍微有点麻烦(当然这是相对于 JUnit 中其它特性而言):

  为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。

  为测试类声明几个变量,分别用于存放期望值和测试所用数据。

  为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。

  为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。

  编写测试方法,使用定义的变量作为参数进行测试。

  我们按照这个标准,重新改造一番我们的单元测试代码:

package com.ai92.cooljunit;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {
    private String expected;
  
    private String target;
  
    @Parameters
    public static Collection words(){
        return Arrays.asList(new Object[][]{
         {"employee_info", "employeeInfo"},    //测试一般的处理情况
         {null, null},              //测试 null 时的处理情况
         {"", ""},                //测试空字符串时的处理情况
         {"employee_info", "EmployeeInfo"},    //测试当首字母大写时的情况
         {"employee_info_a", "employeeInfoA"},  //测试当尾字母为大写时的情况
         {"employee_a_info", "employeeAInfo"}  //测试多个相连字母大写时的情况
        });
    }
  
     /**
     * 参数化测试必须的构造函数
     * @param expected  期望的测试结果,对应参数集中的第一个参数
     * @param target  测试数据,对应参数集中的第二个参数
     */
    public TestWordDealUtilWithParam(String expected , String target){
      this.expected = expected;
      this.target = target;
    }
  
     /**
     * 测试将 Java 对象名称到数据库名称的转换
     */
    @Test public void wordFormat4DB(){
      assertEquals(expected, WordDealUtil.wordFormat4DB(target));
    }
}

 很明显,代码瘦身了。在静态方法 words 中,我们使用二维数组来构建测试所需要的参数列表,其中每个数组中的元素的放置顺序并没有什么要求,只要和构造函数中的顺序保持一致就可以了。现在如果再增加一种测试情况,只需要在静态方法 words 中添加相应的数组即可,不再需要复制粘贴出一个新的方法出来了。

  JUnit 和 Ant

  随着项目的进展,项目的规模在不断的膨胀,为了保证项目的质量,有计划的执行全面的单元测试是非常有必要的。但单靠JUnit提供的测试套件很难胜任这项工作,因为项目中单元测试类的个数在不停的增加,测试套件却无法动态的识别新加入的单元测试类,需要手动修改测试套件,这是一个很容易遗忘得步骤,稍有疏忽就会影响全面单元测试的覆盖率。

  当然解决的方法有多种多样,其中将 JUnit 与构建利器 Ant 结合使用可以很简单的解决这个问题。Ant —— 备受赞誉的 Java 构建工具。它凭借出色的易用性、平台无关性以及对项目自动测试和自动部署的支持,成为众多项目构建过程中不可或缺的独立工具,并已经成为事实上的标准。Ant 内置了对 JUnit 的支持,它提供了两个 Task:junit 和 junitreport,分别用于执行 JUnit 单元测试和生成测试结果报告。使用这两个 Task 编写构建脚本,可以很简单的完成每次全面单元测试的任务。

  不过,在使用 Ant 运行 JUnit 之前,您需要稍作一些配置。打开 Eclipse 首选项界面,选择 Ant -> Runtime 首选项(见图7),将 JUnit 4.1 的 JAR 文件添加到 Classpath Tab 页中的 Global Entries 设置项里。记得检查一下 Ant Home Entries 设置项中的 Ant 版本是否在 1.7.0 之上,如果不是请替换为最新版本的 Ant JAR 文件。

图7 Ant Runtime 首选项



  剩下的工作就是要编写 Ant 构建脚本 build.xml。虽然这个过程稍嫌繁琐,但这是一件一劳永逸的事情。现在我们就把前面编写的测试用例都放置到 Ant 构建脚本中执行,为项目 coolJUnit 的构建脚本添加一下内容:

<?xml version="1.0"?>
<!-- =============================================
   auto unittest task  
   ai92                                
   ========================================== -->
<project name="auto unittest task" default="junit and report" basedir=".">
    <property name="output folder" value="bin"/>
    <property name="src folder" value="src"/>
  
    <property name="test folder" value="testsrc"/>
  
    <property name="report folder" value="report" />
    <!-- - - - - - - - - - - - - - - - - -
     target: test report folder init           
     - - - - - - - - - - - - - - - - - -->
    <target name="test init">
      <mkdir dir="${report folder}"/>
    </target>
  
    <!-- - - - - - - - - - - - - - - - - -
     target: compile           
     - - - - - - - - - - - - - - - - - -->
    <target name="compile">
      <javac srcdir="${src folder}" destdir="${output folder}" />
      <echo>compilation complete!</echo>
    </target>
    <!-- - - - - - - - - - - - - - - - - -
     target: compile test cases           
     - - - - - - - - - - - - - - - - - -->
    <target name="test compile" depends="test init">
      <javac srcdir="${test folder}" destdir="${output folder}" />
      <echo>test compilation complete!</echo>
    </target>
  
    <target name="all compile" depends="compile, test compile">
    </target>
  
    <!-- ========================================
     target: auto test all test case and output report file           
     ===================================== -->
    <target name="junit and report" depends="all compile">
      <junit printsummary="on" fork="true" showoutput="true">
        <classpath>
          <fileset dir="lib" includes="**/*.jar"/>
          <pathelement path="${output folder}"/>
        </classpath>
        <formatter type="xml" />
        <batchtest todir="${report folder}">
          <fileset dir="${output folder}">
            <include name="**/Test*.*" />
          </fileset>
        </batchtest>
      </junit>
      <junitreport todir="${report folder}">
        <fileset dir="${report folder}">
          <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${report folder}" />
      </junitreport>
    </target>
</project>


  Target junit report 是 Ant 构建脚本中的核心内容,其它 target 都是为它的执行提供前期服务。Task junit 会寻找输出目录下所有命名以“Test”开头的 class 文件,并执行它们。紧接着 Task junitreport 会将执行结果生成 HTML 格式的测试报告(图8)放置在“report folder”下。

  为整个项目的单元测试类确定一种命名风格。不仅是出于区分类别的考虑,这为 Ant 批量执行单元测试也非常有帮助,比如前面例子中的测试类都已“Test”打头,而测试套件则以“Suite”结尾等等。

  图8 junitreport 生成的测试报告



  现在执行一次全面的单元测试变得非常简单了,只需要运行一下 Ant 构建脚本,就可以走完所有流程,并能得到一份详尽的测试报告。您可以在 Ant 在线手册 中获得上面提及的每一个 Ant 内置 task 的使用细节。

  总结

  随着越来越多的开发人员开始认同并接受极限编程(XP)的思想,单元测试的作用在软件工程中变得越来越重要。本文旨在将最新的单元测试工具 JUnit 4 介绍给您,以及如何结合 IDE Eclipse 和构建工具 Ant 创建自动化单元测试方案。并且还期望您能够通过本文“感染”一些好的单元测试意识,因为 JUnit 本身仅仅是一份工具而已,它的真正优势来自于它的思想和j技术
分享到:
评论

相关推荐

    JUnit 5.pdf

    JUnit 5是JUnit的最新一代测试框架,它为Java平台上的开发者测试提供了最新的基础,特别专注于Java 8及更高版本的测试能力,并支持不同风格的测试方法。JUnit 5由三个不同子项目的组合构成,它们分别是JUnit ...

    软件测试基本方法(转载)

    源码级的单元测试可以帮助开发者快速定位和修复代码中的问题,常见的单元测试工具有JUnit(Java)、pytest(Python)和NUnit(.NET)等。 2. 集成测试:当多个单元组合在一起时,集成测试用于检查它们之间的交互和...

    Mastering Software Testing with JUnit 5 无水印pdf转化版

    Mastering Software Testing with JUnit 5 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,...

    Pragmatic Unit Testing in Java 8 with JUnit 无水印pdf

    Pragmatic Unit Testing in Java 8 with JUnit 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有...

    [转载]Selenium2.0之WebDriver学习总结(3).docx

    首先,我们导入所需的库,包括JUnit测试框架、Selenium WebDriver接口以及FirefoxDriver,以便于在Firefox浏览器中运行测试。在测试开始前,我们设置了一个隐式等待时间(30秒),以便WebDriver在找不到特定元素时...

    <转载>ThinkAndroid

    7. **测试支持**:为了保证代码质量,ThinkAndroid提供了单元测试和集成测试的工具和指导,如JUnit、Mockito和Espresso等,有助于开发者编写可验证的代码。 8. **工具集**:除了上述核心功能,ThinkAndroid还包含了...

    java简易版开心农场源码-unit-test-spock-demo:单元测试spock演示

    对于一些java新人来说,会用jUnit就是会写单元测试,高级点的会捣鼓一下testng,然后就认为自己掌握了单元测试。 而实际上,很多人不怎么会写单元测试,甚至不知道单元测试究竟是干什么的。写单元测试要比写代码要难...

    JBPM的开发指南,转载过来的

    通过JUnit测试流程的正确性,然后将流程部署到JBPM服务器。 ### 4. **API和工具** JBPM提供了一系列API和工具,如KieServices用于交互式操作,KieSession处理流程实例的生命周期,而JbpmConsole则是一个Web界面,...

    本项目是基于SpringBoot的线上宠物物资购买系统,为个人毕业设计,未经允许禁止转载.zip

    9. **单元测试与集成测试**:为了保证代码质量,项目中可能会包含JUnit或Spock等单元测试框架的测试用例,以及Spring Boot的Test Slice特性进行集成测试。 10. **持续集成/持续部署(CI/CD)**:开发者可能利用...

    JAVA OA平台源码(转载)SPRING BOOT....

    8. **测试**:Spring Boot支持单元测试和集成测试,可以使用JUnit、Mockito等工具进行测试。通过@SpringBootTest注解,可以启动一个Spring Boot应用实例来进行集成测试。 综上所述,这个开源项目提供了使用Spring ...

    高仿点评的android应用

    9. **单元测试和集成测试**:项目的质量控制可能包含了测试代码,学习如何编写JUnit测试和Espresso UI测试。 通过深入研究这个项目,开发者不仅可以提升Android应用开发的技能,还能了解到如何构建一个完整的、具有...

    webwork教程webwork教程webwork教程

    你可以使用JUnit或其他测试框架,结合WebWork的测试类库,编写针对Action的单元测试。这包括对Action方法的调用、预期结果的验证以及异常处理的测试。 本教程仅覆盖了WebWork的基本概念和入门知识,实战G-Roller-WW...

    IBE-master

    在压缩包子文件的文件名称列表中,虽然没有具体的文件名给出,但通常一个完整的Java项目会包含源代码文件(.java)、编译后的类文件(.class)、配置文件(如XML)、测试文件(JUnit测试)和其他支持文件(如README...

    抽奖软件java

    9. **程序测试**:代码已经测试并确认无误,这意味着开发者可能使用了JUnit等单元测试框架,对软件的关键功能进行了测试,确保其正确运行。 10. **版权和出处**:描述中提到转载请声明出处,这是对原创工作的尊重,...

    6_安卓学生管理源码_

    10. **单元测试和集成测试**:如果源码包含了测试代码,说明开发者可能对软件质量有一定的要求,使用JUnit或Espresso进行功能验证。 通过学习和理解这个源码,开发者不仅可以提升Android应用开发技能,还能了解到...

    word源码java-csdn-blogs:这是一个存储我的csdn博客的存储库

    13. 测试:单元测试、集成测试,JUnit、Mockito等工具的使用。 博主可能通过Word文档的形式,结合代码示例,详细解释了这些概念和实践,帮助读者理解并掌握Java编程及其在实际项目中的应用。对于初学者来说,这是一...

Global site tag (gtag.js) - Google Analytics