2016新员工培训-单元测试

上传人:n**** 文档编号:49860894 上传时间:2018-08-03 格式:PPT 页数:58 大小:6.04MB
返回 下载 相关 举报
2016新员工培训-单元测试_第1页
第1页 / 共58页
2016新员工培训-单元测试_第2页
第2页 / 共58页
2016新员工培训-单元测试_第3页
第3页 / 共58页
2016新员工培训-单元测试_第4页
第4页 / 共58页
2016新员工培训-单元测试_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《2016新员工培训-单元测试》由会员分享,可在线阅读,更多相关《2016新员工培训-单元测试(58页珍藏版)》请在金锄头文库上搜索。

1、单元测试测试中心 张雪莲23为什么做单元测试如果汽车坏了该怎么办?先不说怎么修好它,你怎么找到问题 出在哪呢?4为什么做单元测试5 集成测试是对一个工作单元进行的测试,这个测试对被测试 的工作单元没有完全的控制,并使用该单元的一个或多个真 实依赖物,例如时间、网络、数据库、线程或随机数产生器 等。 单元测试把被测试单元和其依赖物隔离开1. 保证单元测试结果高度稳定2. 轻易控制和模拟被测试单元行为的任何方面6单元测试一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单

2、元测试可靠、可读,并且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。7优秀单元测试的特性 一个单元测试应当具有如下特征:1. 它应该是自动化的,可重复执行;2. 它应该很容易实现;3. 它应该第二天还有意义;4. 任何人都应该能一键运行它;5. 它应该运行速度很快;6. 它的结果应该是稳定的(如果运行之间没有进行修改的话, 多次运行一个测试应该总是返回同样的结果);7. 它应该能完全控制被测试的单元;8. 它应该是完全隔离的(独立于其他测试的运行);9. 如果它失败了,我们应该很容易发现什么是期待的结果, 进而定位问题所在。8Junit简介 JUnit 是 Java 社区中知名度最高

3、的单元测试工具。它诞生于 1997 年。 设计非常小巧,功能却非常强大。 一个开发源代码的Java测试框架,用于编写和运行可重复的 测试。 主要用于白盒测试,回归测试。9JUnit的好处和编写原则 好处:可以使测试代码与产品代码分开;针对某一个类的测 试代码通过较少的改动便可以应用于另一个类的测试;易于 集成到测试人员的构建过程中,JUnit和Ant的结合可以实施 增量开发;JUnit是公开源代码的,可以进行二次开发;可以 方便地对JUnit进行扩展; 编写原则:是简化测试的编写,这种简化包括测试框架的学 习和实际测试单元的编写;是使测试单元保持持久性;是可 以利用既有的测试来编写相关的测试;

4、 10JUnit 最佳实践请牢记这一条 JUnit 最佳实践:测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。11JUnit 4 初体验 Eclipse:最为流行的 IDE,它全面集成了 JUnit,并从版本 3.2 开始支持 JUnit 4。当然 JUnit 并不依赖于任何 IDE。您 可以从 http:/www.eclipse.org/ 上下载最新的 Eclipse 版 本。 Ant:基于 Java 的开源构建工具,您可以在 http:/ant.apache.org/ 上得到最新的版本和丰富的文档。 Eclipse 中已经集成了 Ant(必需 1.7 或者以上版本才

5、能很好 的支持 JUnit 4)。 JUnit:它的官方网站是 http:/www.junit.org/。您可以从 上面获取关于 JUnit 的最新消息。如果您和本文一样在 Eclipse 中使用 JUnit,就不必再下载了。 1213 可以开始编写单元测试了吗?等等,您打算把单元测试 代码放在什么地方呢?14编写建议 分别为单元测试代码与被测试代码创建单独的目录 保证测试代码和被测试代码使用相同的包名好处保证了代码的分离,还保证了查找的方便。1516 一切准备就绪,一起开始体验如何使用 JUnit 进行单元测试 吧。1718 它是否能按照预期的效果执行呢?尝试为它编写 JUnit 单元 测试

6、代码如下: 19测试方法编写要点1. 必须使用注解 Test 修饰。2. 必须使用 public void 修饰,而且不能带有任何参数。3. Assert类里面有很多assert方法,包括:assertEquals(), assertNotNull(),assertTrue(),assertFalse() 等20测试方法运行 看看运行结果如何。在测试类上点击右键,在弹出菜单中 选择 Run As JUnit Test。运行结果如下图所示:21测试方法编写原则1. 单元测试的范围要全面,比如对边界值、正常值、错误值得 测试;2. 对代码可能出现的问题要全面预测,而这也正是需求分析、 详细设计环节

7、中要考虑的。 22232425failure 和 error JUnit 将测试失败的情况分为两种:failure 和 error。 Failure 一般由单元测试使用的断言方法判断失败引起,它表 示在测试点发现了问题; 而 error 则是由代码异常引起,这是测试目的之外的发现, 它可能产生于测试代码本身的错误(测试代码也是代码,同 样无法保证完全没有缺陷),也可能是被测试代码中的一个 隐藏的bug。 26测试方法编写最佳实践 测试任何可能的错误。 单元测试不是用来证明您是对的,而是为了证明您没有错。 27测试类编写建议测试类 建议以“Test”开头可以 更好的区分测试类与被测试类。28Fi

8、xture Fixture? 它是指在执行一个或者多个测试方法时需要的一系列公共资源 或者数据,例如测试环境,测试数据等等。JUnit 专门提供了设置公共 Fixture 的方法,同一测试类中的所 有测试方法都可以共用它来初始化 Fixture 和注销 Fixture。29Before After 使用注解 Before 修饰用于初始化 Fixture 的方法。 使用注解 After 修饰用于注销 Fixture 的方法。 保证这两种方法都使用 public void 修饰,而且不能带有任 何参数。 遵循上面的三条原则,编写出的代码大体是这个样子: /初始化Fixture方法 Before p

9、ublic void init() /注销Fixture方法 After public void destroy()30作用 每一个测试方法的执行都会触发对公共 Fixture 的设置,也 就是说使用注解 Before 或者 After 修饰的公共 Fixture 设置 方法是方法级别的。 可以保证各个独立的测试之间互不干扰,以免其它测试代码 修改测试环境或者测试数据影响到其它测试代码的准确性。 31执行顺序32弊端 这种 Fixture 设置方式还是引来了批评,因为它效率低下, 特别是在设置 Fixture 非常耗时的情况下(例如设置数据库 链接)。而且对于不会发生变化的测试环境或者测试数据

10、来 说,是不会影响到测试方法的执行结果的,也就没有必要针 对每一个测试方法重新设置一次 Fixture。因此在 JUnit 4 中 引入了类级别的 Fixture 设置方法,编写规范如下: 33BeforeClass AfterClass BeforeClass 初始化 Fixture 的方法。 AfterClass 注销 Fixture 的方法。 保证这两种方法都使用 public static void 修饰不能带有任何参数。 /类级别Fixture初始化方法 BeforeClass public static void dbInit() /类级别Fixture注销方法 AfterClas

11、s public static void dbClose()34类级别的 Fixture 仅会在测试类中所有测试方法执行之前执行 初始化,并在全部测试方法测试完毕之后执行注销方法。35异常以及时间测试 参数 expected 代表测试方法期望抛出指定的异常,如果运 行测试并没有抛出这个异常,则 JUnit 会认为这个测试没有 通过。这为验证被测试方法在错误的情况下是否会抛出预定 的异常提供了便利。 举例来说,方法 checkDivisor用于检查除数是否为0,如果 为0则抛出算术异常ArithmeticException。测试方法 checkDivisor在就是测试除数为0的时候是否会抛出指定

12、异常36 参数 timeout,指定被测试方法被允许运行的最长时间应该 是多少,如果测试方法运行时间超过了指定的毫秒数,则 JUnit认为测试失败。这个参数对于性能测试有一定的帮助。 例如,如果解析一份自定义的 XML 文档花费了多于 1 秒的 时间,就需要重新考虑 XML 结构的设计,那单元测试方法 可以这样来写: 37忽略测试方法 Ignore 用于暂时忽略某个测试方法,有时候并不是需要 所有的测试都执行。例如在解析一份自定义的 XML 文档花 费了多于 1 秒的时间是可以接受的那么就可以,提示 JUnit 忽略测试方法 selfXMLReader : 但是一定要小心。注解 Ignore

13、只能用于暂时的忽略测试 ,如果需要永远忽略这些测试,一定要确认被测试代码不再 需要这些测试方法,以免忽略必要的测试点。 38Junit测试运行器 负责执行所有的测试方法 为单元测试提供了默认的测试运行器 可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),可以为每一个测试类指定使用 某个具体的运行器。 RunWith 在测试类上显式的声明要使用的运行器即可: 39 Junit4的默认runner为BlockJunit4ClassRunner,但是 Junit4包括第三方软件还提供很多其他的runner,这样如果 ,我们想让我们的测试类用专门的runne

14、r来运行,这时候就可 以用RunWith40 显而易见,如果测试类没有显式的声明使用哪一个测试运行 器,JUnit 会启动默认的测试运行器执行测试类(比如上面 提及的单元测试代码)。一般情况下,默认测试运行器可以 应对绝大多数的单元测试要求; 当使用 JUnit 提供的一些高级特性(例如即将介绍的两个特 性)或者针对特殊需求定制 JUnit 测试方式时,显式的声明 测试运行器就必不可少了。41测试套件 在实际项目中,随着项目进度的开展,单元测试类会越来越 多,可是直到现在我们还只会一个一个的单独运行测试类, 这在实际项目实践中肯定是不可行的。 JUnit 提供了一种批量运行测试类的方法,叫做测

15、试套件。 这样,每次需要验证系统功能正确性时,只执行一个或几个 测试套件便可以了。42测试套件编写原则 创建一个空类作为测试套件的入口。 使用注解 RunWith 和Suite.SuiteClasses 修饰这个空类 将 org.junit.runners.Suite 作为参数传入注解 RunWith,以 提示 JUnit 为此类使用套件运行器执行。 将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。 保证这个空类使用 public 修饰,而且存在公开的不带有任何 参数的构造函数。4344测试套件注意事项一定要保证测试套件之间没有循环包含关系,否则无尽的循环 就会

16、出现在您的面前。45参数化测试 回顾一下我们之前的实例。为了保证单元测试的严谨性,我 们模拟了不同类型的字符串来测试方法的处理能力,为此我 们编写大量的单元测试方法。可是这些测试方法都是大同小 异:代码结构都是相同的,不同的仅仅是测试数据和期望值 。有没有更好的方法将测试方法中相同的代码结构提取出来 ,提高代码的重用度,减少复制粘贴代码的烦恼?46可以使用 JUnit 提供的参数化测试方式应对这个问题。 47参数化测试编写原则1. 指定特殊的运行器 org.junit.runners.Parameterized。2. 为测试类声明几个变量,分别用于存放期望值和测试所用数 据。3. 为测试类声明一个使用注解Parameters 修饰的,返回值 为 java.util.Collection

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 咨询培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号