单元测试工具(Junit,Java)培训
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用JUnit的理由(9 使用JUnit的理由(9)
JUnit测试是以Java写成的。 使用Java测试Java软件形成一个介于测 试及程序代码间的无缝(seamless)边界。在 测试的控制下测试变成整个软件的扩充同时 程序代码可以被重整。Java编译器的单元测 试静态语法检查可已帮助测试程序并且确认 遵守软件接口的约定。
在我们开始之前,我们要问为什么要使 用JUnit? JUnit不像传统单元测试的残酷特 性,使用JUnit实际上在你提升程序代码的品 质时,JUnit测试仍允许你更快速的编写程序。 只要你开始使用JUnit你将开始注意到介于程 序代码及测试之间有一个强大的结合力,最 终你的开发风格是只有当一个失败的测试时 才写新的程序代码(only writing new code when a test is failing)。
范例代码(3) 范例代码(3)
/* 测试在cart中增加一个产品 */ public void testProductAdd() { Product newBook = new Product("Refactoring", 53.95); _bookCart.addItem(newBook); double expectedBalance = _defaultBook.getPrice() newBook.getPrice(); assertEquals(expectedBalance, _bookCart.getBalance(), 0.0); assertEquals(2, _bookCart.getItemCount()); } /* 测试清空cart */ public void testEmpty() { _bookCart.empty(); assertTrue(_bookCart.isEmpty()); }
范例代码(2) 范例代码Biblioteka Baidu2)
/* 设定测试设备 在测试案例方法之前呼叫 */ protected void setUp() { _bookCart = new ShoppingCart(); _defaultBook = new Product("Extreme Programming", 23.95); _bookCart.addItem(_defaultBook); } /* 释放测试设备 在测试案例方法之后呼叫 */ protected void tearDown() { _bookCart = null; }
使用JUnit的理由(2 使用JUnit的理由(2)
JUnit非常简单。 编写测试应该很简单--这是重点!如果编 写测试太复杂或太耗时间,便无法要求程序设 计师编写测试。使用JUnit你可以快速的编写 测试并检测你的程序代码并逐步随着程序代码 的成长增加测试。只要你写了一些测试,你想 要快速并频繁的执行测试而不至于中断建立设 计及开发程序。使用JUnit执行测试就像编译 你的程序代码那么容易。事实上,你应该执行 编译时也执行测试。编译是检测程序代码的语 法而测试是检查程序代码的完整性 (integrity)。
JUnit测试是开发者测试。 JUnit测试是高度区域性(localized)测 试;用以改善开发者的生产力及程序代码品 质。不像功能测试(function test)视系统为 一个黑箱以确认软件整体的工作性为主,单 元测试是由内而外测试系统基础的构建区块。 开发者编写并拥有JUnit测试。每当一个开发 反复(iteration)完成,这个测试便包裹成为 交付软件的一部份 提供一种沟通的方式, “这是我交付的软件并且是通过测试的”。
使用JUnit的理由(3 使用JUnit的理由(3)
JUnit测试检验其结果并提供立即的回报。 如果你是以人工比对测试的期望与实际结 果那么测试是很不好玩的,而且让你的速度慢 下来。JUnit测试可以自动执行并且检查他们自 己的结果。当你执行测试,你获得简单且立即 的回报;比如测试是通过或失败。而不再需要 人工检查测试结果的报告。
使用JUnit的理由(7 使用JUnit的理由(7)
JUnit测试提升软件的稳定性。 你写的测试愈少;你的程序代码变的愈 不稳定。测试使得软件稳定并逐步累积信心; 因为任何变动不会造成涟漪效应而漫及整个 软件。测试可以形成软件的完整结构的胶结。
使用JUnit的理由(8 使用JUnit的理由(8)
使用JUnit的理由(10) 使用JUnit的理由(10)
JUnit是免费的(JUnit is free.)。 Junit在JBuilder 6版本以上已经含有。
JUnit 是 以 两 个 关 键 设 计 样 式 来 设 计 的 : 指 令 样 式 (Command pattern)及合成样式(Composite pattern)。 TestCase是一个指令对象。任何包含测试方法的类别都是 TestCase的子类别。TestCase可以定义任意数量的testXXX() 方法。当你要检查期望与实际的测试结果,你激活assert() 方法的各种类型(variaton)。 TestCase 子 类 别 包 含 多 个 testXXX() 方 法 ; 可 以 使 用 setUp()及tesrDown()方法初始化及释放测试下的任何一般的 对象,这个子类别形同测试的基础设备(fixture)。每一个测 试在其本身基础设备的背景下执行,在每一个测试方法之前 呼叫setUp()及之后呼叫tearDown()以确保没有副作用影响测 试的执行。 TestCase实例对象可以合成为TestSuite层级架构;在这 个TestSuite层级架构中可以自动激活定义在TestCase实例对 象中的所有testXXX()方法。一个TestSuite是其它多个测试 的一个合成对象(composite),其中包括TestCase实例对象及 其它的TestSuite实例对象。这个由TestSuite代表的合成对 象行为允许你组合测试的测试系列的测试系列到任意深度, 并且自动一致性(uniformly)的执行所有测试以产出个别的通 过或失败的状态。
使用JUnit的理由(5 使用JUnit的理由(5)
编写JUnit测试所费不多。 使用Junit测试框架,你可以很便宜的编 写测试并享受由测试框架所提供的信心。编 写一个测试就像写一个方法一样简单;测试 是检验要测试的程序代码并定义期望的结果。 这个测试框架提供自动执行测试的背景;这 个背景并成为其它测试集合的一部份。在测 试少量的投资将持续让你从时间及品质中获 得回报。
使用JUnit的理由(4 使用JUnit的理由(4)
JUnit测试可以合成一个测试系列的层级 架构。 JUnit可以把测试组织成测试系列;这个 测试系列可以包含其它的测试或测试系列。 JUnit测试的合成行为允许你组合多个测试并 自动的回归(regression)从头到尾测试整个 测试系列。你也可以执行测试系列层级架构 中任何一层的测试。
简 介
本培训的目的是展示一个编写及执行 JUnit测试案例及测试系列(suites)(或测试 包)简单快速的方法。 我们一开始先探讨使用JUnit的主要优点 然后编写一些测试范例以展示其简单性及效 力。 在你开始之前,请确认你已下载并安装 下列的软件: JUnit (3.1 or later)
为什么使用JUnit? 为什么使用JUnit?
使用JUnit的理由(6 使用JUnit的理由(6)
编写JUnit测试所费不多。 使用Junit测试框架,你可以很便宜的编 写测试并享受由测试框架所提供的信心。编 写一个测试就像写一个方法一样简单;测试 是检验要测试的程序代码并定义期望的结果。 这个测试框架提供自动执行测试的背景;这 个背景并成为其它测试集合的一部份。在测 试少量的投资将持续让你从时间及品质中获 得回报。
范例代码(1) 范例代码(1)
下列是一个测试案例的范例: 测试案例的范例(Example Test Case) import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class ShoppingCartTest extends TestCase { private ShoppingCart _bookCart; private Product _defaultBook; /* 以特定名称建构一个ShoppingCartTest。 建构函数是以测试案例的名称当作参数 */ public ShoppingCartTest(String name) { super(name); }
JUnit的设计 JUnit的设计
第一步:编写一个测试案例
首先,我们将编写一个测试案例以便检测单一软件组件。我 们将聚焦于编写测试;这个测试检验这个组件的行为;而这个对 象的行为是有着最高的破损的可能性,因此可以从测试的投资获 得最大的回报。 编写测试案例请依据下列的步骤: (1)定义一个TestCase的子类别。 (2)覆写setUp()方法以初始化测试中的一个或多个对象。 (3)覆写tearDown()方法以释放测试中的一个或多个对象。 (4)定义一个或多个公开的testXXX()方法;这些方法 检 验这些测试中的对象并且评估期望的结果。 (5)定义一个静态的suite()工厂方法;这个工厂方法构建一 个TestSuite其中包含TestCase的所有testXXX()方法。 (6)随意的定义一个main()方法以批量的方式执行TestCase。
使用JUnit的理由(1 使用JUnit的理由(1)
在你提升程序代码的品质时JUnit测试仍允许 你更快速的编写程序。 是的,我知道,那听起来似乎不是很可能,但 那是事实。当你使用JUnit编写测试,你将花更少 的时间除虫,同时对你程序代码的改变更俱有信心。 这个信心让你更积极重整程序代码并增加新的功能。 没有测试,对于重整及增加新功能你会变得没有信 心;因为你不知道有甚么东西会破坏产出的结果。 采用一个综合的测试系列,你可以在改变程序代码 之后快速的执行多个测试并对于你的变动并未破坏 任何东西感到有信心。在执行测试时如果发现臭虫, 原始码仍然清楚的在你脑中,因此很容易找到臭虫。 在JUnit中编写的测试帮助你以一种极大(extreme) 的步伐编写程序及快速的找出缺点。
单元测试工具培训
JUnit单元测试 JAVA的终极测试工具
黄锡波 2004年01月18
培训内容
本次讨论时间是1小时 简介 为什么使用JUnit? (10分钟) JUnit的设计(5分钟) 第一步:编写一个测试案例(10分钟) 第二步:编写一个测试系列(5分钟) 第三步:执行测试(10分钟) 第四步:组织测试(10分钟) 测试惯例(5分钟) 讨论(5分钟)
+
范例代码(4) 范例代码(4)
/* 测试从cart中移除产品 如果此产品不在cart中丢出一个ProductNotFoundException的例外 */ public void testProductRemove() throws ProductNotFoundException { _bookCart.removeItem(_defaultBook); assertEquals(0, _bookCart.getItemCount()); assertEquals(0.0, _bookCart.getBalance(), 0.0); } /* 测试从cart中移除一个未知的产品 如果ProductNotFoundException例外产生表示测试成功 */ public void testProductNotFound() { try { Product book = new Product("Ender's Game", 4.95); _bookCart.removeItem(book); fail("Should raise a ProductNotFoundException"); } catch(ProductNotFoundException success) {// 测试成功 } }