Chapter 21 测试驱动的开发与重构:3 ●●●● ●●。●●
Chapter 21 测试驱动的开发与重构
●●● ●●●●● ●●●● 中秋、国庆调课安排 ●●●● ●●●● ●●0● 9/19上课,布置 Project ●9/30停课一次,期间小组自行讨论并完成第 阶段成果。 ●10/9上课
中秋、国庆调课安排 ⚫ 9/19 上课,布置Project ⚫ 9/30 停课一次,期间小组自行讨论并完成第 一阶段成果。 ⚫ 10/9 上课
●●● ●●● ●●●●● ●●●● ●●●● 测试驱动的开发与重构 ●●●● ●●0● ●测试驱动的开发 ●什么是测试驱动的开发 为什么要进行测试驱动的开发 ●如何进行测试驱动的开发 ●重构 ●什么是重构 为什么要重构 示例
测试驱动的开发与重构 ⚫ 测试驱动的开发 ⚫ 什么是测试驱动的开发 ⚫ 为什么要进行测试驱动的开发 ⚫ 如何进行测试驱动的开发 ⚫ 重构 ⚫ 什么是重构 ⚫ 为什么要重构 ⚫ 示例
●●● ●●●●● ●●●● ●●●● 传统测试方法及问题 ●●●● ●●0● ●测试往往不够完整,会导致遗漏的错误; ●测试往往由专门的测试人员实施,他们对程序的 细节往往不够熟悉 测试人员通常根据文档,而不是代码来觉得究竟 要测试哪些内容,而这些文档很容易过期而与代 码不一致 ●大多数的测试是基于手工的,不能够自动完成, 因此无法经常执行,即使重复执行往往也不能保 证两次测试间的一致性
传统测试方法及问题 ⚫ 测试往往不够完整,会导致遗漏的错误; ⚫ 测试往往由专门的测试人员实施,他们对程序的 细节往往不够熟悉 ⚫ 测试人员通常根据文档,而不是代码来觉得究竟 要测试哪些内容,而这些文档很容易过期而与代 码不一致 ⚫ 大多数的测试是基于手工的,不能够自动完成, 因此无法经常执行,即使重复执行往往也不能保 证两次测试间的一致性
●●● ●●● ●●●●● ●●●● ●●●● 什么是测试驱动的开发 ●●●● ●●0● ●先写单元测试用例,再写代码; ●由测试来决定需要什么样的代码; ●由程序员编写和维护完整的测试用例集; ●仅当代码有了相应的测试代码,该代码才能作 为成品代码;
什么是测试驱动的开发 ⚫ 先写单元测试用例,再写代码; ⚫ 由测试来决定需要什么样的代码; ⚫ 由程序员编写和维护完整的测试用例集; ⚫ 仅当代码有了相应的测试代码,该代码才能作 为成品代码;
●●● ●●● ●●●●● ●●●● 个简单的演示 ●●●●● ●●●● ●●0● 编写一个能够执行加法和减法的计算器
一个简单的演示 编写一个能够执行加法和减法的计算器
●●● ●●● ●●●●● ●●●● ●●●●● 测试驱动的开发的优点 ●●●● ●●0● ●能够保证编写单元测试 ●使得程序员获得满足感,从而始终如一地坚持 编写测试 ●有助于澄清接口和行为的细节 可证明、可再现、可自动验证 ●改变事物的信心
测试驱动的开发的优点 ⚫ 能够保证编写单元测试 ⚫ 使得程序员获得满足感,从而始终如一地坚持 编写测试 ⚫ 有助于澄清接口和行为的细节 ⚫ 可证明、可再现、可自动验证 ⚫ 改变事物的信心
●●● ●●● ●●●●● ●●●● ●●●●● 测试驱动的开发的优点 ●●●● ●●0● ●让计算机帮你记住 ●需要实现哪些类、接口和方法 哪些方法还没有实现或者还存在问题
测试驱动的开发的优点 ⚫ 让计算机帮你记住 ⚫ 需要实现哪些类、接口和方法 ⚫ 哪些方法还没有实现或者还存在问题
●●● ●●●●● ●●●● ●●●● 什么是 JUnit ●●●● ●●0● ● Junit是一个测试框架,它的目标是简化单元 测试的开发、运行和报告,主要包含以下的 功能: °断言( assertions) ●测试类和测试集( suites) ●测试运行 测试结果报告 ●对于绝大多数的程序设计语言,都有类似的 单元测试框架,他们统称为 XUnit
什么是JUnit ⚫ Junit是一个测试框架,它的目标是简化单元 测试的开发、运行和报告,主要包含以下的 功能: ⚫ 断言(assertions) ⚫ 测试类和测试集(suites) ⚫ 测试运行 ⚫ 测试结果报告 ⚫ 对于绝大多数的程序设计语言,都有类似的 单元测试框架,他们统称为xUnit
●●●●● ●●●● ●●●● 开发 Junit单元测试的步骤 ●●●● ●●0● 定义一个 Testcase的子类 ●重载 setUp o或者 tearDown(方法(可选) 定义一个或者多个 public testXXXo方法,在这个方法 中 操纵测试对象,包括创建对象、组装对象以及调用其中的方法 ●发起预期结果的断言 随着测试用例的不断增加,可以创建一个 TestSuite类,包含其他 的测试用例。 对每一个类中的每一个公共方法 get/set方法除 至 少定义一个测试用例,如果该方法会抛出异常,则需要定 义相应的异常测试用例。 可以定义一个main方法以便于该测试用例能够独立于开发 环境或者其他工具而运
开发Junit单元测试的步骤 ⚫ 定义一个TestCase的子类. ⚫ 重载setUp() 或者 tearDown()方法(可选). ⚫ 定义一个或者多个public testXXX()方法 ,在这个方法 中: ⚫ 操纵测试对象,包括创建对象、组装对象以及调用其中的方法 ⚫ 发起预期结果的断言. ⚫ 随着测试用例的不断增加,可以创建一个TestSuite类,包含其他 的测试用例。 ⚫ 对每一个类中的每一个公共方法(get/set方法除外),至 少定义一个测试用例,如果该方法会抛出异常,则需要定 义相应的异常测试用例。 ⚫ 可以定义一个main方法以便于该测试用例能够独立于开发 环境或者其他工具而运行