`
xyheqhd888
  • 浏览: 403709 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

Junit简介

阅读更多

1. 单元测试(Unit Test)

    一个单元(Unit)是指一个可独立进行的工作,独立进行指的是这个工作不与程序运行时的上下文发生关系。如果是在Java程序中,具体来说一个单元可以是指一个方法(Method)。这个方法不依赖于前一次运行的结果,也不牵涉到后一次的运行结果。举例来说,下面这个程序的gcd()方法可视为一个单元:

package ysu.hxy;

public class MathTool 
{
	public static int gcd(int num1,int num2)
	{
	     int r = 0;
		 while(num2 !=0)
			{
				r = num1 % num2;
				num1 = num2;
				num2 = r;
			}
			return num1;
	}
}

 但下面的gcd()方法不可视为一个单元,要完成gcd的计算,必须调用setNum1()和setNum2()与gcd()3个方法。

package ysu.hxy;

public class MathTool 
{   
	private static int num1;
	private static int num2;

	public static void setNum1(int n)
	{
		num1 = n;
	}

	public static void setNum2(int n)
	{
		num2 = n;
	}

	public static int gcd()
	{
	     int r = 0;
		 while(num2 !=0)
			{
				r = num1 % num2;
				num1 = num2;
				num2 = r;
			}
			return num1;
	}
}

 

      然而要完全使用一个方法来完成一个单元操作在实现上是有困难的,所以,单元也可广义解释为数个方法的集合。这数个方法组合为一个单元操作,目的是完成一个任务。

       不过设计时仍优先考虑将一个公开的方法设计为单元,辅助的方法则使用设定为私用,尽量不用数个公开的方法来完成一件工作,以保持接口简洁与单元边界清晰。将工作以一个单元进行设计,这使得单元可以重用,并且也使得单元可以进行测试,进而增加类的可重用性。

       单元测试指的是对每个工作单元进行测试,了解其运行结果是否符合我们的要求。例如当编写完MathTool类之后,也许会这么写一个小小的测试程序:

package test.ysu.hxy;

import onlyfun.caterpillar.MathTool;

public class MathToolTest {
    public static void main(String[] args) {
        if(MathTool.gcd(10, 5) == 5) {
            System.out.println("GCD Test OK!");
        }
        else {
            System.out.println("GCD Test Fail!");
        }
    }
}

      在文字模式下使用文字信息显示测试结果,必须一行一行看着测试程序的输出结果,以了解测试是否成功;另一方面,测试程序本身也是一个程序,在更复杂的测试中,也许会遇到测试程序本身出错,而导致无法验证结果的情况。

      JUnit是一个测试框架,通过它所提供的工具,可以减少编写错误的测试程序的机会。另一方面,可以有更好的方法来检验测试结果,而不是看着一长串输出的文字来检验测试是否成功。JUnit测试框架让测试的进行更有效率且更具可靠性。

 

2. JUnit设置:

    JUnit最初是由Erich Gamma与Kent Beck编写,为单元测试的支持框架,用来编写与执行重复性的测试。包括以下特性:

    (1) 对预期结果做判断

    (2) 提供测试装备的生成与销毁

    (3) 易于组织与执行测试

    (4) 图形与文字接口的测试器

    JUnit官方网站:http://junit.org/

 

3. 第一个JUnit测试:

 要对程序进行测试,首先要设计测试案例(Test Case)。一个测试案例是对程序给予假定条件,然后运行程序并看看在给定的条件下,程序的运行结果是否符合要求。在JUnit下,可以继承TestCase来编写测试案例,并定义测试方法,每个测试方法是以TestXXX()来命名,一个例子如下所示:

package test.ysu.hxy;

import ysu.hxy.MathTool;
import junit.framework.TestCase;

public class MathToolUnitTest extends TestCase
{
	public void testGcd()
	{
		assertEquals(5,MathTool.gcd(10,5));
	}

    public static void main(String[] args)
	{
		junit.textui.TestRunner.run(MathToolUnitTest.class);
	}
}

assertEquals()方法用来断定您的预期值与单元方法实际的返回结果是否相同,如果预期值与返回的结果不同则丢出异常,TestRunner会捕捉异常,并提取其中的相关信息以报告测试结果。这里使用的是文字模式的TestRunner。

 

   接下来根据测试案例编写实际的程序,首先试着让测试案例能通过编译:

 

package ysu.hxy;

public class MathTool
{
	public static int gcd(int num1,int num2)
	{
		return 0;
	}
}

 编译完MathTool.java并用javac来编译它。在编译完成之后,接着运行测试安全,会得到以下信息:

D:\Java_Test>java test.ysu.hxy.MathToolUnitTest
.F
Time: 0.016
There was 1 failure:
1) testGcd(test.ysu.hxy.MathToolUnitTest)junit.framework.AssertionFailedError: e
xpected:<5> but was:<0>
        at test.ysu.hxy.MathToolUnitTest.testGcd(MathToolUnitTest.java:10)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at test.ysu.hxy.MathToolUnitTest.main(MathToolUnitTest.java:15)

FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0

 

由于MathTool中并没有编写什么实际的逻辑,所以测试失败。在测试驱动中,测试案例所报告的结果通常是以测试失败作为开始,您的挑战就是要一步步消除这些失败的信息。接下来根据测试安全,完成所设计的程序:

package ysu.hxy;

public class MathTool
{
	public static int gcd(int num1,int num2)
	{
		int r = 0;
		while(num2 != 0)
		{
			r = num1 % num2;
			num1 = num2;
			num2 = r;
		}
		return num1;
	}
}

 编译之后再次运行测试案例,会得到以下的结果,通过最后的OK信息,知道测试已经成功:

D:\Java_Test>java test.ysu.hxy.MathToolUnitTest
.
Time: 0.016

OK (1 test)

 

  不一定要在main()中指定TestRunner,而可以直接启动一个TestRunner,并指定测试案例类(继承TestCase的类),例如启动一个Swing窗口的测试结果画面

                  java junit.swingui.TestRunner test.ysu.hxy.MathToolUnitTest

    在Swing窗口的测试结果显示中,如果中间的横棒是显示绿色,表示所有的测试都已经成功,如果中间的横棒显示红色,表示测试失败。JUnit的名言是Keep the bar green to keep the code clean,意思是保持绿色横棒以保证测试成功。

    也可以指定文字模式的测试结果。例如:

    java junit.textui.TestRunner test.ysu.hxy.MathToolUnitTest.

4. 自动构建与测试:

    Ant可以进行自动化构建,而JUnit可以进行自动化测试,Ant可以与JUnit结合,使得自动化的构建与测试变得可行。如果要让Ant能支持JUnit,建议直接将JUnit的junit.jar放置在Ant的lib目录,并记得改变Classpath中原先有关junit.jar的设定。例如将Classpath重新指向%ANT_HOME\lib\junit.jar。

    Ant使用<junit>标签来设定JUnit测试,下面是个简单的例子:

<?xml version="1.0"?>
<project name="autoBuildTest" default="test">
  <target name="setProperties">
     <property name="src.dir" value="src"/>
	 <property name="classes.dir" value="classes"/>
  </target>

  <target name="prepareDir" depends="setProperties">
     <delete dir="${classes.dir}"/>
	 <mkdir dir="${classes.dir}"/>
  </target>

  <target name="compile" depends="prepareDir">
     <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
  </target>

  <target name="test" depends="compile">
    <junit printsummary="yes">
	    <test
		   name="test.ysu.hxy.MathToolUnitTest"/>
		<classpath>
		   <pathelement location="${classes.dir}"/>
		</classpath>
	</junit>
  </target>
</project>

 printsummary属性会将测试的结果简单地显示出来,<test>的name属性是设定所要进行测试的测试案例类。Ant构建与调用JUnit进行测试的信息如下(需要把上面的MathTool类及MathToolUnitTest放在D:\java_test):

D:\Java_Test\B>ant
Buildfile: build.xml

setProperties:

prepareDir:
   [delete] Deleting directory D:\Java_Test\B\classes
    [mkdir] Created dir: D:\Java_Test\B\classes

compile:
    [javac] Compiling 3 source files to D:\Java_Test\B\classes

test:
    [junit] Running test.ysu.hxy.MathToolUnitTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.016 sec

BUILD SUCCESSFUL
Total time: 1 second

  

5. 自动生成测试报告:

    接上一个主题,可以将JUnit的测试过程在Ant构建过程中显示出来,只要加入<formatter>标签设定即可:

<?xml version="1.0"?>
<project name="autoBuildTest" default="test">
  <target name="setProperties">
     <property name="src.dir" value="src"/>
	 <property name="classes.dir" value="classes"/>
  </target>

  <target name="prepareDir" depends="setProperties">
     <delete dir="${classes.dir}"/>
	 <mkdir dir="${classes.dir}"/>
  </target>

  <target name="compile" depends="prepareDir">
     <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
  </target>

  <target name="test" depends="compile">
      <junit printsummary="yes">
	     <formatter type="plain" usefile="false"/>
		 <test
		   name="test.ysu.hxy.MathToolUnitTest"/>
		 <classpath>
		     <pathelement location="${classes.dir}"/>
		 </classpath>
	  </junit>
   </target>
</project>

 

  Ant构建与调用JUnit进行测试的信息如下:

D:\Java_Test\B>ant
Buildfile: build.xml

setProperties:

prepareDir:
   [delete] Deleting directory D:\Java_Test\B\classes
    [mkdir] Created dir: D:\Java_Test\B\classes

compile:
    [javac] Compiling 3 source files to D:\Java_Test\B\classes

test:
    [junit] Running test.ysu.hxy.MathToolUnitTest
    [junit] Testsuite: test.ysu.hxy.MathToolUnitTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.016 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.016 sec
    [junit]
    [junit] Testcase: testGcd took 0 sec

BUILD SUCCESSFUL
Total time: 1 second

 

当usefile属性设定为true时,会自动将产生的结果保存在文件中,默认是TEST-*.txt中。其中*是测试案例类名称。就上例而言,将usefile设置为true时,所产生的报告文件内容如下:

文件名:TEST-test.ysu.hxy.MathToolUnitTest.txt

Testsuite: test.ysu.hxy.MathToolUnitTest
Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.016 sec

Testcase: testGcd took 0.016 sec

   <formatter>标签还可以设定将测试的结果,以XML文件保存下来。一个编写的例子如下,它将测试的结果保存至report目录中,文件名称为TEST-*.xml,*是测试案例类名称:

 

<target name="test" depends="compile">
      <junit printsummary="yes">
	     <!-- <formatter type="plain" usefile="true"/> -->
         <formatter type="xml"/>
		 <test
		   name="test.ysu.hxy.MathToolUnitTest"/>
		 <classpath>
		     <pathelement location="${classes.dir}"/>
		 </classpath>
	  </junit>
   </target>

 也可以将测试结果所产生的XML文件转换为HTML文件,使用Ant可以直接完成这个工作。<junitreport>标签使用XSLT将XML文件转换为HTML文件。下面的例子将前面的说明作个总结,以完整呈现编写的实例:

<?xml version="1.0"?>
<project name="autoBuildTest" default="report">
   <target name="setProperties">
      <property name="src.dir" value="src"/>
	  <property name="classes.dir" value="classes"/>
	  <property name="report.dir" value="report"/>
   </target>

   <target name="prepareDir" depends="setProperties">
      <delete dir="${report.dir}"/>
	  <delete dir="${classes.dir}"/>
	  <mkdir dir="${report.dir}"/>
	  <mkdir dir="${classes.dir}"/>
   </target>

   <target name="compile" depends="prepareDir">
      <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
   </target>

   <target name="test" depends="compile">
      <junit printsummary="yes">
	     <formatter type="xml"/>
		 <test
		    name="test.ysu.hxy.MathToolUnitTest"/>
		 <classpath>
		     <pathelement location="${classes.dir}"/>
		 </classpath>
	  </junit>
   </target>

   <target name="report" depends="test">
      <junitreport todir="${report.dir}">
	     <fileset dir="${report.dir}">
		    <include name="TEST-*.xml"/>
		 </fileset>
		 <report
		   format="frames" todir="${report.dir}/html"/>
	  </junitreport>
   </target>
</project>

  <include>设定搜寻TEST-*.xml文件,将之转换为HTML文件,而最后的结果被设定保存至report/html/目录下,在format属性中设定了HTML文件具有边框(Frame),如果不设定这个属性,则HTML报告文件就不具有边框。在运行Ant之后所产生的命令行的报告文件如下:

 

D:\Java_Test\B>ant
Buildfile: build.xml

setProperties:

prepareDir:
   [delete] Deleting directory D:\Java_Test\B\report
   [delete] Deleting directory D:\Java_Test\B\classes
    [mkdir] Created dir: D:\Java_Test\B\report
    [mkdir] Created dir: D:\Java_Test\B\classes

compile:
    [javac] Compiling 3 source files to D:\Java_Test\B\classes

test:
    [junit] Running test.ysu.hxy.MathToolUnitTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.109 sec

report:
[junitreport] Processing D:\Java_Test\B\report\TESTS-TestSuites.xml to C:\DOCUME
~1\hexinyu\LOCALS~1\Temp\null1020408655
[junitreport] Loading stylesheet jar:file:/D:/apache-ant/apache-ant-1.7.0/lib/an
t-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
[junitreport] Transform time: 953ms
[junitreport] Deleting: C:\DOCUME~1\hexinyu\LOCALS~1\Temp\null1020408655

BUILD SUCCESSFUL
Total time: 2 seconds

 

在D:\Java_Test\B\report\html目录下有HTML文件,这些文件在下面的附件中。

分享到:
评论

相关推荐

    Junit简介和扩展

    Junit使用指南和扩展指南

    JUnit简介java单元测试框架

    JUnit是一个开源的java单元测试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完成。这两个牛人中 Erich Gamma 是 GOF 之一;Kent Beck 则在 XP 中有重要的贡献(你觉得眼熟一点都不奇怪)

    Java 开源测试工具 JUnit 简介

    作者不明 内附Junit内部代码分析与详细的测试用例分析

    junit简介。。。。。。

    刚下载的。。。。。。。。。。。。。。。。。。

    JUnit

    JUnit 简介 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样...

    一些常用的junit方面API备忘录

    一些常用的junit方面API备忘录一些常用的junit方面API备忘录

    Junit 测试

    1.Junit简介 2.JUnit核心 3.Junit的框架组成 4.断言 5.Junit集成模式

    junit-tests:jUnit简介和测试遗留代码

    使用JUnit测试旧版代码 入门 分叉此存储库以在您自己的GitHub帐户上创建副本。 确保您的浏览器在您自己的帐户的自己的存储库列表中显示此项目。 单击右侧的绿色按钮,显示“克隆或下载”。 克隆地址应类似于git@...

    JUnit--单元测试工具

    JUnit 简介 几个相关的概念 初识JUnit单元测试框架 单元测试工具 示例:在Eclipse中使用JUnit4进行单元测试 JUnit 框架 JUnit几个核心类及接口 Assert 超类所提供的8个核心方法 TestCase提供了10个自己的方法 JUnit4...

    对Java下的Junit的扩展

     Junit简介  JUnit是 一个开源的java单元测试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完成。这两个牛人中 Erich Gamma 是 GOF 四人帮之一;Kent Beck 是 XP (Extreme Programming)极限编程创始人...

    分析JUnit框架源代码

    本文内容包括:概述Junit简介一个简单的JUnit程序实例JUnit源代码分析总结参考资料本文细致地描述了JUnit的代码实现,在展示代码流程UML图的基础上,详细分析JUnit的内部实现代码的功能与机制,并在涉及相关设计模式...

    《良葛格Java JDK 5.0学习笔记》.rar

    包含java特性、java学习方法、网络资源汇总、jdk下载和安装、path与CLASSPATH的设置、java基本语法、关于对象的认识、数组、字符串(String类))、Ant简介、JUnit简介。 作者:林信良(网络化名良葛格) 学历:台湾大学...

    JUnit和单元测试入门简介

    java web 开发中,利用Struts+Spring+Hibernate框架开发网页后的测试

    软件测试技术JUnit和单元测试入门简介

    JUNIT软件测试软件测试技术JUnit和单元测试入门简介软件测试1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后...

    JUnit入门,深入浅出,实例为证

    JUnit入门简介,初学JUnit适用,深入浅出,实例为证,

    JUnit单元测试入门简介+实例

    相关的概念、单元测试概述、Junit入门简介、实例

    JUnit使用指南及作业规范.rar

    1.11.11.1 简介 .... .... .... .... ....... 3 1.21.21.2 特性 .... .... .... .... ....... 3 1.31.31.3 适用对象 .... .... .... ... 3 2 JUNITJUNIT 使用 .... .... .... .... ... 3 2.1 JUNITJUNIT JUNIT 3...

    单元测试与junit技术

    介绍junit技术的ppt文档,介绍了单元的测试的原理和方法,是一份简介的junit技术的说明文档

Global site tag (gtag.js) - Google Analytics