- 浏览: 409259 次
- 性别:
- 来自: 秦皇岛
最新评论
-
prayjourney:
了解了,讲的不错
DataInputStream和DataOutputStream类 -
niunianss:
将字节退回的时候,需要添加判断,最后一个字符是英文时,实际数组 ...
PushbackInputStream -
cctt_1:
不要误人子弟,那根本就不是 解释器模式!!!那是Composi ...
Interpreter(解释器)模式 -
java-大神:
[i][i]引用引用引用引用[/img][/img][/img ...
BufferedReader和BufferedWriter -
百合不是茶:
你的程序在文件输入输出流中传入agrs[0]时,会报错越界 ...
DataInputStream和DataOutputStream类
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文件,这些文件在下面的附件中。
- report.rar (4.3 KB)
- 下载次数: 3
发表评论
-
内部类总结
2009-11-27 14:28 1222一、方法及作用域内的内部类:1.在一个方法内定义的类2.在一个 ... -
finalize()方法终结条件验证 示例代码
2009-09-20 09:23 1348package Initialization; clas ... -
Proxy(代理)模式二
2009-05-15 21:16 15532. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Ant简介
2009-04-08 13:10 18531. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(文字编辑与保存)
2009-04-08 10:43 22151. 文字编辑与保存: (1). 打开文件的处理流 ... -
专题制作--文字编辑器(逻辑实现部分)
2009-04-07 22:35 19061. 事件处理: 在Java中事件以具体的对象来表 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21491. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 15841. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
日志(Logging)
2009-04-07 16:14 17281. 日志(Logging) 程序不免会出现错误,当 ... -
Java中的日期和时间
2009-04-07 11:26 19581. 使用Date: 使用System.cu ... -
meta-annotation
2009-04-07 09:23 30821. 所谓meta-annotation就是Annotati ... -
Annotion
2009-04-06 23:05 16831. Annotation对程序运行没有影响,它的目的在于对编 ... -
使用反射生成与操作对象(二)
2009-04-06 17:04 17561. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21091. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20761. 当在命令行模式下执行java XXX.class 指令后 ... -
Java中的反射(一)
2009-04-06 09:43 13921. Java提供的反射机制允许您在运行时动态加载类、查看类信 ... -
容器类的线程安全及ThreadLocal类
2009-04-05 21:28 30571. 容器类默认没有考虑 ... -
wait()和notify()
2009-04-05 19:06 13711. wait()、notify()、notifyAll() ... -
Java线程之同步化(Synchronized)主题
2009-04-05 16:44 27141. 如果一个对象所持有的数据可以被多线程同时共享存取,必须 ... -
Java线程(三)
2009-04-05 15:37 18921. Java中的每个线程都 ...
相关推荐
### Junit简介及扩展 #### Junit简介 JUnit是一个广泛使用的Java单元测试框架,由Kent Beck和Erich Gamma创建。自成立以来,JUnit已经成为xUnit家族中最成功的一员,该家族源自Kent Beck开发的sUnit。JUnit主要...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可执行的测试用例来验证代码的功能。单元测试是对软件中的最小可测试单元进行检查和验证,对于Java来说,这个单元通常是方法。JUnit框架提供了丰富...
### Java开源测试工具JUnit知识点详解 #### 一、JUnit概览及重要性 JUnit是一款流行的单元测试框架,专为Java编程语言设计。它的主要目的是帮助软件开发者编写可重复执行的测试,确保代码的质量和稳定性。JUnit的...
一、jUnit简介 jUnit是开源的,由Eclipse基金会维护,遵循MIT许可证。它提供了注解(annotations)、测试运行器和断言库,使得测试过程更加简洁和自动化。jUnit在敏捷开发和持续集成中扮演着关键角色,确保代码的...
**1.3 JUnit简介** JUnit是一个开源的Java测试框架,属于xUnit家族的一部分,专门为Java语言设计。它主要用于白盒测试和回归测试,可以帮助开发人员编写和运行可重复的测试用例。 #### 二、单元测试的重要性 **...
1. Junit简介:Junit是一款开源的、基于Java的测试框架,由Ernst Leifer和Kent Beck创建。它支持注解驱动的测试,让编写和运行测试变得极其便捷。 2. 注解使用:`@Test`注解用于标记测试方法,`@Before`和`@After`...
#### 一、JUnit简介 JUnit是一个开源的Java单元测试框架,被广泛应用于软件开发中的测试驱动开发(TDD)流程之中。它支持开发者通过编写测试代码来验证软件功能是否符合预期,从而提高代码质量和开发效率。 **主要...
1. **JUnit简介**:JUnit是Java编程中用于编写和运行可重复的单元测试的开源框架。它是由Ernst Klimpert和Kent Beck开发的,遵循XUnit测试框架的设计模式。JUnit提供了一套API和注解,使得开发者能够快速创建和执行...
**JUnit简介** JUnit是Kent Beck和Ernst Gamma开发的一个开源项目,它是基于Java的测试框架,遵循xUnit测试模式。JUnit 3是其早期的一个稳定版本,虽然现在更多地使用的是JUnit 4和5,但对一些旧项目来说,JUnit 3...
1. **JUnit简介**:JUnit是Java语言中的一个开源测试框架,由Ernst Leiss和Kent Beck共同开发,主要用于编写和运行面向对象程序的单元测试。它遵循xUnit架构,提供了断言、测试注解、测试套件等特性,大大简化了测试...
### JUnit简介 JUnit是一个开源的测试框架,它基于Java,主要用于编写和运行针对Java类的单元测试。它的核心理念是通过断言(assertions)来验证代码行为,确保程序的各个部分按预期工作。JUnit的最新版本是JUnit 5...
#### 一、JUnit简介及重要性 JUnit 是一个非常流行的 Java 单元测试框架,由软件大师 Erich Gamma 和 Kent Beck 共同开发完成。JUnit 的设计目的是为了帮助开发者更好地编写高质量的代码,通过自动化测试来确保代码...
### JUnit简介 JUnit是一个开源的、基于Java的测试框架,由Ernst Leiss和Kent Beck共同创建,主要用于编写和运行可重复的单元测试。JUnit 4.5是JUnit系列的一个重要版本,它引入了许多新功能和改进,使得单元测试...
一、JUnit简介 JUnit是由Ernst Leiss和Kent Beck在1997年创建的,其设计灵感来源于Smalltalk中的SUnit。JUnit是XUnit家族的一员,XUnit系列测试框架在多种编程语言中都有对应实现。它的核心理念是通过编写测试用例来...
**一、Junit简介** JUnit是一款广泛应用于Java编程语言的单元测试框架,由Ernst Konig和Kent Beck在2000年开发。它是XUnit系列测试框架的一员,旨在帮助开发者对代码进行快速、可靠且可重复的测试。JUnit支持注解...