JUnit_______.ppt_第1页
JUnit_______.ppt_第2页
JUnit_______.ppt_第3页
JUnit_______.ppt_第4页
JUnit_______.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JUnit单元测试,1,主要内容,为什么要进行单元测试 单元测试概述 JUnit简介和经验总结,“测试不是我的工作”,测试是测试部门的责任,我的责任应该关注在写代码上; 测试不是一种技术工作,毫无乐趣可言,请不要骚扰我。我可是一个了不起的SSH程序员 我们有测试人员,有集成/系统/确认测试,他们迟早会发现我的错误,请不要浪费我的时间; 不要侮辱我,我写的程序, 怎么可能有错误。测试是 完全没必要的。,程序员的难题,开发的模块出现问题,很难定位,已经熬了几个通宵了!,刚改正了一个BUG,过没几天,又发现了新问题! 程序总在出问题,联调了几个月,还是问题不断!,后果,软件的质量完全取决于程序员的个

2、人技能和责任心,具有很大的随机性 后期维护成本高昂 1个月的开发,几天的测试,然后花1,2年的时间去修补错误 这个项目我已经维护了3年了 根本原因是软件自身复杂的结构,现实中的发现,编码阶段引入的缺陷远远多于其它阶段 系统测试发现的缺陷大多数是编码缺陷 测试版本频繁,测试和项目进度被无休止的拖延,测试的时间和成本,缺陷的发现时间越晚,修复的成本越高,在部署阶段每个缺陷的修复成本都会及其高昂(每一个major以上的缺陷修复都不得不作完整的系统测试和确认测试),严格实施scm的组织尤其昂贵。,单元测试,最高的成本收益比 减少联调和后续测试的时间 BUG更容易定位 更有信心去修改老代码,主要内容,为

3、什么要进行单元测试 单元测试概述 JUnit简介和经验总结,什么是单元测试(Unit Test),单元测试测试的软件最小的可执行单元的正确性,即类或方法; 单元测试通常是一段可执行代码,并能验证执行结构是否和预期相等; 单元测试可以是黑盒也可以是白盒,取决于执行方法,盖房子,至少要保证每一块砖都是好的,单元测试是其他类型测试的基础。不认真,完整的单元测试会导致其他类型测试起不到好的效果 程序员最了解自己的程序单元,最适合做单元测试 传统的重量级的方法学里,UT test case由设计人员在系统设计阶段开发,并用来验证编码人员的工作质量,什么是单元测试(Unit Test),单元测试任务,单元

4、接口测试 单元局部数据结构测试 单元中重要的执行路径测试 单元的各类错误处理路径测试 单元边界条件测试,单元测试原则,应该尽早地进行软件单元测试。 应该保证单元测试的可重复性。 尽可能地采用测试自动化的手段来支持单元测试活动。,单元测试一定要自动化,只有用代码编写的UT,才能够重现,才能真正节约未来手工测试的时间。 只有用代码编写的UT ,才能做到自动化,才能在软件开发的任何时候都能快速,简单的大批量执行,保证能准确地定位错误,保证不会因为修改而引入新的错误。在系统开发的后期尤为明显。 自动化的UT,才能保证回归测试的有效执行。,单元测试的必要性,带来更大的测试范围 带来团队合作的可能 防止衰

5、退,减少调试 使得重构可行 改进实现设计 当做开发者文档来用 非常有趣,单元测试是成本最低的测试活动,发现一个Defect所需要的时间 (91年数据),单元测试节约的时间,编写UT代码的时间节约了未来修改/维护低质量代码的时间 学习做UT的时间,是为了以后你可以更好的关注你的代码 如果使用Test-driven的思,单元测试自身就变成设计的一部分,你不会再感到是在浪费时间,编写UT的过程,就是设计的过程 UT快速的定位错误所在,节约了你调试的时间。,程序员的责任,程序员的价值在于和他人合作,开发出高质量的代码,而不是一堆新技术名词堆砌的虫件(bugware)。 程序员必须对自己的代码质量负责,

6、单元测试是对自己代码质量的基本承诺。 程序=UT+CODE 不做单元测试,就会影响团队其他人员的工作。测试人员有权利对没有做过UT的代码说No.不愿意做UT的人,不属于任何团队。,单元测试工具和框架,目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C+),DUnit(Delphi),NUnit(.net),PhpUnit(Php)等等。 Junit测试框架的第一个和最杰出的应用就是由ErichGamma(设计模式的作者)和KentBeck(XP(ExtremeProgramming)的创始人)提供的开放源代码的JUnit。,主要内容

7、,为什么要进行单元测试 单元测试概述 JUnit简介和经验总结,Junit框架,21,JUnit Test case,22,public class TestPerson extends TestCase /* A unit test to verify the name is formatted correctly. */ public void testGetFullName( ) Person p = new Person(Aidan, Burke); assertEquals(Aidan Burke, p.getFullName( ); /* A unit test to verify

8、 that nulls are handled properly. */ public void testNullsInName( ) Person p = new Person(null, Burke); assertEquals(? Burke, p.getFullName( ); / this code is only executed if the previous assertEquals p = new Person(Tanner, null); assertEquals(Tanner ?, p.getFullName( ); ,Test case 扩展自TestCase,每个方法

9、负责对某种情况测试,测试结果为true/false,JUnit assertXXX( ),23,使用一系列的assertXXX方法来判断执行结果是否和预期相符,不符则执行失败,不会再继续case(当前方法)的余下部分,JUnit Set Up and Tear Down,24,setUp() 提供初始化方法 tearDown提供清除方法 如果几个测试case(方法)共享同样的初始化合清除方法,如dao对象的创建,可以使用setUp/tearDown方法 如果需要在几个test方法中共享某一个变量,请使用static的类变量,因为junit为每个方法都重新创建一个对象。,setUp(),Test

10、XXX(),tearDown,JUnit Set Up and Tear Down-One time,25,public class TestPerson extends TestCase public void testGetFullName( ) . public void testNullsInName( ) . public static Test suite( ) TestSetup setup = new TestSetup(new TestSuite(TestPerson.class) protected void setUp( ) throwsException / do yo

11、ur one-time setup here! protected void tearDown( ) throws Exception / do your one-time tear down here! ; return setup; ,某些情况下,我们希望一组test case的setup/tear down仅仅运行一次,通常是为了提高速度,可以使用此种做法 在这种情况,如果为TestPerson自己实现了setup/tearDown方法,他们还是会被执行的。,JUnit Organizing Tests into Test Suites,第一种方法将自动执行testGame所有的test

12、XXX方法 public class TestGame extends TestCase . public static Test suite( ) return new TestSuite(TestGame.class); 第二种方法只执行指定的方法 public static Test suite( ) TestSuite suite = new TestSuite( ); suite.addTest(new TestGame(testCreateFighter); suite.addTest(new TestGame(testSameFighters); return suite; ,T

13、est suite的目的是把所有的test case放在一起执行。为了验证程序的其他部分,或者作night test,我们通常需要构造test suites,JUnit Exception Handling,如果期盼代码抛出某种异常 public void testPassNullsToConstructor( ) try Person p = new Person(null, null); fail(“xxx); catch (IllegalArgumentException expected) / its ok ,对不期盼处理的异常可以直接抛出,不要做try catch处理,JUnit会自

14、动转为fail / dont do this! public void testBadStyle( ) try SomeClass c = new SomeClass( ); c.doSomething( ); catch (IOException ioe) fail(Caught an IOException); ,27,JUnit Repeating Tests,28,public static Test suite( ) / run the entire test /suite ten times return new RepeatedTest(new TestSuite(TestGam

15、e.class), 10); 如果想重复的运行某个测试若干次,可用此法来制造模拟数据或性能测试,JUnit Running Tests Concurrently,public static Test suite( ) TestSuite suite = new ActiveTestSuite( ); suite.addTest(new TestGame(testCreateFighter); suite.addTest(new TestGame(testGameInitialState); suite.addTest(new TestGame(testSameFighters); return

16、 suite; ,29,要求同时跑多个线程,可以使用ActiveTestSuite来启动,此法可对多线程应用进行测试,JUnit 测试的命名规范,/* * TGID 001 /测试组id * 这个类测试XXX */ Class XxxTest /测试类以Test届尾 /* TCID 001 /测试case id 此方法测试 xxxxx */ public void testXXX() /测试方法以test开头 遵守规范的命名可以方便作night test和最后用javadoc/java2hmtl提出文档,作UT report,30,TestSuite处理测试用例有6个规约,测试用例必须是公有类

17、(Public) 测试用例必须继承与TestCase类 测试用例的测试方法必须是公有的(Public) 测试用例的测试方法必须被声明为Void 测试用例中测试方法的前置名词必须是test 测试用例中测试方法无任何传递参数,JUnit经验总结,不要用TestCase的构造函数初始化,而要用setUp()和tearDown()方法。 不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。 避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。 当继承一个

18、测试类时,记得调用父类的setUp()和tearDown()方法。,JUnit经验总结,将测试代码和工作代码放在一起,一边同步编译和更新。 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。 确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。 编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。 测试要尽可能地小,执行速度快。,单元测试经验,测试驱动开发 编写单元测试用例促进解除模块之间的耦合。先编写测试用例,强迫自己从利于调用者的角度来设计单元,关注单元的接口。为了便于调用和独立测试,必须降低单元和周边环境的耦合程度,单元的可测试性得到加强,模块化程度得到提高。这样单元的可重用性也容易被考虑和提高。,单元测试经验,重构 测试用例数量是逐步增加

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论