单元测试junit初学
上一篇 /
下一篇 2009-09-03 15:25:12
/ 个人分类:单元测试
o(_ DZJ@0一 实例51Testing软件测试网4b#~
b*_.@%\S
目前junit测试为接口中的方法。根据javadoc中的文字说明编写junit测试方法。51Testing软件测试网9u;{;o7NwzTt r
l接口:
lpublic interface ICalculatorService{
/**
*计算器中加法功能的计算
* @return参数a,b的和
*/
public double add(double a,double b);
}
l实现:
lpublic class CalculatorService implements ICalculatorService{
public double add(double a, double b){
return a+b;
}
:v0xs+ij-dE:K!Vm0}51Testing软件测试网Zy,Fr/|g(b
二 步骤
qXWA~_"Fnfw0
9s0t$K wW&|D!l
A0<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第一步:编写一个基类以创建测试环境(可选)。
l第二步:编写测试类。
l第三步:在该测试类中编写测试方法。
l第四步:在测试方法中调用被测方法。
l第五步:验证预期结果与返回的结果是否一致。
l第六步:执行测试查看测试结果。
l用TestSuite来组合测试。51Testing软件测试网5{O OCS'd
三 各步骤详解
aX|!j!o9app1|0
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第一步:编写一个基类以创建测试环境(可选)。
l此类会调用系统启动时的配置文件,模拟系统启动。也可以获取目标接口实现类的引用和编写测试代码时需要的公用方法。测试类的实现都需要继承此基类。
<!--[if ppt]-->l<!--[endif]-->
l例如如果计算机服务器有加减乘除等方法,我们可以把接口的引用放入基类中,以方便各测试类调用。
lPublic class BaseCase{
ICalculatorService calculotorService;
Public BaseCase(){
calculatorService = new CalculatorService();
}
}
Vl8K8LcB.Fv+z0<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第二步:编写测试类。
如果有基类要继承此基类完成测试环境的初始化。
l通常情况下为接口中的每个方法编写一个测试类。
l例如,测试计算器中加法功能的测试类为:
lpublic class AddTest extends BaseCase{…}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第三步:在该测试类中编写测试方法。
l(可选)编写初始化和清理方法,并标注为:@Before和@After
l@Before
public void before() {…}
l@After
public void after(){…}
l(可选)编写全局化初始化和清理方法,并标注为:@BeforeClass和AfterClass
l@BeforeClass
public static void beforeClass() {…}
l@AfterClass
public static void afterClass() {…}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l编写一个或多个测试方法,标注为@Test。
l推荐测试方法名字为test +测试点,如以下方法为测试计算器加法功能中输入为0的情况。
§@Test
public void testZero(){...}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第四步:在测试方法中调用接口中要测试的方法。
l可以在BaseCase中已经引用了目标接口的实现类。在测试方法中可直接调用。也可以在测试类中直接引用目标接口的实现类。
l例如引用计算器类中实现加法功能的add()方法。参数为两个加数。
l@Test
public void testZero(){
double result = calculatorService.add(0,0);
}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第五步:使用Assert所提供的静态方法验证方法调用返回的结果。
lAssert超类所提供的核心方法如下:
lassertEquals
§断言两个对象相等,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
§例如计算器加法功能的测试可以使用一下验证:
§Assert.assertEquals(0,result);
lassertSame
§断言两个引用指向同一个对象,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
lassertNotSame
§断言两个引用指向不同对象,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
<!--[endif]--><!--[if !ppt]--><!--[endif]-->lassertTrue
§断言条件为真,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
lassertFalse
§断言条件为假,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
lassertNull
§断言对象为null,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
lassertNotNull
§断言对象不为null,若不满足,方法抛出带有相应信息的AssertionFailedError异常。
lFail
§让测试失败,并给出指定信息。
l测试异常需要指定期待的异常类(expected=?)。
l@Test expected=NullPointerException.class
l测试超时需要指定超时时间(timeOut=?)。
K+ak7E&gNh/g}n0<!--[endif]--><!--[if !ppt]--><!--[endif]-->l第六步:执行测试查看测试结果。
l在eclipse测试类中点右键—run as—junit Test执行测试。
l 测试结果分为一下三种。
lPass:测试通过。
lFailure:测试失败。
lError:由异常引起的测试错误
Mm%b6?D
r)c#E2v$a9K0<!--[endif]--><!--[if !ppt]--><!--[endif]-->l用TestSuite来组合测试。
l用TestSuite来把所有的测试类组合在一起执行。
l如把计算器功能中的加减乘除的测试方法组合起来执行测试:
import org.junit.runner.RunWith;51Testing软件测试网i.MXF
}Qnx3e
import org.junit.runners.Suite;51Testing软件测试网!ow3{2^5r
import org.junit.runners.Suite.SuiteClasses;51Testing软件测试网5_{2\B BAcA/~VL
@RunWith(Suite.class)
yH#~0Ya0 @SuiteClasses(value = { AddTest.class })
w5e%x'|4l*^ p:@D0b0 @SuiteClasses(value = { MinusTest.class })
@SuiteClasses(value = { MultiplyTest.class })
@SuiteClasses(value = { divideTest.class })
public class AllTests {51Testing软件测试网'bX ]}#IW
}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->l确保开发人员编写的被测接口方法的javadoc详细完整。
l必须包含的内容有:场景,输入参数,输入参数的返回结果,预期抛出的异常。
lTC中要准备测试所需要的各种条件。
l调用要测试的方法。
l验证被测方法的返回值和所预期的是否一致。
l完成后,使用@After或@AfterClass方法中编写代码清理各种资源。
(_'A%l;`[A0待测试对象及辅助对象在@Before方法中初始化。l全局资源可以在@BeforeClass方法中初始化。
l全局资源通常启动缓慢,如数据库,Web服务器,放入@BeforeClass使之仅初始化一次加快测试速度。 l要测试一个方法应当编写多个测试方法,每个测试方法各有侧重。
l测试方法要覆盖所有可能抛出异常的情况51Testing软件测试网4Wt)Xl|Ii,\p
当遇到错误,最好的分析步骤是
W V8rKWg%E oG0<!--[endif]--><!--[if !ppt]--><!--[endif]-->l检查环境。
数据库链接,数据库中的数据是否正常?配置是否正常?网络是否正常?
l检查测试代码。
参数是否传错误?断言的预期值是否错误?
l检查程序。
debug
<!--[endif]--><!--[if !ppt]--><!--[endif]--><!--[endif]--><!--[if !ppt]--><!--[endif]-->接口:
public interface ICalculatorService{
/**
*计算器中加法功能的计算
* @return参数a,b的和
*/
public double add(double a,double b);
}
实现:
public class CalculatorService implements ICalculatorService{
public double add(double a, double b){
return a+b;
}
}51Testing软件测试网*od;h
\$f1r:X$G
基类:
Public class BaseCase{
ICalculatorService calculotorService;
Public BaseCase(){
calculatorService = new CalculatorService();
}
}51Testing软件测试网d!U ~#J,v,`
<!--[endif]--><!--[if !ppt]--><!--[endif]-->public class AddTest extends BaseCase{
@BeforeClass
public static void beforeClass() {}
@AfterClass
public static void afterClass(){}
@Before
public void before() {}
@After
public void after(){}
/**
*测试输入为0的情况
*预期值为0
*/
@Test
public void testZero(){
double result = calculatorService.add(0,0);Assert.assertEquals(0,result);
}
}
<!--[endif]--><!--[if !ppt]--><!--[endif]-->例如组合测试计算器中的加减乘除的测试方法
import org.junit.runner.RunWith;51Testing软件测试网YtAK5@l?A
import org.junit.runners.Suite;51Testing软件测试网(ov2^@9Dy4XB
import org.junit.runners.Suite.SuiteClasses;51Testing软件测试网v?%GL\ | A
@RunWith(Suite.class)51Testing软件测试网$H
v"k6CX/B8~9m*_
@SuiteClasses(value = { AddTest.class })
t}F:p
v$z&ubO0 @SuiteClasses(value = { MinusTest.class })
@SuiteClasses(value = { MultiplyTest.class })
@SuiteClasses(value = { divideTest.class })
public class AllTests {51Testing软件测试网0?&BOSW&a$w'h
}
<!--[endif]--><!--[if !ppt]--><!--[endif]--><!--[endif]--><!--[if !ppt]--><!--[endif]-->
相关阅读:
- 一步一步学NUnit(一) (fishy, 2009-7-16)
- 一步一步学NUnit(二) (fishy, 2009-7-16)
- 如何进行单元测试(上) (51testing, 2009-7-20)
- 如何进行单元测试(下) (51testing, 2009-7-20)
- 单元测试常用断言 (fishy, 2009-7-22)
- NUnit学习笔记(二) (fishy, 2009-8-04)
- NUnit学习笔记(三)——Attribute使用介绍 (fishy, 2009-8-05)
- 单元测试中如何对可变参函数打桩 (fishy, 2009-9-01)
- CppUnit 快速使用指南 (十期学员, 2009-9-02)
- 关于单元测试的一些经验总结 (fishy, 2009-9-02)
收藏
举报
TAG:
JUnit
单元测试