驱动模块、桩模块、单元测试
- 格式:docx
- 大小:20.68 KB
- 文档页数:4
一、判断题1. Beta 测试是验收测试的一种。
()对2. 验收测试是由最终用户来实施的。
()错主要为用户还可能有测试工程师等3. 项目立项前测试人员不需要提交任何工件。
()对4. 代码评审是检查源代码是否达到模块设计的要求。
()错代码评审时一种静态技术,从这个意义上说代码复查时需要和其他的一些动态测试技术配合才能检查代码是否符合设计的要求5. 自底向上集成需要测试员编写驱动程序。
()对6. 负载测试是验证要检验的系统的能力最高能达到什么程度。
()错负载测试:指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性压力测试:指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力7. 测试人员要坚持原则,缺陷未修复完坚决不予通过。
()错8. 代码评审员一般由测试员担任。
()错9. 我们可以人为的使得软件不存在配置问题。
()错10. 集成测试计划在需求分析阶段末提交。
()错11.好的测试员不懈追求完美。
( ) 对12.测试程序仅仅按预期方式运行就行了。
() 错13.不存在质量很高但可靠性很差的产品。
()错14.软件测试员可以对产品说明书进行白盒测试。
()对15.静态白盒测试可以找出遗漏之处和问题。
() 对16.总是首先设计白盒测试用例。
( ) 错17.可以发布具有配置缺陷的软件产品。
()对18.所有软件必须进行某种程度的兼容性测试。
( )对19.测试组负责软件质量。
( ) 错20.软件测试就是为了验证软件功能实现的是否正确,是否完成既定目标的活动,所以软件测试在软件工程的后期才开始具体的工作。
(错)21.发现错误多的模块,残留在模块中的错误也多。
( 对 )22.测试人员在测试过程中发现一处问题,如果问题影响不大,而自己又可以修改,应立即将此问题正确修改,以加快、提高开发的进程。
(错)23.单元测试通常应该先进行“人工走查”,再以白盒法为主,辅以黑盒法进行动态测试。
浅谈Testbed在嵌入式软件单元测试的应用嵌入式软件作为嵌入式系统的重要组成部分,嵌入式软件质量问题可能会带来设备的损坏和人员的伤亡,因而用户对其质量有较高的要求。
软件测试是对软件质量检验的一个非常重要的手段。
而软件测试中动态测试最基础的测试就是单元测试。
如何开展单元测试以及如何提高单元测试的效率是一个值得研究的问题。
1 软件单元测试的要求及重点软件单元测试是对软件基本组成单元进行测试,测试软件单元是否正确地实现规定的功能,是否满足软件性能和接口要求。
并验证程序与详细设计说明的一致性。
因此在单元测试时,需要模拟被测单元与其他模块之间的交互,开发驱动模块和桩模块两种辅助模块,构建一个可执行的环境,驱动模块用于模拟被测单元的上层模块,测试执行时由驱动模块调用被测单元使其运行;桩模块用于模拟被测单元在执行过程中所调用的模块。
单元测试重点考虑的测试类型有:(1)接口测试。
接口测试主要检查实参与形参的数目是否相等、实参与形参的属性是否匹配、实参与形参的单位是否一致、传到被调用模块的实参的属性是否与形参的属性匹配、是否把常量当作变量传递等内容。
(2)功能测试。
功能测试主要是对照软件单元的设计说明,验证软件是否完成了所需的功能。
(3)重要执行路径测试。
应设计测试用例以发现错误的计算、不正确的比较和不正常的控制流向等错误。
在计算中比较常见的错误是:误解或错误处理算术运算的优先次序、混用不同类的操作、计算精度不够等。
另外在控制软件执行流程的比较操作中比较常见的错误有:不同数据类型的比较、不正确的逻辑操作符或不正确的优先次序、因精度不够使本应相等的数不相等(如浮点数)等。
(4)软件单元的局部数据结构测试。
软件单元的局部数据结构是一个主要的错误来源,应设计测试用例来发现不正确的或不一致的数据说明、初始化有错或没有赋初值、不正确的变量名、不一致的数据类型、上溢/下溢或引用错误等类型的错误。
(5)错误处理路径测试。
一般软件错误处理路径测试应考虑下面几种可能的错误:对错误的描述不易理解、指出的错误并不是所遇到的错误、出错时还没有进行出错处理就先进行系统干预、错误边界条件的处理不正确、描述错误的信息不正确从而不足以确定出错的原因等。
1) 在软件测试技术中,在下列关于桩模块与驱动模块的说法正确是( b ) (选择一项)a)驱动模块在单元测试中输出数据b)驱动模块在单元测试中接受数据,并把数据传送给被测模块c)桩模块在单元测试中接受数据d)桩模块调用被册模块,并把数据传送给被测模块2)关于软件测试,以下说法( c )错误的观点。
(选择一项)a) 完全测试程序是不可能的b) 软件测试是有风险行为c) 测试可以显示潜伏的软件缺陷d) 并非所有软件缺陷都能恢复3) 软件企业的软件活动是可管理的、稳定的、可重复的和可测量的,在所建立的产品线内,成本、速度和功能均得到量化地控制,软件质量按照详细地测量数据进行跟踪与调整,这种软件过程已达到( c )。
(选择一项)a) CMM2b) CMM3c) CMM4d) CMM44) 关于系统测试,下列说法错误的是( a )。
(选择一项)a)主要测试系统是否符合“需求规格说明书”b)一般由独立测试小组采用黑盒方式来测试c)验收测试与系统测试很相似,主要区别是测试人员不同,验收测试由用户执行d)测试组先测试,再修复测出的错误5) 关于软件测试,以下(c)说法是错误的。
(选择一项)a) 测试能提高软件的质量,但是提高质量不能依赖测试b) 测试只能证明缺陷存在,不能证明缺陷不存在c) 开发人员测试自己的程序后,可作为该程序已经通过测试的依据d) 80%的缺陷聚集在20%的模块中,经常出错的模块改错后还会经常出现6) 在功能测试中,假如有实数x≥0,我们把x划分成两个区间即(0,1)和(1,+∞),然后分别在两个区间中取值x=0.5和x=5.0进行测试,那么这种测试属于(d)。
(选择一项)a) 边界值分析法b) 绝对值分析法c) 相对值分析法d) 等价划分法7) 基本路径测试是一种(a)测试方法。
(选择一项)a) 白盒b) 黑盒c) 压力d) 负载8) 监控特定的项目成果,判断它们是否符合有关的质量标准,并找到方法消除造成软件开发过程中不符合质量要求的原因,这个过程叫(b)。
软件测试综合练习题一、名词解释题1、测试用例2、驱动模块3、回归测试4、静态测试5、桩模块6、强度测试7、软件测试8、自动化测试9、动态测试10、独立路径二、问答题1、软件测试涉及哪些关键问题?2、简述软件测试过程的流程。
3、为什么说软件测试必须有预期结果?4、什么是测试用例?5、简述黑盒测试和白盒测试概念,并试分析两者的优点和缺点。
6、采用白盒测试法设计测试用例时,常用的逻辑覆盖测试方法有哪几种?请简单描述各种方法的目的。
7、黑盒测试有哪几种方法?请简单描述各种方法的特点。
8、简析已学的各种黑盒测试方法的特点,并分析如何选择恰当的黑盒测试方法?9、简介WEB应用程序在压力下的常见错误类型。
10、单元测试的主要任务是什么?11、简述自顶向下增量式测试和自底向上增量式测试两种集成测试方法,并比较两者的优点和缺点。
12、简述在哪些测试模块中应优先考虑引入自动化测试?自动化测试可以带来哪些优点?13、在软件工程或软件测试中,哪些软件问题被称为软件缺陷?14、简述软件测试与软件开发各阶段的关系。
15、在测试实施之前,如何才能确定好的测试策略和测试方法?16、简述软件测试的目的和原则。
17、为什么在单元测试之后要进行集成测试?如何组织集成测试?18、当WinRunner识别完GUI对象后,会将GUI对象的属性储存在GUI Map File,WinRunner提供二种GUI Map File模式: GUI Map File per Test模式与Global GUI Map File模式。
(1)请比较这两种GUI Map File 模式的优点和缺点。
(2)请分别说明在这两种GUI Map File模式下,WinRunner可以通过哪些方式学习被测软件的GUI?19、介绍在 WinRunner 中GUI映射文件(GUI Map File)的作用。
20、什么是数据驱动脚本?简介在Winrunner中如何实现数据驱动脚本21、WinRunner 可以帮助用户自动处理从测试开发到测试执行的整个过程,可以创建可修改和可复用的测试脚本,而不用担心软件功能模块的变更。
软件测试基础知识一、软件测试的描述:测试能提高软件的质量,但是提高质量不能依赖测试;测试只能证明错误存在,不能证明错误不存在;测试的主要困难是不知道该如何进行有效地测试,也不知道什么时候能够放心的结束测试;每个程序员都应当测试自己的程序(份内事),但不能作为程序已通过测试的依据(所以项目需要独立的测试人员);80-20原则:80%的错误聚集在20%的模块中,经常出错的模块改错后还是会经常出错;测试应当循序渐进,不要企图一次性做完。
"欲速则不达"。
一个好的测试用例是指很可能找到迄今为至尚未发现的错误的测试用例一个成功的测试是指揭示了迄今为至尚未发现的错误的测试二、软件分类:1)按功能分:系统软件(OS、硬件驱动程序)应用软件(Office、QQ)2)按技术架构分:单机版软件(Office、画图工具)C/S结构软件(客户端Client/服务器端Server,QQ、MSN)B/S结构软件(浏览器Browser/服务器Server,WEB项目)<现在软件的主流> 3)按用户分:产品软件:目标用户是大众用户(win 8)项目软件:目标用户是具体用户软件测试的目的:为了发现错误,不能证明程序正确,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。
测试人员的主要工作:1)规划测试任务2)设计测试(包括编写测试用例等等)3)建立一个合适的测试环境4)评估、获取、安装和配置自动测试工具5)执行测试6)撰写适当的测试文档软件测试与软件质量:QA(Quality Assurance),(关注的是过程);QC(Quality Control),即质量控制(关注的是结果)。
软件能力成熟度模型(CMM)CMM将软件组织的过程能力成熟度级别分为5个级别:初始级、可重复级、已定义级、已管理级、优化级。
SQA(Software Quality Assurance,软件质量保障)测试是在发现问题,SQA是在预防问题ISO/IEC9126国际标准所定义的软件质量包括六个部分,分别为功能性、可靠性、可用性、有效性、可维护性和可移植性。
软件测试期末复习选择题--20题,20分判断题--10题,10分名词解释--4题,15分综合题—4题,55分名词解释α测试:是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误。
β测试:是用户公司组织各方面的典型终端用户在日常工作中实际使用beta版本,并要求用户报告异常情况,提出批评意见。
桩模块:用以代替被测程序调用的子模块。
桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么都不做。
驱动模块 :相当于被测模块的主程序,它接收测试数据,把这些数据传送给被测模块,最后输出实测结果。
静态分析:不实际运行软件,主要是对软件的编程格式、结构等方面进行评估。
动态分析:动态方法是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能验收测试:验收测试是部署软件之前的最后一个测试操作。
目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
测试用例:是一组测试输入、执行条件和预期结果,目的是要满足一个特定的目标,比如执行一条特定的程序路径或检验是否符合一个特定的需求。
黑盒测试:从用户角度出发, 基于产品的功能需求,目的是检查程序各个功能是否能够实现,并检查其中的功能错误。
白盒测试:基于产品的内部结构进行测试,检查内部操作是否按规定执行,软件各个部分功能是否得到充分使用。
负载测试:通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。
单元测试:测试中的最小单位或基本组成单位,进行检查和验证。
集成测试:测试应用程序结合的部分,确定它们的功能结合到一起是正确的。
容量测试:容量测试的目的是通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大并发用户数、数据库记录数等)兼容性测试:兼容性测试是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操纵系统平台上、不同的网络等环境中是否能够很友好的运行的测试。
第一章软件测试理论一、选择题1.软件测试的目的是C。
A.表明软件的正确性B.评价软件质量C.尽可能发现软件中的错误D.判定软件是否合格2.下面关于软件测试的说法,A是错误的。
A.软件测试是程序测试B.软件测试贯穿于软件定义和开发的整个期间C.需求规格说明、设计规格说明都是软件测试的对象D.程序是软件测试的对象3.某软件公司在招聘软件评测师时,应聘者甲向公司做如下保证:①经过自己测试的软件今后不会再出现问题;②在工作中对所有程序员一视同仁,不会因为在某个程序员编写的程序中发现的问题多,就重点审查该程序,以免不利于团结;③承诺不需要其他人员,自己就可以独立进行测试工作;④发扬咬定青山不放松的精神,不把所有问题都找出来,决不罢休;你认为应聘者甲的保证B。
A.①、④是正确的B.②是正确的C.都是正确的D.都不正确4.软件测试的对象包括B。
A.目标程序和相关文档B.源程序、目标程序、数据及相关文档C.目标程序、操作系统和平台软件D.源程序和目标程序5.导致软件缺陷的原因有很多,①-④是可能的原因,其中最主要的原因包括D。
①软件需求说明书编写的不全面,不完整,不准确,而且经常更改②软件设计说明书③软件操作人员的水平④开发人员不能很好的理解需求说明书和沟通不足A.①、②、③B.①、③C.②、③D.①、④二、简答题1.简述软件测试发展的历史及软件测试的现状。
参考答案:软件测试是伴随着软件的产生而产生的。
在软件行业发展初期,没有系统意义上的软件测试,更多的是一种类似调试的测试,测试用例的设计和选取也都是根据测试人员的经验随机进行的,大多数测试的目的是为了证明系统可以正常运行。
到了20世纪70年代以后,很多测试理论和测试方法应运而生,逐渐形成了一套完整的体系。
在产业界,从20世纪70年代后期到20世纪80年代中期,很多软件企业成立了QA或者SQA部门。
后来QA的职能转变为流程监控(包括监控测试流程),而测试(Testing)则从QA中分离出来成为独立的组织职能。
填空题1、测试用例不仅要选用合理的测试输入数据,还需要选用不合理的测试输入数据,这样能更多地《发现错误》,提高程序的可靠性。
对于不合理的测试输入数据,程序应《拒绝执行》,并给出相应的提示。
2、动态测试指通过《运行程序》发现错误。
对软件产品进行动态测试时使用黑盒测试法和《白盒测试》法。
3、静态测试指《被测试程序》不在机器上运行,而是采用《人工测试》和《计算机辅助静态分析》的手段对程序进行检测。
4、黑盒测试依据《软件规格说明》,检查程序是否满足《功能需求》。
因此,黑盒测试由称为功能测试或《数据驱动》测试。
5、白盒测试以检查处理过程的细节为基础,对程序中尽可能多的《逻辑路径》进行测试,检查内部《逻辑结构》和《运行原理》是否有错,程序的《运行状态》与预期的状态是否一致。
6、在基本路径测试中,独立路径是指包括一组以前没有处理过的《语句或条件》的一条路径。
从程序图来看,一条独立路径是至少包含有一条《从未走过》的边的路径。
7、在单元测试中,驱动模块的作用是用来模拟被测模块的《上层调用模块》。
它的工作是接受《测试输入数据》,以上层模块调用被测模块的形式《把数据传送给》被测模块,接收被测模块的《实测结果》并输出。
8、在单元测试中,桩模块用来代替被测模块的《子模块》。
其作用是《返回被测模块所需》的信息。
9、错误的群集现象是指模块错误发现率与模块的残留错误数成《正比》关系。
判断题1 、好的测试员不懈追求完美。
( T)2、测试程序仅仅按预期方式运行就行了。
(F )3、不存在质量很高但可靠性很差的产品。
(F )4、软件测试员可以对产品说明书进行白盒测试。
(F )5、静态白盒测试可以找出遗漏之处和问题。
( T)6、总是首先设计白盒测试用例。
(F )7、可以发布具有配置缺陷的软件产品。
(T )8、所有软件必须进行某种程度的兼容性测试。
(T )9、所有软件都有一个用户界面,因此必须测试易用性。
(F )10、测试组负责软件质量。
华为软件测试笔试题试题一一、判断题1.软件测试的目的是尽可能多的找出软件的缺陷。
(Y)2.Beta 测试是验收测试的一种。
(Y)3.验收测试是由最终用户来实施的。
(N)4.项目立项前测试人员不需要提交任何工件。
(Y)5.单元测试能发现约80%的软件缺陷。
(Y)6.代码评审是检查源代码是否达到模块设计的要求。
(N)7.自底向上集成需要测试员编写驱动程序。
(Y)8.负载测试是验证要检验的系统的能力最高能达到什么程度。
(N)9.测试人员要坚持原则,缺陷未修复完坚决不予通过。
(N)10.代码评审员一般由测试员担任。
(N)11.我们可以人为的使得软件不存在配置问题。
(N)12.集成测试计划在需求分析阶段末提交。
(N)二、选折1.软件验收测试的合格通过准则是:(ABCD)A.软件需求分析说明书中定义的所有功能已全部实现,性能指标全部达到要求。
B.所有测试项没有残余一级、二级和三级错误。
C.立项审批表、需求分析文档、设计文档和编码实现一致。
D.验收测试工件齐全。
2.软件测试计划评审会需要哪些人员参加?(ABCD)A.项目经理B.SQA 负责人C.配置负责人D.测试组3.下列关于alpha 测试的描述中正确的是:(AD)A.alpha 测试需要用户代表参加B.alpha 测试不需要用户代表参加C.alpha 测试是系统测试的一种D.alpha 测试是验收测试的一种4.测试设计员的职责有:(BC)A.制定测试计划B.设计测试用例C.设计测试过程、脚本D.评估测试活动5.软件实施活动的进入准则是:(ABC)A.需求工件已经被基线化B.详细设计工件已经被基线化C.构架工件已经被基线化D.项目阶段成果已经被基线化三、添空1.软件验收测试包括:正式验收测试,alpha测试,beta测试。
2.系统测试的策略有:功能测试,性能测试,可靠性测试,负载测试,易用性测试,强度测试,安全测试,配置测试,安装测试,卸载测试,文挡测试,故障恢复测试,界面测试,容量测试,兼容性测试,分布测试,可用性测试,(有的可以合在一起,分开写只要写出15就满分哦)3.设计系统测试计划需要参考的项目文挡有:软件测试计划,软件需求工件和迭代计划。
什么是桩和驱动在我们进行单元测试的时候,单元本身无法构成一个切实可运行的程序系统,所以我们需要为单元测试来开发桩模块和驱动模块,从而完成我们的单元测试目的,这是桩模块和驱动模块的作用。
如果需要解释清除桩模块和驱动模块,首先您需要理解渐增式和非渐增式联调。
将若干个模块连接成一个可运行的系统通常有两种方式:一种是“非渐增式”,即先独立地测试每一模块,然后将所有这些模块连接到一起运行;另一种是“渐增式”,即在已测试过的N个模块的基础上再增加一个模块,再对N十1个模块进行测试。
[img] [/img]非渐增式是先分别测试6个模块A、B、C、D、E、F,然后将 6个模块连接到一起再进行测试。
若用这种方式,在测试某个模块X时,需要为它设计一个驱动模块和若干个桩模块(图 6.12)。
驱动模块的作用是模拟X的调用模块,桩模块的作用是模拟X的下层模块。
例如测试图 6.11的模块B时,要为它设计一个驱动模块,其作用是将测试数据传送给模块B,并显示B产生的结果,另外,由于模块B要调用模块E,所以还需设计一个名字为E的模块,它将接受B的控制并模拟E的功能。
另一种方式是渐增式,它不是分别测试每个模块,而是逐步将要测试的模块同已测试的模块连接起来。
若用渐增方式,模块测试和联合测试这两步是结合起来进行的。
渐增式又有“由顶向下”、“由底向上”等多种。
对图6.11的程序若采用“由底向上”的方式,则是先顺序地或并行地测试模块 E、C、F,此时需为每个模块准备一个驱动模块,但不必准备桩模块,然后为B准备一个驱动模块将B与E连接起来测试,又为D准备一个驱动模块将D和F连接起来测试,这过程将继续至测试最后一个模块A。
渐增式与非渐增式的比较1) 非渐增式需要较多的人工,以图 6.11为例,采用非渐增式共需准备5个驱动模块和5个桩模块(假定A不需要驱动模块, C,E,F不需要桩模块)。
而用渐增式,如果是“由顶向下”则可利用前面已测试过的模块,而不必另外准备驱动模块,如果是“由底向上”,也可利用已测式过的模块,不必再准备桩模块。
单元测试打桩方法
单元测试是软件开发中至关重要的一环,它可以帮助开发人员
确保他们的代码在各种情况下都能正常运行。
然而,在某些情况下,我们可能需要模拟一些外部依赖或者特定的行为,以便更好地测试
我们的代码。
这时候就需要使用打桩(Mocking)方法。
打桩是一种测试技术,它可以模拟外部依赖或者特定的行为,
以便更好地测试代码。
在单元测试中,我们可能会遇到一些外部依赖,比如数据库、网络请求、文件系统等,这些依赖可能会使测试
变得复杂和不可靠。
通过使用打桩方法,我们可以模拟这些外部依
赖的行为,从而使测试变得更加简单和可靠。
打桩方法可以通过手动编写模拟对象或者使用专门的框架来实现。
在编写单元测试时,我们可以使用打桩方法来模拟外部依赖的
行为,以便更好地测试我们的代码。
通过使用打桩方法,我们可以
更好地控制测试环境,从而使测试变得更加可靠和可重复。
总的来说,打桩方法是单元测试中非常重要的一部分,它可以
帮助我们更好地测试代码,提高代码质量,减少错误和bug的出现。
因此,在编写单元测试时,我们应该充分利用打桩方法,以确保我们的代码能够在各种情况下都能正常运行。
驱动模块:
驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序。
它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果。
传统的单元测试包括了驱动模块(driver)和桩模块(stub)。
驱动模块的目的很单纯,就是为了访问类库的属性和方法,来检测类库的功能是否正确;
Normal002falsefalse false EN-US KO X-NONE MicrosoftInternetExplorer4 如果被测试模块中的函数是提供给其他函数调用的,在设计测试用例时就应该设计驱动模块(Driver)。
举例来说:驱动模块(Driver)可以通过模拟一系列用户操作行为,比如选择用户界面上的某一个选项或者按下某个按钮等,自动调用被测试模块中的函数。
驱动模块(Driver)设置,使对模块的测试不必与用户界面真正交互。
桩模块:
桩模块(Stub)是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。
主模块作为驱动模块,与之直接相连的模块用桩模块代替。
在集成测试前要为被测模块编制一些模拟其下级模块功能的“替身”模块,以代替被测模块的接口,接受或传递被测模块的数据,这些专供测试用的“假”模块称为被测模块的桩模块。
如果被测试的单元模块需要调用其他模块中的功能或者函数(method),我们就应该设计一个和被调用模块名称相同的桩模块(Stub)来模拟被调用模块。
这个桩模块本身不执行任何功能仅在被调用时返回静态值来模拟被调用模块的行为。
举例说明:如果被测试单元中需要调用另一个模块customer的函数getCustomerAddress(customerID: Integer),这个函数应该查询数据库后返回某一个客户的地址。
我们设计的同名桩模块(Stub)中的同名函数并没有真正对数据库进行查询而仅模拟了这个行为,直接返回了一个静态的地址例如"123 Newton Street"。
桩模块(Stub)的设置使得单元测试的进行成为一个相对独立且简单的过程。
单元测试:
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。
总的来说,单元就是人为规定的最小的被测功能模块。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。
在像C++这样的面向对象的语言中,要进行测试[1]的基本单元是类。
对Ada语言来说,开发人员可以选择是在独立的过程和函数,还是在Ada
包的级别上进行单元测试。
单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。
经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。
静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。
动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。
详解:
单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。
或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。
单元测试是由程序员自己来完成,最终受益的也是程序员自己。
可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。
执行单元测试,就是为了证明这段代码的行为和我们期望的一致。
工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。
其实我们每天都在做单元测试。
你写了一个函数,除了极简单的外,总是要执行一下,看看功能是否正常,有时还要想办法输出些数据,如弹出信息窗口什么的,这,也是单元测试,把这种单元测试称为临时单元测试。
只进行了临时单元测试的软件,针对代码的测试很不完整,代码覆盖率要超过70%都很困难,未覆盖的代码可能遗留大量的细小的错误,这些错误还会互相影响,当BUG暴露出来的时候难于调试,大幅度提高后期测试和维护成本,也降低了开发商的竞争力。
可以说,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。
对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。
要进行充分的单元测试,应专门编写测试代码,并与产品代码隔离。
我认为,比较简单的办法是为产品工程建立对应的测试工程,为每个类建立对应的测试类,为每个函数(很简单的除外)建立测试函数。
首先就几个概念谈谈我的看法。
一般认为,在结构化程序时代,单元测试所说的单元是指函数,在当今的面向对象时代,单元测试所说的单元是指类。
以我的实践来看,以类作为测试单位,复杂度高,可操作性较差,因此仍然主张以函数作为单元测试的测试单位,但可以用一个测试类来组织某个类的所有测试函数。
单元测试不应过分强调面向对象,因为局部代码依然是结构化的。
单元测试的工作量较大,简单实用高效才是硬道理。
有一种看法是,只测试类的接口(公有函数),不测试其他函数,从面向对象角度来看,确实有其道理,但是,测试的目的是找错并最终排错,因此,只要
是包含错误的可能性较大的函数都要测试,跟函数是否私有没有关系。
对于C++来说,可以用一种简单的方法区隔需测试的函数:简单的函数如数据读写函数的实现在头文件中编写(inline函数),所有在源文件编写实现的函数都要进行测试(构造函数和析构函数除外)。
使用效果:
我们编写代码时,一定会反复调试保证它能够编译通过。
如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。
但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。
幸运的是,单元测试会为我们的承诺做保证。
编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。
有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。
什么时候测试?单元测试越早越好,早到什么程度?极限编程(Extreme Programming,或简称XP)讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。
在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。
从经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。
所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。
由谁测试?单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。
测试部门可以作一定程度的审核。
关于桩代码,单元测试应避免编写桩代码。
桩代码就是用来代替某些代码的代码,例如,产品函数或测试函数调用了一个未编写的函数,可以编写桩函数来代替该被调用的函数,桩代码也用于实现测试隔离。
采用由底向上的方式进行开发,底层的代码先开发并先测试,可以避免编写桩代码,这样做的好处有:减少了工作量;测试上层函数时,也是对下层函数的间接测试;当下层函数修改时,通过回归测试可以确认修改是否导致上层函数产生错误。
优点:
1、它是一种验证行为。
程序中的每一项功能都是测试来验证它的正确性。
它为以后的开发提供支援。
就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。
而且它为代码的重构提供了保障。
这样,我们就可以更自由的对程序进行改进。
2、它是一种设计行为。
编写单元测试将使我们从调用者观察、思考。
特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
3、它是一种编写文档的行为。
单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。
这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。
4、它具有回归性。
自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。