受梁老师委托,简要给大家回顾了一些工作流系统中的对象之间的关系,工作流就象一个链表。
为什么要测试?什么是单元测试?单元测试的好处?为什么要使用自动化工具进行单元测试。
什么是XP,什么是TDD,TDD的好处。
junit的安装和使用,再次回顾junit.jar为什么不能放在<jre>/lib/ext目录中的原因。
利用TestCase编写单元测试程序,资源的初试化和回收方法为setUp和tearDown,各个测试方法要遵守testXxx()这种命名模式,junit使用反射机制调用测试程序的方法,每个方法前后都要调用setUp和tearDown。如何使用TestSuite进行组合测试,junit自带的例子中的每个程序都返回一个Testsuite的目的是为了让每个程序也可以被作为一个分支组合被测试。
Test接口,TestCase类,TestSuite类之间的关系,组合设计模式在junit中的体现。
各种assert方法的总结:assertTrue,assertFalse,assertSame,assertNotSame,assertNull,assertNotNull,assertEquals,fail
重点分析:assertEquals方法比较浮点数时为什么有一个delta变量,fail方法的作用
junit报告的Error与Failure的区别
每一个执行流程都应对应一个测试用例
编写一个空方法的“最佳实践”是什么?
运行时异常(RuntimeException,也叫unchecked异常)的特点,考题:请列举出3个你熟悉的运行时异常。
测试程序与源程序的组织结构,“分离但等同”原则。
junit.jar加入到classpath中,可以被javac任务找到,但不能java任务识别。
junit与ant构建工具的集成
如果junit任务下面没有设置<formatter>子元素,那将无法打印出详细的信息。
一个junit任务下可以有多个<formatter>子元素,<formatter>的usefile属性决定是否生成文件。
junitreport任务首先把多个test-....xml文件合并成一个汇总的xml文件,其todir属性指定该文件的存储目录.其<report>子元素用于指定生成的html文件的目录。在用junitreport之前,要小心junit的haltonfaiure。
batchtest指定的java源文件或class文件,而不是要运行的测试类名称,junit从这些文件中找出要运行的测试类名。
最后复习了一下反射与代理
实践:对入学测试题的第一题进行单元测试。
FindChar.java:
pacakge cn.itcast;
public class FindChar
{
int search(char [] chars, char ch) throws IllegalArgumentException
{
//throw new UnsupportedOperationException("search");
/*if(chars == null)
{
throw new IllegalArgumentException("");
}*/
/*for(int i=0; i<chars.length; i++)
{
if(chars[i] == ch)
{
return i;
}
}*/
return -1;
}
}
------------------------------------------
TestFindChar.java:
package cn.itcast;
import junit.framework.*;
public class TestFindChar extends TestCase
{
private FindChar fc = null;
private char [] chars = {'a','b','c','d'};
public void setUp()
{
fc = new FindChar();
}
public void testSearchFound()
{
int index = fc.search(chars,'c');
assertEquals(index,2);
}
public void testSearchNotFound()
{
int index = fc.search(chars,'e');
assertTrue((index==-1));
}
public void testSearchIllegalArguments()
{
char [] chs = null;
fc.search(chs,'a');
fail();
}
}
---------------------------------------------------
build.xml文件:
<project name="junitlesson" default="report">
<property name="src.java.dir" value="src/java" />
<property name="src.test.dir" value="src/test" />
<property name="classes.java.dir" value="classes/java" />
<property name="classes.test.dir" value="classes/test" />
<target name="init">
<mkdir dir="${classes.java.dir}" />
<mkdir dir="${classes.test.dir}" />
</target>
<target name="compileJava" depends="init">
<javac srcdir="${src.java.dir}/cn/itcast" destdir="${classes.java.dir}"/>
</target>
<target name="compileTest" depends="init">
<javac srcdir="${src.test.dir}/cn/itcast" destdir="${classes.test.dir}">
<classpath>
<pathelement location="${classes.java.dir}" />
</classpath>
</javac>
</target>
<target name="compile" depends="compileJava,compileTest" />
<!--target name="run" depends="clean,compile">
<java classname="junit.swingui.TestRunner" fork="true">
<classpath>
<pathelement location="C:/junit3.8.1/junit.jar" />
<pathelement location="${classes.test.dir}" />
<pathelement location="${classes.java.dir}" />
</classpath>
<arg value="cn.itcast.TestFindChar" />
</java>
</target-->
<target name="test" depends="clean,compile">
<mkdir dir="reports"/>
<!--haltonfailure="yes"-->
<junit fork="true" printsummary="on" >
<classpath>
<pathelement location="C:/junit3.8.1/junit.jar" />
<pathelement location="${classes.test.dir}" />
<pathelement location="${classes.java.dir}" />
</classpath>
<!--test name="cn.itcast.TestFindChar" todir="reports"/-->
<batchtest fork="yes" todir="reports">
<fileset dir="${src.test.dir}">
<include name="**/*Test*.java"/>
<exclude name="**/AllTests.java"/>
</fileset>
</batchtest>
<formatter type="brief" usefile="false"/>
<formatter type="plain"/>
<formatter type="xml"/>
</junit>
</target>
<target name="report" depends="test">
<junitreport todir=".">
<fileset dir="./reports">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="."/>
</junitreport>
</target>
<target name="clean">
<delete dir="${classes.java.dir}" />
<delete dir="${classes.test.dir}" />
</target>
</project>