




已阅读5页,还剩54页未读, 继续免费阅读
(计算机应用技术专业论文)面向数据库的单元测试框架的设计与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 在软件的开发中,有相当多的都涉及到数据库的使用,面向数据库的单元测 试在其中发挥着重要的作用。本文设计并实现一种面向数据库的单元测试框架, 该框架使用在n e t 下,能够有效的提高面向数据库的单元测试的效率。 面向数据库的单元测试属于单元测试的一种。在面向数据库的单元测试中, 由于数据库的状态会跟随着单元测试的进行而发生改变,导致面向数据库的单元 测试难以有效的发挥作用。因此,实现该框架必须要解决在测试过程中数据库状 态的设置以及恢复的问题。 要实现面向数据库的单元测试框架,必须对其他的单元测试框架及其基本的 结构有一定的了解。目前已经推出了很多的单元测试框架,包括j u n i t 、n u n i t 、 d b u n i t 等,其中最早的是j u n i t ,其他的单元测试框架大都借鉴了它的设计思想。 要实现该单元测试框架,可以有多种的实现方案选择,目前使用的是采用) 【m l 实现。为了能够方便的设置以及恢复数据库的状态,需要提供一些基本的功能, 包括插入、删除、修改、更新等等。在该面向数据库的单元测试框架具体实现方 面,该框架针对s q l c l i e n t 以及0 1 e d b 两种数据接口。通过结合x l l ,应用了多 种算法以及设计模式,包括c o m p o s i t e 模式、a d a p t e r 模式、t e m p l a t e 模式、b r i d g e 模式以及f a 9 a d e 模式等。 该框架最终生成为动态链接库d l l 文件。通过在实际项目中的使用证明,可 以有效的提高单元测试的效率。 关键词极限编程;测试驱动开发;v i l ;单元测试 a b s t r a c t hs o f t w a r ed e v e l o p m e m ,m a n y 印p l i c a t l o i l su s em ed a t a _ b a s e ,s oi ti sv e r yi m p o n a n tt ou s e d a t a b a s e o r i e n t e du i l i tt e s t an e wd a 劬a s e o i _ i e n tu n i tt e s t 丹锄ei sd e s i g n e da i l di n l p l e r n e n t e d h e f e nc 孤i i n p r 0 v em ee 任| c i e n c yo fs o f t w a r ed e v e l o p i n gi nt l ed a t a _ b 船e - o d e n t e du l l i tt e s tw h i c h i su s e d o n n e t d a t a b a s e o r i e m e d 砌tt e s tb e l o n g st ou i l i tt e s t b e c a u s el h ed a t a b a s es t a t ew i l lb es h i f i e d w h e i l 也eu 1 1 i tt e s ti sd e v e l 叩i n g ,w ec a n t b e n e 丘t 如mm eu i l i tc o m p l e t e l y t ob eh o n e s t o i n 平l e 咖tn l ed a t a b a s e o r i e n t e d 匹tt e s t ,廿l ek e yi ss e t u pa n d ”s t o r el l l es t a t eo f i l l ed a t a b 觞e t bi n l p l e m e mm ed a t a b 船e - 嘶e n t e du 1 1 i tt e s t ,i t1 si l e c e s s a r yt ou n d e r s t a l l do 出e ru n i tt e s t 丘a i 鹏n o wt l l e r ei sm 锄yu i l i tt e s t 如m e s ,h l c l u d i n g 几城t ,n u n i t d b u l l i t ,e t c m 缶s tu l l i tt e s t f h m ei sj u i l i t ,1 0 s to f l eo t h c r 鼬e sl l s e 恼s 仃u c 眦a n d 廿1 0 u g h t t h e r ea r em a n yl n e 山o d st 0i r n p l e m e n t 廿l eu n j tt e s t 丘蛐e t h ed a t a b a s e o r ! i e n t e d 嘶ti e s t 丘a 眦i si i i 驴l e m e n t e d 血r o “g hx m lt os e ta n dr e s t o r e 血es t a t eo ft h ed a t 矗b a s e ,s o m ef 【l n c 矗o n s a r en e e d e d ,i n c l u d 吨i n s e r t ,d e i e t e ,u p d a t e ,r e 缸s h ,e t c m e ng o i n gi 1 1 t op 硎c u l 盯s ,s q l c l 硫 a i l d0 1 d d bi si n c l l l d e di n 吐l ed e s i g i lo ft h e 丘a m e w h a t sm o r e ,x m l ,m a i l ym e m o d sa 1 1 dd e s i 肛 p a t t e m s ,1 1 k ec o m p o s i t e ,a d a p t e lt e 呷1 a t e ,b 订d g ea 1 1 df a c a d e ,a r ea l s oi n c l u d e di n 吐l ed e s i g no f f h e n e t bm e 五m m e ,o n ed l lf i l e si sg o ta t1 a s t a r e ru s i i l gt h cd a 乜b a s e - o r i e n t e du n nt e s t 丘姗e ,血e d e v e l o p m e n to f t h ep r o j e c tc 孤b ei m p r o v e d 廿1 ee m c i e n t l y k e y w o r d s e x t r e m ep r o g r a m m i n g ;t e s f - d r 主v e nd e v e l o p m e n t ;l ;u n i tt e s t u i 独创性声明 本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研 究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他 人已经发表或撰写过的研究成果,也不包含为获得北京工业大学或其它教育机构 的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均 己在论文中作了明确的说明并表示了谢意。 虢挝隰邵曼 关于论文使用授权的说明 本人完全了解北京工业大学有关保留、使用学位论文的规定,即:学校有权 保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部 分内容,可以采用影印、缩印或其他复制手段保存论文。 ( 保密的论文在解密后应遵守此规定) 签名:荔星 新魏禾轧吼堡凸 第1 章绪论 1 1 引言 面向数据库的单元测试属于单元测试的范畴,是极限编程和测试驱动开发的 重要组成部分。本面向数据库的单元测试框架是在n e t 下开发的,可以有效的 提高极限编程以及测试驱动开发的效率。 极限编程是近年来提出的软件开发方法学。2 0 叭年,为了解决许多公司的 软件团队陷入“焦油坑”n 1 的问蹶,一批业界专家一起概括出了些可以让软件开 发团队具有快速工作、响应变化能力的价值观和原则,他们称自己为敏捷联盟。 敏捷开发过程的方法很多,主要有:s c r u m ,c r y s t a l ,特征驱动软件开发( f e 姐1 r e d r i v d c v e l o p m e m ,简称f d d ) ,自适应软件开发( a d a p t i v es o 脚a r e d e v e l o p m e n t ,简称a s d ) ,以及其中最著名的极限编程( e x 蜘ep r o g r a n l m i n g , 简称,】。x p 是于1 9 9 8 年由s m a l l t a u ( 社群中的大师级人物k - e n t b e c k 首先倡导 的,是一种轻量级的软件开发方法学,也是一种处理软件开发过程中各个级别上 风险的软件开发方法瞄。它将编码作为主要的任务,有效的提高了软件开发效率。 ,已经不仅仅使一种软件开发方法,而是作为一门软件开发学科,具有使用便 捷、易于沟通和反馈性强、鼓舞士气及振奋人心的特性。x p 重视对人的管理, 侧重于客户、管理者及程序员的角色,并授予拥有这些角色的工作人员重要的权 利和责任。软件开发项目中,首先是要实现客户的业务价值,不同于传统的重量 级开发方式,x p 将尽快交付一个可用的软件放在首位。,对于采用传统开发方 法的开发人员来说,能够改善彼此之间的关系,提高个人的信息,极大的开阔他 们的视野。 自上个世纪6 0 年代以来,人们在软件工程领域实现了很多的突破,逐渐形 成了一套完整的软件开发理论、技术和方法,它们对于软件开发起到了重要作用。 近年来,随着软件系统规模的不断扩大和软件复杂性的不断提高,传统的“瀑布 式”的软件开发方法暴露出很多弊端,已逐渐不能适应现阶段软件开发的需要。 正是在这种背景下,一种全新的软件开发方法一测试驱动开发( t e s d r i v e n d “e 1 0 p m e n t ,简称t d d ) 应运而生。在软件开发中,依赖性是个比较棘手的问 d “e l o p m e n t ,简称t d d ) 应运而生。在软件开发中,依赖性是个比较棘手的问 北京工业大学工学硕士学位论文 题 3 1 。测试驱动开发以不断地测试推动代码的开发,既简化了代码,又保证了软 件质量。测试驱动开发针对当前软件开发中的一种普遍存在的不愿意对自己的软 件进行测试的心理【4 。作为软件开发人员,大家都知道为自己的代码编写测试程 序可以大大降低维护的难度,提高软件的可读性,但是很少有人这样做。一个普 遍的原因是开发时问的不足,没有足够的时间编写测试程序,又导致了代码的效 率与质量低下,后期又要有很多的时间花在系统维护上,最终导致实际的软件开 发效率大大降低,从而形成了一个恶性循环【5 。测试驱动开发是极限编程开发方 法中的基石,它要求首先编写测试用例( t e s t c 嬲e ) ,以测试来推动代码的编写, 极大的降低了系统维护成本。 1 2 课题背景 单元测试作为极限编程以及测试驱动开发的重要组成部分,在软件开发中有 着非常重要的作用。单元测试针对具体的对象,可以极为方便地对某个对象要实 现的功能进行自动化的测试,在测试驱动开发中发挥着重要的作用。在实际应用 中,针对不同的类,设计不同的单元测试类,使用单元测试框架,在不影响原先 系统的前提下,根据预先设定的条件,清晰地显示出各个功能运行的结果,可以 尽可能早的了解各个对象功能的实现情况。根据x p 的原则,尽可能频繁的进行 单元测试,可以及时发现系统的b u g ,有效的降低维护成本【6 。 最早的单元测试框架是j u h i t ,由极限编程和测试驱动开发的创始人k e n t b a c k 以及e c l i p s e 架构师之一、设计模式之父e r i c hg 黝a 共同开发。j u n i t 的 推出,标志着单元测试真正从理论走向了实际应用。作为一个开源的单元测试框 架,m t 在推出之后,深受j a v a 程序员好评,荣获2 0 0 1 、2 0 0 2 年“j a v aw o r l d 编辑选择奖”以及2 0 0 3 年“j a v a w j r l d 最佳测试工具”和2 0 0 3 年( j a v a p r o 最佳,a v a 测试工具”等众多奖项。 另外,因为此类的单元测试软件推出时间比较晚,目前名称也不一致,有人 称之为单元测试框架,有人称之为单元测试工具,为方便起见,本文统一称之为 单元测试框架。 第1 章绪论 1 3 问题提出 在应用软件开发中,有相当多的开发都涉及到对数据库的存取操作,对于此 类软件的开发,面向数据库的单元测试起着极为重要的作用。 对于面向数据库的单元测试框架,不仅仅要实现普通单元测试框架所应该具 有的基本功能,而且能够控制数据库状态,以此来保证单元测试的可重复性。对 于数据库的操作,经常会有插入、删除、修改以及查询操作,这些操作往往会改 变数据库的状态。根据测试驱动开发的原则,应当尽量频繁进行单元测试。在面 向数据库单元测试过程中,数据经常会被修改,但是面向数据库单元测试却往往 需要数据库的状态确定,只有这样才可以给单元测试断言语句或其他测试提供一 个基准,实现单元测试的自动化。例如:在企业应用中,某个类有修改用户密码 的功能。如果通过单元测试来测试该功能,并且测试成功的话,用户的登录密码 将被修改。假如在测试完毕后没有恢复至测试前状态,那么根本无法再次进行单 元测试。在实际的操作方面,如果没有通知相关测试人员,他们仍然使用旧密码, 势必无法登陆系统。不仅仅是修改操作,对于插入删除操作进行单元测试,同样 也会有数据库状态不确定问题的产生,导致面向数据库单元测试的失效。如果在 做该类单元测试时出现系统错误,使单元测试在中途停止,就会导致数据库的状 态发生改变,使数据库处于一种未知的状态。 在面向数据库的单元测试中,关键的问题是在单元测试时将数据库设置到一 个确定的状态。为了不对其他的系统操作产生影响,在单元测试完成后,最好可 以将数据库恢复到测试之前的状态。针对在测试中数据状态的不确定性,目前已 经提出了一些解决方案,有手动恢复数据库状态、通过其他的类方法恢复数据库 状态、测试方法中编码恢复数据库状态、通过面向数据库的单元测试框架恢复状 态等。其中比较好的是采用面向数据库的单元测试框架,该单元测试框架是近年 来推出的,主要由开源组织编写,属于x u n i t 单元测试系列。 对于目前软件开发平台的两个主要阵营,j a v a 与n e t ,在j a v a 下面向数据 库的单元测试框架相对比较成熟,d b u n i t 测试框架在面向数据库的单元测试中 使用比较普遍。通过使用v i l ,d b u l l i t 可以将数据库的状态哲存,也可以将数 据库设置为某种指定的状态。可以针对不同的数据库,在统一的单元测试框架下 进行单元测试,并在测试前后实现数据库状态的设置以及恢复。相对而言,参 与n e t 下单元测试工具开发的人要少的多,而在n e t 面向数据库的单元测试框 架由于开发起步较晚,目前尚未有比较成熟的面向数据库的单元测试框架出现。 1 4 课题来源 本课题来源于天雄科贸有限公司实箍的e r p 项目,该公司是一家比较大的 流通企业,客户遍布全国。为了有效的实现客户关系管理,公司同时引入了微软 c r m 客户关系管理系统,以求能够对整个供应链进行方便、快捷而及时的信息 反馈。在微软c r m 与天雄e r p 系统的整合过程中,需要在微软c r m 系统的基 础上进行一定程度的改进。微软c r m 系统由c # 开发,并且基本不开放源代码。 为了解决在开发过程中碰到的各种问题,增强单元测试的功能,提高开发效率, 提出了该面向数据库的单元测试框架。 1 5 论文研究内容 作为面向数据库的单元测试,除了作为单元测试的某些基本功能外,还需要 可以设置以及恢复数据库的状态,主要有以下的研究内容需要解决: 一、为了实现面向数据库的单元测试框架,需要了解与不同数据库交互的数 据接口。在与数据库的交互操作中,o d b c ( a i p e nd a f a b a s ec o 衄e c t i v i t y ) 作为通用 的数据库接口,是一种底层的访问技术,每次只能返回一个结果集,且调用层次 多,因而通过这种接口操作数据库的效率低【”。o l e d b 也是一种底层的数据接 口,通过c o m a p i 访问数据库,它位于o d b c 层与应用程序之间,如果程序通 过a d o 来访问数据库,a d o 调用先被送到o l e d b ,然后再交由o d b c 处理, 如果直接连接到o l e d b 层,则有利于服务器端游标性能的提升 8 】os q l c l i e n t 对 s q l 数据库的处理做了优化,只能针对s q ls e e r 数据库,在n e t 下, s y s t e m d a t a s q l c l i e n t 命名空间的类效率要比s y s t e m d a t a o l e d b 命名空间中的 类高一些。作为面向数据库的单元测试框架,需要对o d b c 、o l e d b 、s q l c l i e n t 等进行深入的了解,以实现数据库的状态设置及恢复。 二、为解决测试中数据库状态的不确定性,需要一种能够表示数据库状态的 方法。x m l 作为标准的异质平台之间传输消息语言,它产生的消息( 或者文档) 可以通用于各种不同的平台、终端。当系统接收一个) ( 】l 文档后,可以又把它 转换为需要的最终文档或者状态。因此,可以利用v i l 来帮助实现面向数据库 的单元测试,读取库表的内容并将它再存储为) 口l ,并用订l 文件的内容来 创建面向数据库的单元测试的数据集,将数据库设置到指定的状态。为实现面向 数据库的单元测试,需要研究) a l 在面向数据库的单元测试框架中的应用,通 过) a l 表示数据库的状态。 三、为实现在n 】狐下面向数据库的单元测试框架,需要对其他的单元测试 框架做深入的了解和研究。目前的单元测试框架基本上都是借鉴了j u h i t 的设计, 例如在n e t 下的单元测试工具m i t 的早期版本就是从刚_ m t 迁移而来。作 为n e t 下面向数据库的单元测试框架,同样需要对其他的单元测试框架进行研 究与分析。面向数据库的单元测试框架需要结合某个针对具体语言的单元测试框 架来使用,如在j a v a 下面向数据库的单元测试框架d 乩肺t 是与j u n i t 结合使用, 作为在n e t 下面向数据库的单元测试框架,同样需要与某个具体的单元测试框 架如m n i t 、c s u n i t 结合使用。 本文通过分析目前在n e t 下面向数据库的单元测试存在的问题,在研究 j a v a 以及j 也t 下各种单元测试工具的基础上,结合订l ,针对不同数据库的数 据接口,实现n e t 下面向数据库的单元测试框架。 第2 章单元测试分析 2 1 单元测试框架的设计思想 目前的单元测试框架有j a v a 下的j u n i t ,n e t 下的n u i l i t ,面向数据库的单 元测试框架d 旧u n i t ,n d b u l l i t 等。最早的x u i l i t 框架是由e r i c hg a m m a 和k e m b e c k 编写的回归测试框架j u i l i t ,它通过创建一个通用的测试框架,将测试代码 封装到对象中,可以方便地同步设计并配置自己的单元测试【9 。同时,也让测试 代码具备保值性,使测试代码的进行方式标准化,可为多人共同浏览、维护。由 于该框架将测试代码从系统代码中剥离开,二者可同步发展,提高了开发效率。 在单元测试框架中提供了许多断言( 船s e n ) 方法,允许用户设置测试的规 则,如:a s s e r t e q u a l s ( ) 、弱s 酬1 1 0 、a s s e n n b t s a m e o 、韶s e r t i h e ( ) 等方法,一个 测试用例包括了多个断言,当运行测试用例后,单元测试运行器会报告哪些断言 没有通过,开发人员就可根据这些信息来查找程序的问题所在。而传统的测试方 法需要将期望的结果用诸如s y s t e m ,o u t p r i n t l i l ( ) 等语句将过程信息打印到控制台 或日志中,由开发人员观察输出信息以判断是否正确,现在这种”观察”的工作由 j i j n i t 的那些a s s e r t x x x 0 方法自动完成。 单元测试是,的核心内容之一,也是重构的必要条件【”】。它是针对每个模 块进行的测试,可从程序的内部结构出发设计测试用例,多个模块可以平行地对 立地测试。通常在编码阶段进行,必要的时候要制作驱动模块和桩模块。从二十 世纪九十年代中期以来,面向对象的软件开发开始成为主导观念。单元测试充分 利用了面向对象开发的优点,对对象的方法进行测试。通过单元测试,可以明确 的知道代码能否达到目的;尤其重要的是,可以了解代码在修改的过程中,是否 会影响到其他代码运行的正确性。另外,如果集成测试出现问题,它们可以帮助 诊断。单元测试的第一个框架是j u l l i t ,在几h t 的基础上产生其他语言的框架, 目前几乎所有面向对象的开发语言都能找到相应的框架。单元测试框架一般提供 一个基本接口,开发人员继承这个接口,并实现测试的具体内容 i l 】。一般来说, 接口提供一个s e t u p 函数,一个t e a r d o w n 函数,通过这两个函数可以提供测试 的初始化代码以及释放测试过程中使用的资源。 在x p 下,一般由类包的编写者负责编写单元测试,这个限定对于系统的开 北京工业大学工学硕士学位论文 发是极为有利的。单元测试不仅仅是对软件功能的测试,更重要的是对于程序的 设计也起着重要作用。测试单元所要测试的不仅仅是对象提供的接口,也应该以 一个对象的内部状态的转换为基本编写单元【1 2 】。只有这样,测试才能保证对象的 运行时态行为符合需求,而仅通过类接口的测试,只能确保对象符合静态约束, 因此在测试的过程中,必须开放一定的内部数据结构,或者针对特定的运行行为 建立适当的数据记录,并把这些数据暴露给特定的测试单元 13 1 。也就是说编写单 元测试时必须对相应的类包进行修改,这样的修改也发生在以前使用的测试方法 中,所以以前的测试标记及其他一些测试技巧仍然可以在单元测试中改进使用。 按照测试驱动开发的思想,一个典型的测试流程如图2 1 【4 2 1 所示: 图2 1 测试沉程图 f i g u r e2 - lt e s tn o wc h a n 2 2 基于面向对象技术的单元测试分析 面向对象技术是2 0 世纪9 0 年代对软件的最重要发展( 变革) 。由于它的出 现,我们构建软件的方式也随之发生了改变,以至于在全球范围内的网络和多厂 商的计算机上的应用程序相互通信的方式、设计业务过程的方式和对企业的思考 方式。面向对象技术的概念集与现实世界建模的工具集是对应的1 4 】,它扩张了抽 象数据类型的思想,加入了有助于更好管理复杂性的重要改进,提供了一系列与 现实世界对应的类以及对象来实现系统的功能。简单的说,类是一种提供功能的 第2 苹单兀羽i 试分析 数据类型,一个类有域、属性、子程序和函数等成员。对象被称为类的实例,因 此创建一个对象的过程又被称为实例化1 5 】。通过高层次的面向对象模型,可以提 供更多的可以编程的控件,降低软件开发费用;向对象技术提供了更高的复用性; 抽象使代码修改的影响更加局部化以及最小化。 面向对象技术的出现,使单元测试成为可能。为了代码重用,面向对象技术 将现实世界中的事务当成软件系统中虚拟的对象对待,将类的方法、属性等封装 起来,对外提供相关的接口。而单元测试针对的是具体类的接口,不管类方法的 内部是如何实现的,主要关注该方法是否可以达到预期的结果【l 叫。在单元测试 框架下,在对类内部编码不做丝毫改变的情况下,创造出一个针对类接口的测试 环境。在单元测试的框架下,可以首先编写测试用例代码,虽然要测试的功能代 码还没有编写,所以测试代码甚至不能编译,但是已经给后续的编码指明了方向。 在完成了测试用例后,随之开发程序代码的编写,即使是程序还存在一些不合理 的地方,但是要尽快让这个测试程序工作起来。在代码完成后,消除程序中存在 的重复设计,在测试代码的帮助下,优化设计结构【l “。 在开发软件系统过程中需要很多的测试,单元作为其中的种,单元测试并 不能保证程序没有任何错误。但是在所有的测试中,单元测试是首先要做的一个 环节,也是最重要的一个环节。单元测试是一种要由软件的开发人运自行测试的 工作。单元测试的目的是测试代码按照撰写者依据其所设想的方式执行是否产生 了预期的结果【1 8 。 2 3 单元测试框架分析 随着重构技术和,软件工程技术的广泛推广,单元测试的作用在软件工程 中变得越来越重要,而一个简明易学、适用广泛、高效稳定的单元测试框架对成 功的实施单元测试有着至关重要的作用【1 9 】。目前主要的单元测试框架是由开源组 织推出的x u n i t 系列,包括有丁u n i t 、n u n i t 、d b u n i t 等。其中几m t 是最早的单 元测试框架,它为j a v a 程序开发者实现单元测试提供一种框架,使得j a v a 单元 测试更规范有效,并且更有利于测试的集成。 j u 工1 i t 的定义是叮u “ti sa no p e ns o l l r c ej a v at e s t i n gf r 锄e w o r ku s e dt ow r i t e a 1 1 dr u nr e d e a t a b l et e s t s ” 9 】d 几m i t 作为一个j a v a 下的集成测试工具,可以实现j a v a 下单元测试的自动化。在此的单元测试属于软件工程里的白盒测试,测试某个类 的某个方法的功能。胁i t 为j a v a 程序开发者实现单元测试提供一种框架,使得 j a v a 单元测试更规范有效,提高测试效率 2 0 】。 j u i l i t 由七个p a c k a g e 组成,核心的是j u i l i t 劬m e w o r k 和j u l l i t 删。 f r a m e w o r k 包负责整个测试对象的构架,r 咖e r 负责测试驱动。 j l j h i t 有四个重要的类:t e s t s l l i t e 、t c s t c a s e 、t e s 瓜e s u h 、t e s t m h m e r 。前三 个类属于f r u n e w o r k 包,后一个类根据环境的不同而不同。如果是在文本测试环 境,用的是j u i l i t t e x t i l i t e s 氓l l n n e r ;如果是在图形测试环境,用的是 j u n i t s 呻i t e s t r u 衄e r 2 1 。各个类的职责如下: t e s t r e s u h 代表t e s t c a s e 所执行的结果,结果可以分为两类,一类是断言中 会出现的f a i l u r e ,这是用户可以预测到的;另外一类是程序执行中出现的e r r o r , 这个是用户并没有预测到的。同时t c s t r e s u l t 类负责将测试结果转发到 t e s t l i s t e n e r 处理。 t e s 倦u r 】n e r 代表程序中对象调用的起点,跟踪整个测试流程。负责与用户交 互,可以显示的测试的结果,报告测试的进度。 t e s t s u i t e 可以包含所有的t e s t c a s e 类,以便所有的t e s t c a s e 类作为整体来 运行。 t e s t c a s e 可以代表单独的客户测试类,在测试时可以对客户类进行初始化, 方便测试方法调用。 另外,j u l i t 还有两个重要的接口:t e s t 和t c s t l i s t c n e r 。 t e s t ,包含两个方法:m n o 和c o u n t t e s t c a s e s ( ) ,可以提取测试动作特征。 t e s t l i s t e l l e r 包含四个方法:a d 旺i r r o r 0 、甜d f a i l u r e ( ) 、s t a n t e s t ( ) 和e n d t e s t ( ) , 用来处理测试结果以及提取测试驱动过程的动作特征。 砌n i t 的测试框架类结构很简单,主要由3 个类组成,其类图关系如图2 2 所示: 图2 2 j u 疵类关系图 f i g u r e2 _ 2c h a no f 几胁tc l a s s 当m t 中的t e s t s u i t e 进入单元测试时,依照以下步骤运行: 1 创建测试用例的实例化对象。 2 如果在s e f u p 0 方法中有一些初始化的代码,首先执行在该方法中的代码。 3 运行具体t e s t c 船e 中的单元测试方法。 4 如果在t e a r d o w n ( ) 方法中有一些诸如销毁对象等的代码,执行该段代码。 有时候,t c s t c a s e 类中有多个单元测试方法,而且这些方法都需要使用到相 同的多个对象,这时可以在s e t u p 0 中实例化这组对象,并在t e a r d o w n 0 中销毁它 们【2 ”。这样的单元测试编写可以依照以下步骤进行: 1 创建t e s t c a s e 类的子类。 2 在子类中声明若干个测试所用的对象,并设置为研v a t e 属性。 3 覆盖s e t u p ( ) 方法,在方法中实例化这些对象。 4 覆盖t e a r d o w n ( ) 方法,释放这些对象的资源。 2 3 2n u n i t n u n i t 是在n c t 下的开源单元测试框架,最初是直接由j i j n i t 迁移过来的, 也属于x u i l i t 单元测试系列。n u n i t 完全由c # 开发,充分利用了n e t 的特点以 及优势,当前版本为2 2 7 。执行单元测试,是为了证明某段代码的行为确实和 开发者期望的一致【2 3 】。不同于其他的x n u m t 框架,m j n i t 框架使用a t c 曲u t e ( 如 代码中的 t e s t ) 来描述测试用例。n u l l i t 没有和v s n e t 集成,可以把启动应用 程序项设置成j n i t 的主程序来解决。如果要用图形界面,可以运行n u m t g u i 北京工业大学工学硕士学位论文 项目来加载测试,如果要用样例,则选择s a m p l e m o n e y d l l 程序集。加载了一个 程序集后,聊e n 锄e 框就会显示已经定义了测试的程序集的类型。点击r l u l 按 钮,可以执行所有的测试,并在图形窗口底部查看结果。 n u m t 用反射机制在单元测试代码中找到测试方法。为了创建一个测试包, 需要创建一个执行测试的类,该类必须从t e s t c a s e 继承。n u m t 中有如下的 a t m b u t e : t e s t f i x t u r e 】 该属性表示下面的类是一个测试类,如果要测试某一个类,需要在这个类的上方 添加 t e s 伊i x t i l r e 属性。 【t e s t 】 表示下面的方法是一个测试方法。 i 弘o r e ( ”i 印o r e 也i sv o i d t f ) 表示不对下面的一个方法进行测试。 t e s t f i x t u r e s e t u p 表示下面的方法在类测试前运行,可以进行一些类的初始化工作。 t e s t f i x t l l r e t e a r d o w n 表示下面的方法在类测试后运行,可以针对类做一些资源释放的操作。 s e t u 纠 表示下面的方法在每个测试方法开始之前运行。 t e a r d o w n 】 表示下面的方法在每个测试方法结束之后运行。 【t e s t 【e x p e c t e d e x c e p t i o n ( t ) p e o f ( e x c e p t i o n ) ) 】 如果这两个属性在一起使用,可以用来测试是否有正常的异常触发。 2 3 3d b u n i t d b u 血是j a v a 下面向数据库的单元测试框架,是为数据库驱动的项目提供 的一个对n i t 的扩展,除了提供一些常用功能,它可以将你的数据库置于一个 测试轮回之间的状态。作为在j a v a 下面向数据库的单元测试框架,d b u n i t 要和 其他在j a v a 下的单元测试框架如j u n i t 结合使用,通过对j u m t 的扩展,实现j a v a 下面向数据库的单元测试。 在数据库测试中,因为力求将每个t e s t c a s e 中众多的测试方法完全的隔离起 来,不会因为一个测试方法因测试增加、删除功能而影响到另一个测试方法,这 样,在每一个测试之前,数据库的状态是否稳定,甚至是完全不变,就显得分外 重要。d b u n j t 在每个测试方法之前后,通过增删些固定的记录,保持数据库的 固定状态,因此,在面向数据库的单元测试中,可以在每个测试方法中自由地增 删记录,而不用担心会影响到别的测试方法。 相对于扩展d b u i l i t 中的基础类d a t a b a s e t e s t c 鹊e ,d b u t l i t 框架中自带a m t 功能。允许在a n t 的b u i l d x m l 文件中控制数据库的状态。这个功能对于作成的 诸多测试用例,提供了一个相当简洁的解决方案。利用d b u m t ,在测试之前, 可以向目标数据库植入所需要的数据集,在测试完毕后,数据库也能够回溯到测 试前的状态。 d b u m t 框架提供了一个基本的抽象测试用例类d 如l b a s e t c s t c 鹤e ,作为j 1 l i n i t 框架中的基础类t e s t c a s e 的子类。如果使用这个类必须首先实现两个h o o k 方法 g e t c o n n e c t i o n 0 和g e t d a t a s e t ( ) 。 方法 g e t c o l l i l e c t i o n 0 需要返回一个 d a t r l b a s e c o 妯e c t i o n 类型的对象,该对象是一个基于普通j d b c 连接的包装类。 方法g e t i ) a 扭s e t ( ) 返回一个a t a s e t 类型对象,就是x m l 数据种子文件的另一种 表现形式。 对于数据库的状态设置,d b u 血主要通过讧l 完成,可以通过x m l 文件 的协助完成对库表的插入、删除、修改等。例如:某个e m p l o y e e 表的讧l 如 下: 通过调用d b u h i t 本身提供的r e 骶s h 、d e l e t e 、h l s e n 等,可以将要求的x m l 数据插入到库表中,可以实现j a v a 下在单元测试工具如j l 碰t 中面向数据库的单 元测试。 2 3 4 其他单元测试框架简介 全面单元测试对于保证软件开发过程的质量至关重要,但尤其在n e t 下, 该观点还没有被广泛接受。近来有三个因素使之日益重要。第一,n e t 开发环 境极大地改进了开发人员编写定制测试自动化的能力。那些在n e t 框架以前 需要花费数周时间创建的测试程序现在仅用几小时就可以写好。第二,正在建立 的日益复杂的系统需要更精益求精的测试1 2 “。最后,软件安全在软件开发过程中 已不再是事后才关注的事情,它已成为一个绝对要素。目前大多数的开发语言都 有相应的单元测试工具。 d u n i t :属于x u n i t 家族中的一员,用于d e p t l i 的单元测试。是e x 打e m e p r o 乒瑚i n g 测试实现x 骶m et e s t i n g 的一种工具。d u n i t 是一个免费的测试工具, 没有代码覆盖率功能。 c f u n i t :一个专为c o l d f u s i o n 设计的单元测试工具。它基于n i t 单元测试 框架。c f u n i t 不是进行单元测试的必须工具,但它可以方便开发者更加便捷的 编写测试代码。 c p p u n i t :一个专门面向c + + 的测试框架。c p p u n i t 将所有的单元测试按照 树的结构来表示。在c p p u n i t 中,最小的测试单元,称为t e s t m e m o d 测试方法, 而多个相关的测试方法又可以组成一个t e s t c a s e 测试用例。多个测试用例又组 成t e s t s u i t e 测试包。测试包互相嵌套在一起,就形成了一种树结构。开发者可 咀选择其中任意的树节点来进行单元测试。 第2 章单7 c 测试分析 h t i i l l u h i t :j a v a 下基于w e b 应用的单元测试框架,可以w 曲页面进行单元 测试,类似h t t p u n i t 。 j n i t 的成员有很多,还有针对p ”h o n 的p ”h o r l u i l i t 、针对p o w e r b u i l d c r 的p b u n i t 、针对p h p 的p h p u n i t 、关注h t l l l l 页面关系的h t u n i t 、面向j a v a s c r j p t 的j s u l l i t 等。在系统的开发中,很多时候要将多个单元测试工具结合使用,比 如:对于某个企业应用的开发,采用b s 架构,j a v a 开发,部分控件采用d e l p h i 编写,使用qa ) 【技术,有数据库交互。可以采用d b u n i t + j a v a 对持久层的进行 单元测试,利用h u i l i t + i l i t 单元测试框架测试其w 曲页面,j s u h i t 来测试 j a v a s c 却t ,胁i t 测试其业务逻辑层,对于部分d e l p m 控件的单元测试由d u n i t 实现。 2 4 本章小结 单元测试是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做, 因为它需要知道内部程序设计和编码的细节。它是回归测试的一种,用于实现 软件或环境的修复或更正后的“再测试”,单元测试框架对这类测试尤其有用。单 元测试属于白盒测试。 目前有很多的单元测试工具,大部分都属于开源组织开发的x u h i t 系列单元 测试框架。其中最早的是j a v a 下的n i t ,此外还有n u n i t ,d b u n j t 等等。通过 这些单元测试框架大大提高了单元测试的自动化水平2 6 1 。单元测试框架首先通过 设置一种f m m e w j r k ,在其中放置单元测试类t e s t c a s e ,针对某个类具体的方法, 在包括在t e s t 中,然后使用a s s e r t 断言判断类的方法是否与期望的一致。 第3 章面向数据库的单元测试框架的总体结构 31 面向数据库的单元测试的特点 在实际的应用系统,尤其是企业管理类的系统中,往往存在一些具有外部依 赖性的对象,而这些对象经常要跟数据库进行数据的交换。如果要对这样的对象 编写单元测试,将是比较麻烦的事情。因为这种外部依赖性的存在,所以很难将 对象孤立出来进行测试。在面向数据库的单元测试中,由于测试导致数据库状态 的改变,导致了测试中数据状态的不定性”】。这些出现在测试中数据状态不定性, 给以后的测试带来很大的麻烦,同时也令自动化测试将无法进行。 在面向数据库的单元测试中,数据库状态的维护是非常重要的。首先,在单 元测试进行之前,可以将数据库的状态暂时保存起来,在单元测试完成后,可以 将数据库的状态回复。其次,可以将数据库设置到指定的数据状态,以方便测试 使用。 在面向数据库的单元测试中,因为存在众多不同的数据库,各个数据库本身 所提供的数据接口千差万别1 2 8 】。因此,在数据库状态的维护中,必须要考虑到不 同数据接口的差异性。 3 2 面向数据库的单元测试框架解决方案的分析比较 面向数据库的单元测试框架是为了解决上面提到的问题而推出的,虽然不能 单独完成单元测试,但是通过结合具体的单元测试框架,可以有效的实现在面向 数据库的单元测试中数据库的状态设置和恢复。目前在j a v a 下面向数据库的单 元测试框架为d b u h i t ,通过与j a v a 下的单元测试框架如丁l j n i t 结合,可阻极为 方便的实现在j a v a 下面向数据库的单元测试。 本文实现的面向数据库的单元测试框架基于n e t ,借鉴了包括j u n l t 、 d b u h i t 、m l i t 等诸多单元测试框架的优秀设计思想。要实现该单元测试框架, 目前有多种解决方案,概括起来包括“通过b r 方法实现面向数据库的单元测试 框架”、“通过d u 方法实现面向数据库的单元测试框架”、“通过s p 方式实现面 向数据库的单元测试框架”、“通过讧l 实现面向数据库的单元测试框架”等。 向数据库的单元测试框架”、“通过x m l 实现而向数据库的单元测试框架”等。 北京工业大学工学硕士学位论文 3 2 1 通过b r 方法实现面向数据库的单元测试框架 为了实现数据库状态的完全恢复,可以使用将整个数据库备份的方法。b r 方法即b a c k u d 备份阻及r e s t o r e 恢复的方式。在单元测试前,通过面向数据库的 单元测试框架将整个库表进行b a c k u _ p 操作,然后将数据库
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安达市2025-2026学年七年级下学期语文月考测试试卷
- 2025 年小升初温州市初一新生分班考试语文试卷(带答案解析)-(部编版)
- Python大模型基础与智能应用(微课版)课件第9章 云服务器微调训练大模型应用案例
- 2025年小学美术教师的教学总结3篇
- 2025数学个人教学任务总结范文
- 陕西省咸阳市三原县2024-2025学年八年级(下)期末物理试卷(含答案)
- 第十三章 三角形 单元试卷(含答案) 2025-2026学年人教版数学八年级上册
- 买卖介绍居间合同范本
- 购买养殖围网合同范本
- 房房出租合同范本
- 2025年秋季开学第一课《翻越你的浪浪山》课件
- 北京市工业污染行业生产工艺调整退出及设备淘汰目录(2022年版)
- 3.盖立春-课堂教学行为研究的“元问题”研究
- 机电工程施工监理管理、检验和交工评定用表
- LY/T 2692-2016榉树育苗技术规程
- GB/T 33982-2017分布式电源并网继电保护技术规范
- 光电及光化学转化原理与应用电化学全册配套课件
- 压力性损伤预防及处理课件
- 【2020】高中英语人教版必修一词汇 词性转换
- 自动化设备电气布线规范课件
- 双梁桥式起重机安装
评论
0/150
提交评论