您的位置:首页 > 其它

单元测试方法总结

2011-11-25 20:14 459 查看

1 引言

应用系统的实施代码构建完成之后,并不代表项目已经结束。至少还有系统测试,部署以及性能调优等工作需要完成。测试的目的是检验开发结果是否满足规定需求,测试时保证软件质量的重要手段,是软件开发不可缺少的组成部分。

虽然测试是一件乏味的工作,但是对自己开发的程序代码进行单元测试是程序员必要的工作,不但可以写出高质量的代码,还可以提高自己的编程水平。本文档主要介绍我们常用的几种单元测试的方法,供大家参考,学习,分享,给大家的工作带来较高的效率。

2 几种常见的单元测试方法

单元测试时针对程序模块,来进行正确性检验的测试工作。程序的单元是应用的最小可测试部件。一个单元就是单个程序,最小单元就是面向对象编程中的一个方法

2.1 编写main方法

在被测试类中编写一个main方法是传统而简单的方法,但缺点不少。首先,增加了源代码的长度;其次,有可能破坏源代码的可读性,特别是对于那些拥有多个对外接口的类,要求其在一个main方法中完成所有测试案例,测试繁杂。若是把这些案例分解成一个一个私有测试方法的话,将降低代码的可读性。最后,可能使功能类引入对于的依赖类,例如,测试引用了类所有接口的实现类。

main方法根本性缺点在于测试结果的直观阅读性问题,main方法测试必须执行后,通过对控制台的输出信息进行观察才能判断结果是成功还是失败。这显然是不方便,浪费时间的。

2.2 使用JUnit进行单元测试

Junit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。

2.2.1 使用junit的好处

l 可以使测试代码与产品代码分开。

l 针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。

l 易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发。

l JUnit是公开源代码的,可以进行二次开发。

l 可以方便地对JUnit进行扩展。

l 简单适用,学习上手比较简单

2.2.2 Junit中常用到的类

l TestCase抽象类:定义测试中的固定方法

TestCase是Test接口的抽象实现,其构造函数TestCase(stringname)根据输入的测试名称name创建一个测试实例。由于每一个TestCase在创建时都要有一个名称,若测试失败了,便可识别出是哪个测试失败。 TestCase类中包含的setUp()、tearDown()方法。

setUp()方法集中初始化测试所需的所有变量和实例,并且在依次调用测试类中的每个测试方法之前再次执行setUp()方法。 tearDown()方法则是在每个测试方法之后,释放测试程序方法中引用的变量和实例。开发人员编写测试用例时,只需继承TestCase(在junit4.*版本中是无需继承的),来完成run方法即可,然后JUnit获得测试用例,执行它的run方法,把测试结果记录在TestResult之中。

l Assert静态类:一系列断言方法的集合

Assert包含了一组静态的测试方法,用于期望值和实际值比对是否正确,即测试失败,Assert类就会抛出一AssertionFailedError异常,JUnit测试框架将这种错误归入Failes并加以记录,同时标志为未通过测试。如果该类方法中指定一个String类型的传参则该参数将被做为AssertionFailedError异常的标识信息,告诉测试人员改异常的详细信息。

JUnit 提供了6大类31组断言方法,包括基础断言、数字断言、字符断言、布尔断言、对象断言。其中assertEquals(Objectexpcted,Object actual)内部逻辑判断使用equals()方法,这表明断言两个实例的内部哈希值是否相等时,最好使用该方法对相应类实例的值进行比较。

l Test接口:运行测试和收集测试结果

Test接口使用了Composite设计模式,是单独测试用例(TestCase),聚合测试模式(TestSuite)及测试扩展(TestDecorator)的共同接口。它的public int countTestCases()方法,用来统计测试时有多少个TestCase。另外一个方法就是publicvoid run( TestResult ),TestResult是实例接受测试结果, run方法执行本次测试。

2.2.3 Eclipse中Junit的使用

Eclipse集成了JUnit,可以非常方便地编写TestCase。Eclipse自带了一个JUnit的插件,不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。

使用JUnit,您必须首先将JUnit JAR保存在项目的Build路径上并创建一个测试类。将JUnit保存在项目的Build路径上的步骤为:

右击项目—>选择菜单底部的Properties选择Java BuildPath—>选择Libraries—>点击Add Variable按钮—>查看已有的列表中有无JUnit文件,若没有,则点击ConfigureVariable—>New按钮,输入JUNIT_LIB作为变量名称,编辑该变量并指向解压后的JUnit目录中的一个名为JUnit.jar的文件—>然后在选择刚才添加的jar文件依次点击OK即可。编写测试用例的步骤:

l 新建一个测试用例或选择已有的所想测试的JAVA文件,点击“File->New->…”菜单项或右击文件,在弹出的“New”对话框中选择“JUnit Test Case”,就进入“New JUnit Test Case”对话框。

l 在“New JUnit TestCase”对话框填写相应的栏目,主要有Name(测试用例名),SuperClass(若JUnit的版本是3.8.1,则测试的超类一般默认为junit.framework.TestCase;若JUnit版本是JUnit 4.4,则默认超类为java.lang.Object。),Class Under Test(被测试的类),SourceFolder(测试用例保存的目录),Package(测试用例包名),及是否自动生成main,setUp,tearDown方法。在此一般填写NAME及选上复选上setUpt和teardown即可。

l 点击“Next>”按钮,则进入TestMethods,在此你可以直接勾选你想测试的被测试类的方法,Eclipse将自动生成与被选方法相应的测试方法,点击“Fishish”按钮后一个测试用例就创建好了。

l 编写完测试用例之后,我们右键“run as”中选择 junit test 便可运行测试用例。之后,eclipse中会弹出junit运行结果视图,绿颜色表示测试成功的方法,打叉号的表示测试失败的方法。

JUnit的使用并不很难,但关键就是最后一步完成测试码,即编写TestCase。要编写一个好的TestCase却并非易事。一个不好的TestCase往往是既浪费了时间,也起不了实际的作用。相反,一个好的TestCase,不仅可以很好的指出代码中存在的问题,而且也可以作为代码更准确的文档,同时还在持续集成的过程中起非常重要的作用。

2.3 使用spring进行单元测试

Spring框架为我们提供了单元测试的功能,它是对junit的一个扩展。使用spring单元测试的功能,我们既可以使用其applicationContext.xml文件完成spring的依赖注入,有可以正常使用junit功能。而且,spring单元测试更好地对事务进行管理。

2.3.1 Spring单元测试提供的常见类

l AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元测试,它是spring内部设计使用到的类。

l AbstractDependencyInjectionSpringContextTests:这是AbstractSpringContextTests的直接子类,支持依赖spring上下文的测试类,这个类不支持事务。

l AbstractTransationalSpringContextTests是AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,你可以重载onSetUpInTransaction和onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的情况下,使用这个类。

l AbstractTransationalDataSourceSpringContextTests它使用了spring的基于jdbc的jdbcTemplate工具类支持数据库级别的事务。

我们编写的测试类需要根据情况来选择继承以上的某一个类,以上的类位于org.springframework..test包中。Spring的

2.3.2 Spring单元测试使用方法

我们在项目中使用spring进行单元测试,假设我们使用spring上下文的测试类,我们在测试类中要继承AbstractDependencyInjectionSpringContextTests方法,同时要覆盖其中的getConfigLocations()方法,这个方法返回一个字符串数组,主要为了加在spring的配置文件。

当然我们也可以编写一个测试的基类,所有的测试类都继承它。

2.3.3 Spring3.0对单元测试的支持

Spring3.0对于单元测试部分变化不是特别大,它修改了org.springframework.test包下的相关类,并推荐使用org.springframework.test.context.junit4(或junit3.8)包下的类进行测试,例如:

AbstractTransactionalJUnit4SpringContextTests类。而且推荐使用spring的注解进行单元测试。

l @Runwith:指定测试用例的运行器,及测试框架junit4或其他。

l @ContextConfiguration:指定spring配置文件的位置。

l @Transactional:对所有的测试方法都使用事务,并在测试完成后回滚事务,使测试方法对于数据库的操作全部回滚。

l @Resource:自动注入spring的bean,@Autowired相同。

l @TransactionConfiguration事务的配置(可选项)

l @Test:表示此方法为测试方法。

3 总结

单元测试时每一个程序员都应该掌握的技能,技能保证代码的质量又能锻炼自己的编程能力,掌握单元测试的方法及精髓是很必要的。文档中只是选了一些常用的方法以及测试类进行了简要的说明,如果需要更深一步的学习,大家可以查阅书籍以及借助互联网。尤其是spring的单元测试,极其方便。Spring是一个功能极其强大的框架,学习它会使我们有很大的进步,对于编码工作带来很大的飞跃。谢谢大家支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: