2017编程提高第9节课——JUnit
LanyuanXiaoyao's Blog ヽ(✿゚▽゚)ノ

2017编程提高第9节课——JUnit


为什么要选择一个早期的JUnit版本

  • 简单
    • 代码简洁
    • 可以把注意力集中在设计上
    • 完全可以在两天内实现一个高仿版!
  • 展示模式的使用
    • 模式生成架构

程序员的测试用例应该是什么样子?

需求

  • 设计一个简单的框架, 能让程序员轻松的编写,并且自动化运行的单元测试用例
    • 注意:这是一个框架
  • 其实就是Junit了
    • 我们称之为lite-junit  (降低复杂性)
    • 暂时把JUnit从你的脑子里清除

自动化单元测试的特点

  • 自动执行
    • 启动以后能把所有的测试都运行
    • 一个测试的失败不影响后续测试的运行
  • 可生成定制的报告
    • 哪些成功? 哪些失败?
    • Xml, html, 文本….
  • 运行速度要快
  • 测试脚本开发要简单

角色转换

  • 框架设计者 VS 框架使用者
  • 站在设计者的角度去思考问题

从测试用例开始

  • 包含一段代码
  • 需要执行
  • 需要获取运行结果
  • 所以测试用例最好是一个对象!

最好给测试用例起个名字

测试应该是隔离的

  • 一个单元测试的运行不应该影响另外一个单元测试
  • 运行单元测试之前需要准备工作
  • 运行单元测试之后需要清理工作

不隔离的测试,有什么问题?

我们希望测试以这样的方式运行

  • 准备工作
  • 运行test1
  • 清理工作
  • 准备工作
  • 运行test2
  • 清理工作
  • ……

一个runTest() VS 多个测试方法

方法1: 一个测试用例中只包含一个方法

方法2: 使用匿名类

注意: 每个测试方法都对应一个TestCase

方法3:使用反射

我们遇到了一个或者多个的问题

  • 到目前为止,框架只支持每次运行一个用户自定义的TestCase
  • 能不能“透明地”运行多个?
  • 调用方不应该关心是一个还是多个

是时候引入一个TestSuite了

TestSuite的使用

约定

  • 每个测试方法的名称需要以test开头
    • testCalculatorAdd
    • testCalculatorSubtract
  • 使用反射来寻找这些特定的测试方法

代码

小插曲: 实现assert

测试的运行结果

  • 顺利运行,断言(Assert)通过
  • 测试失败
    • 断言(Assert)失败 : Failure
    • 代码抛出异常 : Error
  • 如何获得这些可能的结果,像程序员报告?

用一个类来表达测试失败

重构TestCase

分离测试用例和测试结果:收集参数模式

回顾一下

  • Command模式 : 表达一个测试用例
  • Template Method : 实现数据的准备和清理
  • Composite : 屏蔽一个和多个的差别
  • Collect Parameter :  隔离测试用例和测试结果

如何使用TestResult

  • UI层需要得知如下信息:
    • 一个测试开始 : 更新界面(进度条之类)
    • 测试成功与否: 用颜色标记界面
    • 一个测试用例的结束 :更新界面
  • TestResult 肯定不能和UI层关联, 怎么办?

观察者模式

Listener

TestResult :支持Listener

TestRunner

  1. 根据测试用例的类名,创建一个Test (TestSuite)
  2. 创建TestResult
  3. 把自己(TestRunner)当做listener 注册
  4. 运行 test.run(result) 处理通知消息(startTest, addError, addFailure,endTest)
  5. 打印最终结果

给TestCase增加装饰

应用装饰者模式

JUnit 3.x  对测试代码的入侵性比较强

  • 测试类必须要继承TestCase
  • 测试方法应该以test开头
    • testAdd()
    • testSubtract()
  • setUp()  和 tearDown()必须写对

先来定义注解

如何读取这些注解?

运行一个测试用例的方法

运行一个测试用例的所有方法

Runner 出场


评论