1.(列举一项不用单元测试的失败案例)说明什么是单元测试(单元测试是开发者编写的一小段代码,用于检验代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试适用于判断某个),再说明执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。执行单元测试也是为了对所有单独部分的行为建立信心,确信它们都和我们的期望一致。
2.在实际编程中该怎样做?a.需要使用一些断言(assertion);b.需要计划你的测试(其中包含了寻找边界条件,断言期望结果)
3.使用JUnit编写单元测试。首先,需要遵循一些命名规范:如有个creatAccount函数(方法),那么你的测试函数命名也许就该是testCreatAccount之类的。测试代码必须要做的以下几件事情:a.准备测试所需要的各种条件(创建所有必须的对象,分配必要的资源等等)。b.调用要测试的方法。c.验证被测试方法的行为和期望的是否一致。d.完成后清理各种资源。
4.JUnit中的各种断言:assertEquals、assertNull、assertSame、assertTrue、fail。
5.JUnit框架,使用框架的最小要求。
例1:
import junit.framework.*;
public class TestSimple extends TestCase{
public TestSimple(String name){
super(name);
}
public void testVoid(){
assertEquals(2,1+1);
}
}
以上是JUnit 4以前的做法,在JUnit 4中我们可以用JAVA 5的新特性,元数据注释来使用JUnit:(注意在用新的框架时,JAVA的源代码级别必须设置在JAVA 5以上)
例2:
import static org.junit.Assert.*;
import org.junit.Test;
public class TestSimple{
@Test
public void testVoid(){
assertEquals(2,1+1);
}
}
6.正因为JAVA语言的特性。一个测试类可以包含一些测试方法;每个测试方法包含一个或多个断言语句。一个测试类也能调用其他测试类:单独的类、包、甚至完整的系统。这些可以通过创建test suite来取得。
例3:
import junit.framework.*;
public class TestClassOne extends TestCase{
public TestClassOne(String method){
super(method);
}
public void testAddition(){
assertEquals(4,2+2);
}
public void testSubtraction(){
assertEquals(0,2-2);
}
}
默认的,因为使用了Java的反射机制,将会运行testAddition与testSubtraction方法。
例4:
import static org.junit.Assert.*;
import org.junit.Test;
public class TestClassOne{
public TestClassOne(String method){
super(method);
}
@Test
public void testAddition(){
assertEquals(4,2+2);
}
@Test
public void testSubtraction(){
assertEquals(0,2-2);
}
public static Test suite(){
TestSuite suite = new TestSuite();
suite.addTest(new TestClassOne("testAddition"));
return suite;
}
}
在例4中,通过给构造方法传递String型参数,使得TestCase返回一个对命名测试方法的引用。有时,我们可能希望例3与例4中的事情同时发生,那么我们可以创建一个更高级别的测试来组合两个测试类(对于一个测试类也可以,就像上面的TestClassOne)
例5:
import junit.framework.*;
public class TestClassTop extends TestCase{
public TestClassTop(String method){
super(method);
}
static public Test suite(){
TestSuite suite = new TestSuite();
suite.addTest(TestClassOne.suite());
suite.addTestSuite(TestClassOne.class);
return suite;
}
}
7.Per-method与Per-suite
8.JUnit与异常
9.Right-BICEP
Right— 结果是否正确呢?怎样测试?使用数据文件,注意:测试前多注意一下数据文件,往往人为计算的数据比测试代码更可能是错误的。
B— 边界条件。寻找边界条件是最有价值的工作。一般需要考虑的条件:
a.完全伪造或者不一致的输入数据。
b.格式错误的数据,例如没有顶层域名的邮件地址。
c.空值或者不完整值。
d.一些与意料中的合理值相去甚远的数值。
e.要求的是一个不允许重复的list,但是传入的是一个存在重复数值的list。
f.如果要求的是一个有序的list,但是传入的是一个无序的list,或者相反。
g.事件到达的次序是错误的,或者碰巧和期望的次序不一致。
I— 检查反向关联。如:通过计算x的平方根来验证s*s=x的算法。
C— 使用其他方法实现交叉检查。结果唯一而算法多样。
E— 强制产生错误条件。
P— 性能特性。
10.考虑边界条件(CORRECT)
边界条件的考虑是单元测试中最重要的一步。
C— 一致性(Conformance)
O— 有序性(Ordering)
R— 区间性(Range)
R— 引用/耦合性(Reference)
E— 存在性(Existence)
C— 基数性(Cardinality)
T— 时间性(Time),绝对或者相对的。
11.Mock对象
Mock对象也就是在调试期真实对象的替代品。真实对象的内涵请参考Tim Mackinnon[MFC01]。
使用mock对象进行测试时,注意三个步骤:
a.使用一个接口(interface)来描述这个对象。
b.为产品代码实现这个接口。
c.以测试为目的,在mock对象中实现这个接口。
12.Easy-Mock对象
13.A-TRIP
14.测试代码目录结构
15.测试骨架
16.Java源代码测试
17.SQL语句验证测试
a.找出执行SQL语句的方法体
18.数据库测试
19.Web测试
20.XSL测试
21.XML测试(测试xfire、spring等等配置文件的有效性)
断言使用:
assertEquals("wyx",document.getTextAtXpath("/node1/node3"));
符合这个简单断言的xml文档可能是这样的:
<?xml version='1.0'>
<node1>
<node2>wnanfirst</node2>
<node3>wyx</node3>
</node1>
或者你的断言还有一种解决办法:
assertFalse(document.getNodesAtXpath("//node1[node3='wyx']").isEmpty());
22.对于测试的测试
23.JUnit结果汇报
需要注意,如果在eclipse中使用,必须在构建的时候在类路径上加入junit的lib才行。
编写了一个较为通用的build.xml,如下:
<?xml version='1.0' encoding='utf-8'?>
<project basedir="." default="report" name="run_html">
<property name="src.dir" location="${basedir}/src" />
<property name="classes.dir" location="${basedir}/bin" />
<property name="report.dir" location="${basedir}/report" />
<property name="lib.dir" value="${basedir}/lib" />
<property name="dist.dir" value="${basedir}/dist" />
<property name="doc.dir" value="${basedir}/doc" />
<path id="master-classpath">
<fileset file="${lib.dir}*Test.*" />
</fileset>
</batchtest>
</junit>
</target>
<!-- 打包成jar -->
<target name="pack" depends="run" description="make .jar file">
<mkdir dir="${dist.dir}" />
<jar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}">
<exclude name="**Test*.*" />
</jar>
</target>
<!-- 输出测试汇报 -->
<target name="report"
depends="pack"
description="=> generate JUnit HTML report">
<junitreport todir="${report.dir}/xml">
<fileset dir="${report.dir}/xml">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${report.dir}" />
</junitreport>
</target>
</project>
24.JUnit测试Hibernate
25.JUnit测试Spring