版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件测试技术及项目实战主讲人:单元1模块1软件测试基础知识.pptx单元1模块2白盒测试.pptx单元1模块3黑盒测试.pptx单元1模块4功能测试用例执行.pptx单元1模块5测试文档设计.pptx单元2模块1自动化测试基础.pptx单元2模块2自动化测试脚本设计.pptx单元3模块1性能测试基础.pptx单元3模块2性能测试执行.pptx单元3模块3性能测试结果分析.pptx全套可编辑PPT课件2/63本模块任务了解软件测试背景任务1.1认识软件的缺陷任务1.2掌握软件测试的分类任务1.3了解软件测试员的职责任务1.8了解软件质量六大特性任务1.7了解软件测试前沿技术任务1.6掌握软件测试七大原则任务1.4了解软件测试模型任务1.512345678学习目标/LearningOnjectives3/63学习目标理解软件测试质量模型,明确测试工程师工作职责。03掌握软件测试理论基础,了解测试行业前沿技术。02了解软件测试行业背景及发展前景。01知识目标/KnowledgeObjectives4/63了解软件测试的发展过程,了解软件缺陷造成的后果严重性。01掌握软件测试各种分类以及各分类阶段所需要完成的事情。02掌握软件测试的基本原则及概念。掌握软件测试常见的几种模型。03了解当下主流的测试技术各类岗位职责。04能力目标/CompetencyObjectives5/63软件测试的背景详解,缺陷定位与提交。选择合理的分类方式划分测试工作,掌握每个阶段所要完成的工作。掌握软件测试的基本原则及概念,掌握常用的软件测试模型,如V模型、W模型、H模型等。在软件测试过程中应用主流测试技术,以测试需求为目标满足岗位职责要求。01030204素质目标/QualityObjectives6/63自我管理,能够合理安排工作,高效完成测试任务。具备较强的质量意识,为企业软件产品质量保驾护航。具备较强的学习能力,对新技术保持敏锐的洞察力。具备较强的团队合作精神,与研发团队友好协作。具备认真、细心、严谨、负责的工作态度,善于发现问题。03020104051.1了解软件测试背景任务1.1了解软件测试8/63软件测试是在软件开发过程中,通过运行程序或系统来检查其功能、性能和安全性是否符合预期要求的重要步骤,对软件的可靠性至关重要。任务1.1软件测试背景9/6320世纪60年代,测试作为验证程序正确性的重要手段被引入软件开发。1972年,BillHetzel博士在美国北卡罗来纳大学组织了首次正式的关于软件测试的会议。1973年,他定义测试为“建立信心,确信程序按预期运行”。1979年,GlenfordMyers在《软件测试艺术》中将测试定义为“为发现错误而执行一个程序或系统的过程”。1983年,Hetzel进一步修订定义,强调“用户需求”为核心,指出软件质量应“符合要求”。1.2认识软件缺陷任务1.2认识软件缺陷11/63什么是软件缺陷?软件缺陷是指软件中存在的错误、漏洞、不满足设计要求或影响软件正常运行的问题,在开发过程中常用Bug来表示。任务1.2常见的软件缺陷案例12/631.360存在严重后果缺陷导致系统崩溃:360安全卫士只是简单的删除了木马文件,没有进行相关的善后处理工作,致使系统关键进程Explorer.exe无法加载。任务1.2常见的软件缺陷案例13/632.英特尔奔腾芯片缺陷如果在计算机的“计算器”中输入以下算式:(419583/3145727)X3145727-4195835,结果显示为零。而在1994年,结果可能为其他答案,这就是英特尔(Intel)奔腾(Pentumn)CPU芯片所带来的一个浮点触发缺陷。英特尔为此付出了4亿多美元的代价。任务1.2常见的软件缺陷案例14/633.一触即发的第三次世界大战:
1980年,北美防空联合司令部曾报告称美国遭受导弹袭击。后来证实,这是反馈系统的电路故障问题,但反馈系统软件没有考虑故障问题引发的误报。
1983年,苏联卫星报告有美国导弹入侵,但主管官员的直觉告诉他这是误报。后来事实证明的确是误报。任务1.2软件缺陷产生的原因15/63软件结构复杂需求不明确使用新技术编码问题项目期限短任务1.2引起缺陷的错误类型16/63功能性缺陷指软件功能与需求规格说明书不符合或实现不完整、存在逻辑错误等问题,导致软件无法正常工作。性能缺陷指软件在运行时存在性能瓶颈,例如响应时间过长、处理速度慢等问题,导致软件无法满足业务需求。12安全性缺陷指软件存在安全隐患、数据泄露等安全漏洞,导致软件易遭到攻击,存在信息泄漏等风险。3可用性缺陷指软件在运行时存在多种问题,如界面不友好、易用性差、操作繁琐等问题,导致用户无法正常使用软件。4任务1.2引起缺陷的错误类型17/63兼容性缺陷指软件在不同操作系统、不同硬件平台、不同浏览器等环境下存在问题,导致软件无法正常运行或兼容性存在问题。可维护性缺陷指软件代码耦合度高、难以维护、难以扩展等问题,导致软件后续维护的难度和成本增加。56GUI问题缺陷指软件图形界面设计存在问题,如布局混乱、颜色搭配不合理等问题,导致用户体验不佳。7任务1.2认识软件缺陷18/63软件生命周期成本我们看看修复一个bug需要的成本。在软件开发周期的不同阶段,修复一个bug所需的成本差别非常之大。越到了后期,修复bug越困难,成本也越高。从下图可以看出,在测试阶段修复bug的代价是设计开发阶段的几倍,而一旦产品上线,进入维护期后,所需的代价更是达到几十倍。1.3掌握软件测试的分类任务1.3软件测试的定义20/63软件测试是指使用人工或者自动的手段来运行或测定某个软件产品系统的过程,其目的是在于检验是否满足规定的需求或者弄清预期的结果与实际结果的区别。本节主要描述软件测试的一些常见分类。软件测试分类思维导图如图所示。任务1.3按项目流程阶段化分21/63按软件项目流程可划分为单元测试、集成测试、系统测试和验收测试四类测试,如图所示。是指对软件中的最小可测试单元进行检查和验证。其中单元测试又可分为模块接口测试、局部数据结构测试、路径测试、错误处理测试和边界条件测试等。单元测试12是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。而系统测试又可分为功能测试、性能测试、安全测试和兼容测试。系统测试34也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求组装成为子系统或系统,进行集成测试。集成测试是部署软件之前的到最后一个测试操作,也称交付测试。目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。而验收测试又可分为功能确认测试、安全可靠性测试、易用性测试、可扩充性测试、兼容性测试、资源占有率测试和用户文档资料验收。验收测试任务1.3按项目流程划分22/63指对所设计程序与硬件、软件之间的兼容性的测试。兼容测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。安全测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。功能测试020401系统测试SystemTesting03任务1.3按代码可见程度23/63按代码可见程度划分为白盒测试、灰盒测试和黑盒测试三类。如下图所示。它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接受输入数据而产生正确的输出信息。黑盒测试是介于白盒测试与黑盒测试之间的一种测试,它多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。它是一种测试用例设计的方法,盒子是指被测试的软件,白盒指的是盒子的可视的,即清楚盒子内部的东西以及里面是如何运作的。白盒测试任务1.3按测试执行方法划分24/63指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能。指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。静态测试A动态测试B按测试执行方式划分为静态测试和动态测试两类。如图所示。任务1.3软件测试的定义25/63按自动化程度可划分为手工测试和自动化测试两类。如图所示是由人去一个一个的输入用例,然后观察结果,和机器测试相对应,属于较原始但必须的一个步骤。手工测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或者硬件资源,提高测试效率,便引入了自动化测试的概念。自动化测试任务1.3其他类型测试26/63除了以上一些测试类别外,还有几种常见的测试分类,如冒烟测试、敏捷测试和探索性测试等。冒烟测试将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。敏捷测试是不断修正质量指标,正确建立测试策略,确认客户的有效需求能得以圆满实现和确保整个生产的过程安全的、及时的发布最终产品。探索性测试是一种测试思维技术。探索性强调测试人员的主观能动性,抛弃繁杂的测试计划和测试用例设计过程,强调在碰到问题时及时改变测试策略。1231.4掌握软件测试七大原则任务1.4软件测试七大原则28/63测试的主要目的是发现软件中的缺陷和问题。测试通过执行测试用例和验证软件的功能、性能和安全性,帮助揭示潜在的错误和缺陷。然而,测试不能保证软件完全没有错误,因为测试无法穷尽所有可能的情况和输入。测试证明了缺陷的存在01由于软件系统的复杂性,测试团队无法进行详尽的测试。在现实情况下,测试资源和时间都是有限的,不可能穷尽所有可能的测试路径和组合。因此,测试团队需要根据风险评估和测试目标的重要性,选择适当的测试策略和方法,以尽量提高测试覆盖度和效果。不可能进行详尽的测试02在软件开发过程中,越早发现缺陷,修复成本越低。因此,测试应该从项目的早期阶段开始,并在整个开发过程中持续进行。例如,在需求分析阶段,测试人员可以通过审查需求文档来发现潜在的问题。通过在软件开发的早期阶段进行测试,可以尽早地发现和修复问题,减少问题进入后续阶段的风险和成本。尽早测试可以帮助开发团队提高代码质量,加快反馈循环,并确保软件满足用户需求和预期。尽早测试03缺陷聚集原则指出,在软件系统中,缺陷通常不是均匀分布的,而是集中在一些特定的模块、功能或者代码段中。这意味着测试团队在进行测试时,应该重点关注那些可能存在更多缺陷的区域,并加强测试的力度和深度。缺陷聚集04任务1.4软件测试七大原则29/63杀虫剂悖论如果反复使用相同的测试用例,它们将变得越来越无效。为了持续发现新的缺陷,测试人员需要定期更新和修改测试用例。05测试的目标和方法取决于项目的上下文。例如,对于一个关键安全性高的系统,如医疗设备控制软件,测试人员需要进行更严格的测试。而对于一个简单的网页应用程序,可能只需要进行一些基本的功能和兼容性测试。测试依赖上下文06错误的谬论是指认为软件经过测试后没有发现错误就是没有错误的。测试无法证明软件是完全无错误的,而只能证明在已知的测试条件下没有发现错误。软件测试的目标是尽可能地发现和修复错误,但无法排除未知的错误和潜在的问题。因此,测试团队应该持续关注和改进测试过程,以提高软件的质量和稳定性。测试人员应该始终怀疑软件存在缺陷,而不是认为软件是完美的。这样可以帮助测试人员保持警惕,更容易发现潜在的问题。软件无bug是谬论071.5了解软件测试模型任务1.5了解软件测试模型31/63在软件质量体系中,虽然多种开发模型(如瀑布模型、快速原型模型、增量模型、螺旋模型等)被提出以指导软件开发,但这些模型通常忽略了软件测试过程。随着软件测试在质量保证中的重要性增加,企业开始重视测试过程,并寻求专门的测试模型来指导测试实施。目前常见的软件测试模型包括瀑布模型、V模型、W模型、H模型和X模型。V模型由PaulRook于20世纪80年代后期提出,旨在提升软件开发效率和效果。作为经典的测试模型,V模型从左到右描述了开发和测试过程,并明确了不同测试级别与开发阶段的对应关系。左侧表示开发过程,右侧表示相应的测试过程,箭头表示时间的推进。V模型任务1.5了解软件测试模型32/63任务1.5了解软件测试模型33/63单元测试验证详细设计说明书,集成测试验证概要设计说明书,系统测试验证需求说明书。1.阶段对应关系验证产品是否满足客户需求,依赖于开发过程的正确性。2.测试目标单元测试通常由白盒测试工程师执行,集成测试介于白盒测试和系统测试之间,系统测试则由系统测试工程师执行。3.测试类型:V模型的优点在于清晰阐明了每个测试阶段的验证依据,使测试与开发过程的对应关系明确。任务1.5了解软件测试模型34/634.测试对象只有程序,而不包括需求等其他的说明书。2.每个开发阶段都有相应的测试对其进行验证。3.测试与开发是串行的而不是并行,也就是测试需要等开发完成后再开始。1.测试阶段划分得很清楚。V模型特征V模型是瀑布模型的变种,瀑布模型存在的问题V模型也存在。W模型是在V模型基础上的改进,包含两个V字形模型,分别代表开发和测试生命周期。与V模型的串行结构不同,W模型是并行的,从需求分析阶段就开始测试,而不是编码完成后才启动。W模型任务1.5了解软件测试模型35/63任务1.5了解软件测试模型36/63测试不仅包括单元测试、集成测试和系统测试,还细化了测试计划、测试方案等内容。全面的测试阶段划分12从需求阶段介入测试,有助于及早发现问题,降低缺陷修复成本。尽早测试34测试活动从需求分析阶段开始,与开发并行进行。并行测试与开发广泛的测试对象:测试不仅限于程序,还包括需求和设计文档等。广泛的测试对象任务1.5了解软件测试模型37/63W模型强调测试贯穿整个开发周期,能够尽早发现问题,减少测试时间并加快项目进度。然而,它也存在局限性,如将需求、设计和编码活动视为串行,难以支持迭代开发,并难以应对复杂多变的开发环境。H模型将测试活动独立于开发流程,形成一个完整的测试流程,明确区分测试准备与测试执行。其核心理念是测试为独立过程,专注于测试的全过程而不涉及开发流程。与V模型和W模型不同,H模型没有明确的测试阶段划分,而展示了软件生命周期中某一层次上的“微循环”测试。H模型任务1.5了解软件测试模型38/63任务1.5了解软件测试模型39/63H模型中的测试活动在测试条件准备完成后,进入测试就绪状态,并设有测试准入点。测试是否达到准入条件通常需要检查以下内容:开发对应的测试策略、测试方案、测试用例、测试环境搭建、相关输入、输出项的明确性。02测试执行01测试准备当上述条件满足后,测试准备工作完成,可以开始测试执行。H模型还强调对整个产品包的测试,包括开发阶段的设计流程,而不仅仅是代码、需求或相关文档。任务1.5了解软件测试模型40/63测试是一个独立的过程。01只有达到准入条件后,测试才能执行。02测试对象涵盖整个产品包,不限于代码、需求或说明书。03H模型贯穿产品生命周期,与开发并行,强调尽早准备和执行测试,并允许在产品质量未达标时进行多次测试。1.6了解软件测试前沿技术任务1.6了解软件测试前沿技术42/63自动化测试软件自动化测试通过将测试行为转化为机器执行,实现高效、准确的测试。快速执行能迅速执行大量测试用例,减少时间和人力成本。高准确度减少人为错误,提高测试可靠性。可重复性允许重复执行相同的测试用例,确保测试结果一致。支持敏捷开发提供快速反馈,支持敏捷开发方法,提升开发效率和软件质量。自动化测试的优势常见的自动化测试工具有QTP、Selenium、RationalRobot、JMeter和Appium,支持多语言和平台,适用于各种软件类型,包括Web应用、移动应用和桌面应用。自动化测试框架分为两个层次:(1)上层:管理自动化测试的开发、执行和维护,包括测试用例执行顺序、脚本维护以及测试报告管理。(2)下层:开发测试脚本,利用工具构建测试驱动,完成业务逻辑测试。任务1.6了解软件测试前沿技术43/63任务1.6了解软件测试前沿技术44/63基于云的测试基于云的软件测试利用云计算技术部署测试环境和资源,提升测试效率和灵活性。常见的基于云测试平台包括AWS、SauceLabs、BrowserStack和Jenkins。按需付费动态测试环境快速部署支持多平台根据需求灵活扩展或缩减,避免硬件闲置和资源浪费。仅为实际使用的资源付费,降低设备和资源投入成本。高效协作迅速配置测试环境,减少硬件采购和维护时间及成本。兼容多种平台和浏览器,便于跨平台测试。支持远程协作,提高测试效率和质量。基于云的测试的优势任务1.6了解软件测试前沿技术45/63AI测试
软件的AI测试利用人工智能和机器学习技术进行测试,自动识别和定位缺陷,提高测试准确性和可靠性。常见的AI测试工具包括Mabl、TestSigma、LoadNinja、DeepCode、AutoMLTestGen和Stoat、。这些工具支持多平台和语言,能够自动化测试各种类型的软件。任务1.6了解软件测试前沿技术46/63AI测试优势3智能测试结果分析自动识别和定位缺陷,基于输出数据、日志和错误报告,提高测试准确性。1智能测试用例生成自动设计和生成高覆盖率、高质量的测试用例,提高测试全面性和效率。2智能测试执行自动执行和调整测试用例,适应软件的运行环境和状态变化,提高测试速度和稳定性。6智能报告生成自动生成详细测试报告,便于团队和管理人员分析。4智能测试过程优化根据软件的更新频率、变更范围等自动优化测试策略,提升测试效果。5智能异常识别识别异常数据,发现潜在问题和风险,减少漏测和误测。1.7了解软件质量六大特性任务1.7了解软件质量六大特性48/63什么是软件质量软件质量是指软件产品满足用户需求和预期的程度。它不仅包括软件的功能是否正确、稳定,还包括软件在性能、可维护性、安全性等方面的表现。高质量的软件应该能够在各种环境下稳定运行,易于维护和扩展,同时能够保护用户数据和隐私。任务1.7了解软件质量六大特性49/63软件质量模型软件质量模型是评估和提高软件质量的理论框架。它定义了一系列质量特性和指标,帮助开发团队系统化地识别、评估和改进软件中的问题。以下是一些广泛应用的软件质量模型:任务1.7了解软件质量六大特性软件在使用资源(如处理器、内存等)方面的表现,是否能够在合理的时间内完成任务。软件的结构是否清晰,是否容易修改和扩展,以适应未来的需求变化。软件能否在不同的硬件或操作系统环境下运行,易于迁移和重新安装。软件是否能够实现其设计的功能,并满足用户的需求。功能性软件在规定条件下能否稳定运行,减少错误发生的频率和严重程度。可靠性软件是否易于使用,用户是否能够高效地完成任务。可用性效率可维护性可移植性50/631.8了解软件测试工程师的职责任务1.8了解软件测试工程师的职责Robustness编写测试规范和用例。他们在软件企业中担任质量管理角色,及时发现问题并督促更正,确保产品正常运作。软件测试的目的是验证系统是否满足需求或查明预期结果与实际结果的差异。测试工作确保软件系统符合用户需求,是开发过程中的关键质量保障环节。52/63任务1.8了解软件测试工程师的职责Robustness根据职位和经验,软件测试工程师分为三类:初级软件测试工程师:按照测试方案和流程对产品进行功能测试,检查产品缺陷。中级软件测试工程师:编写测试方案和文档,与项目组制定测试计划,合理利用测试工具完成任务。高级软件测试工程师:精通测试和开发技术,对行业有深入了解,能够分析和评估问题。53/63模块小结习题1.软件缺陷指的是什么?()A.程序中存在的错误、漏洞或不良设计B.程序中存在的代码语法错误C.程序中出现的运行时错误D.程序中出现的所有错误2.软件缺陷的类型包括哪些?()A.布局错误、翻译错误、功能错误B.界面错误、逻辑错误、数据错误C.界面布局错误、功能逻辑错误、数据存储错误D.以上都是55/63习题3.软件缺陷的描述应该包括哪些方面?()A.缺陷编号、缺陷类型、缺陷严重程度、缺陷描述、缺陷发生条件B.缺陷编号、缺陷类型、缺陷严重程度、缺陷状态、提交人、提交时间C.缺陷编号、缺陷类型、缺陷严重程度、缺陷发生条件、修复人、修复时间D.以上都是4.对于软件缺陷的修复,哪些是正确的措施?()A.对于轻微和一般的缺陷可以不进行修复,直接在后续版本中修复。B.对于严重和致命的缺陷应该立即确认并优先安排修复。C.对于所有类型的缺陷都应该立即进行修复,以避免对用户产生不良影响。D.对于界面布局错误的缺陷应该由用户自行修复。56/63习题5.以下哪个部分是软件缺陷的最大来源?()A.产品需求说明书B.程序代码C.设计文档D.用户使用阶段6.关于软件缺陷严重级别和处理优先级的说法正确的是()A.缺陷严重级别越高,处理优先级越高B.功能性缺陷总是最为严重的,而软件界面类的缺陷总是严重性较低的C.软件缺陷的处理优先级一旦设定好,就不能再变动D.严重级别高的缺陷,处理优先级不一定高57/63习题7.关于缺陷的类型,以下哪一种属于逻辑问题?()A.功能错误B.循环不正确C.模块间接口错误D.界面风格不统一8.缺陷报告中不包含以下 哪个选项?()A.软件相关信息(软件名称、版本号、功能模块等)B.缺陷概述、缺陷详述、再现手段C.严重级别、优先级别D.开发人员相关信息58/63习题9.提交无法复现的缺陷报告会被开发人员质疑,所以在复现之前,不要提交缺陷报告,等以后发现了复现步骤再提交()。(判断题)10.提交一个缺陷,开发说不是缺陷的时候,一定要尽量说服开发去修改()。(判断题)59/63习题11.简单描述软件测试发展背景12.例举一个工作或生活中的软件缺陷案例13.软件测试方法分类:60/6361/63习题14.按测试对象进行分类:15.按测试对象是否执行:16.按测试手段进行分类:62/63习题17.软件测试原则包括哪些内容?18.软件测试模型都包括哪些?V模型与W模型的区别是什么?19.软件测试领域包括哪些前沿技术?63/63习题20.软件测试包括哪六大特性?你是如何理解软件测试六大特性的?21.作为一名测试工程师包括哪些职责?感谢观看THANKS软件测试技术及项目实战主讲人:66/88本模块任务了解代码检查法任务2.1掌握逻辑覆盖测试任务2.2掌握软件测试的分类任务2.3掌握软件测试七大原则任务2.4了解软件测试模型任务2.5学习目标/LearningObjectives学习目标了解路径分析测试,包括控制流图与独立路径测试。03掌握逻辑覆盖测试,包括语句覆盖、判定覆盖、条件覆盖等。02了解代码检查法,包括代码审查、桌面检查与代码走查等。0167/88知识目标/KnowledgeObjectives了解代码检查法的原理与概念,掌握代码检查的流程。01能够掌握逻辑覆盖测试,能够阅读相关代码,并且能够选择适当的覆盖测试方法进行测试。02了解路径分析测试的原理与概念,能够使用绘图工具绘制控制流图。0368/88能力目标/CompetencyObjectives能够将代码检查应用在具体程序中,正确运用代码检查测试方法。能够将逻辑覆盖应用在具体程序中,正确运用逻辑覆盖测试方法。能够将路径分析应用在具体程序中,正确运用路径分析测试方法。熟练使用代码覆盖工具、调试工具和静态代码分析工具等。0103020469/882.1了解代码检查法任务2.1了解代码检查法
什么是代码检查法?
代码检查法是一种传统的检查方法,由程序员检查自己编写的程序。程序员在程序通过编译之后,对源程序代码进行分析、检验,并补充相关文档,目的是发现程序中的错误。代码检查法可以通过桌面检查、代码审查和走查方式进行。71/88任务2.1了解代码检查法
方法桌面检查代码走查代码审查静态分析法应用72/88任务2.1了解代码检查法
1.桌面检查
桌面检查是程序员对源程序代码进行分析、检验,并补充相关的文档,发现程序中错误的过程。由于程序员熟悉自己的程序,可以有程序员自己检查,这样可以节省很多时间,但要注意避免自己的主观判断。73/88任务2.1了解代码检查法
2.代码走查
走查(走读)是程序员和测试员组成的审查小组,通过逻辑运行程序来发现问题。小组成员需提前阅读设计规格书和程序文本,利用测试用例进行逻辑验证。走查分为以下两步:+小组负责人将材料分发给每个成员,成员提出发现的问题。第一步成员记录程序逻辑和功能的疑问,召开会议讨论问题和解决方案。第二步为提高效率,小组可在审查前准备常见错误清单供成员对照。代码走查能够快速发现20%-30%的编码和逻辑设计缺陷,但需要耗费时间和积累经验。74/88任务2.1了解代码检查法
3.代码审查
代码审查是程序员和测试员通过静态分析技术对程序进行阅读、讨论和分析的过程。主要角色:(1)主持人:负责保证审查的速度和效率(2)作者:阐明代码的设计意图和功能(3)评论员:发现代码中的缺陷(4)记录员:记录会议中发现的错误图2-1审查流程图75/88任务2.1了解代码检查法
4.静态分析法应用静态分析法通过分析源代码来评估程序的状态和行为。步骤如下:01确定分析目标明确要分析的对象,如特定代码段、整体程序或整个项目的源代码。02收集信息获取程序或代码的所有相关信息,包括变量声明、数据类型、控制流、函数调用等。03建立模型基于收集的信息建立代表程序行为的模型,可能是形式化模型或流程图、伪代码等。04分析模型检查模型的各个方面(数据流、控制流、函数调用等),以发现错误、漏洞或逻辑不一致。05生成报告整理分析结果,记录问题及建议修复措施,确保报告清晰易懂。06验证修复在修复措施实施后,重新进行静态分析验证修复效果。静态分析法的局限性包括误报或漏报的可能性,以及分析结果受主观判断影响的风险。因此,使用时需谨慎对待分析结果。76/882.2掌握逻辑覆盖测试任务2.2掌握逻辑覆盖测试
什么是逻辑覆盖测试?定义:逻辑覆盖测试是一种以程序内部的逻辑结构为基础的设计测试用例的技术,属于白盒测试。它关注判定表达式的值,通过设计若干测试用例,运行被测程序,使程序中每个可执行语句至少执行一次。类型:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。具体案例:通过测试用例展示了如何应用不同类型的逻辑覆盖测试,确保程序中的每个条件、判定和路径都得到充分测试。特点:不同覆盖类型的强弱关系及其测试效果,如判定覆盖比语句覆盖更强,但仍有局限性。78/88任务2.2掌握逻辑覆盖测试
类型语句覆盖路径覆盖条件组合覆盖条件覆盖判定/条件覆盖判定覆盖79/88任务2.2掌握逻辑覆盖测试
1.语句覆盖(StatementCoverage)语句覆盖(StatementCoverage)的含义就是设计足够的测试用例,使得被测程序中每条语句至少执行一次。又称行覆盖、段覆盖、基本块覆盖,它是最常见的覆盖方式。图2-2语句覆盖流程图public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}80/88任务2.2掌握逻辑覆盖测试
2.判定覆盖(BranchCoverage)
判定覆盖(DecisionCoverage)又称为分支覆盖,其原则是设计足够的测试用例,使得程序中每个判定语句的取真和取假分支至少被执行一次。除了双值的判定语句外,还有多值判定语句,如case语句,因此判定覆盖更一般的含义是:使得每一个判定获得每一种可能的结果至少一次。public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}图2-3判定覆盖流程图81/88任务2.2掌握逻辑覆盖测试
3.条件覆盖(ConditionCoverage)条件覆盖(ConditionCoverage)指的是设计足够的测试用例,使判定语句中的每个逻辑条件取真值与取假值至少出现一次。例如,对于判定语句if(a>1ORc<0)中存在a>1、c<0两个逻辑条件,设计条件覆盖测试用例时,要保证a>1、c<0的“真”、“假”值至少出现一次。82/88任务2.2掌握逻辑覆盖测试
public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}图2-4条件覆盖流程图83/88任务2.2掌握逻辑覆盖测试
4.判定/条件覆盖(分支/条件覆盖)要求设计足够的测试用例,使得判定语句中所有条件的可能取值至少出现一次,同时,所有判定语句的可能结果也至少出现一次。图2-5
判定条件覆盖程序图public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}84/88任务2.2掌握逻辑覆盖测试
5.条件组合覆盖
条件组合(MultipleConditionCoverage)指的是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少执行一次。满足了判定覆盖、条件覆盖、判定-条件覆盖准则。图2-6条件组合覆盖流程图public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}85/88任务2.2掌握逻辑覆盖测试
6.路径覆盖
路径覆盖指的是设计足够的测试用例,使得程序中的每一条可能组合的路径都至少执行一次。图2-7路径覆盖流程图public
classMain{
public
static
voidmain(String[]args){
int
x=10;//例子中的初始值
int
y=2;
int
z=0;
x=function(x,y,z);System.out.println("Result:"+x);
}
public
static
intfunction(int
x,int
y,int
z){
if(y>1&&z==0){
x=(int)(x/y);
}
if(y==2||x>1){
x=x+1;
}
return
x;
}}86/882.3了解路径分析测试任务2.3了解路径分析测试
什么是路径分析测试?定义:路径分析测试是一种基于程序控制流程的测试方法,它通过分析程序的控制流图,找出程序中的所有可能路径,并为每个路径设计测试用例,以达到测试程序的目的。步骤:(1)绘制程序的控制流图,标注出程序中的所有可能路径。(2)为每个路径设计测试用例,以覆盖该路径上的所有语句和分支。(3)执行测试用例,检查程序是否按照预期执行,并输出测试结果。优点:有效地发现程序中的潜在错误和漏洞,提高测试的覆盖率和效率。缺点:需要对程序的结构和逻辑有深入的理解,测试用例的数量可能会很大,测试过程可能会比较耗时等。88/88任务2.3了解路径分析测试控制流图描述了程序执行过程中可以遍历的所有路径。独立路径测试基于控制流图,导出基本路径集,设计测试用例以确保每个独立路径都被执行。89/881.控制流图控制流图(ControlFlowGraph,CFG)是一个过程或程序的抽象表现,它用图的形式表示一个过程内所有基本块执行的可能流向,反映了程序的实时执行过程。控制流图由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。图2-8语句控制流图任务2.3了解路径分析测试90/88任务2.3了解路径分析测试控制流图是程序结构的一种抽象表示,它通过图形化的方式展现了程序执行时控制流(即指令执行的顺序)的转移过程。这种表示方法不仅有助于人类理解程序的逻辑,也是编译器进行各种优化和静态分析的基础。重要性过程导向,路径完整性,有向图,基本块与边,特定节点。特点软件测试、代码优化、静态分析、程序验证等。应用91/881.控制流图案例1:条件嵌套语句。public
classMain{
public
static
voidmain(String[]args){
int
A=10;
int
B=5;//假设B和C有某些初始值
int
C=3;
if(A==10){
if(B>C){
A=B;}else{
A=C;
}
}System.out.println("A:"+A+",B:"+B+",C:"+C);
}}图1-2-9控制流图任务2.3了解路径分析测试
92/881.控制流图案例2:计算整数X和整数Y的最大公约数。图1-2-10while循环流图public
classGCD{
public
static
intgcd(int
x,int
y){
int
q=x;
int
r=y;
while(q!=r){
if(q>r){
q=q-r;}else{
r=r-q;
}
}
return
q;
}
public
static
voidmain(String[]args){
int
x=56;
int
y=98;
int
result=gcd(x,y);System.out.println("TheGCDof"+x+"and"+y+"is:"+result);
}}任务2.3了解路径分析测试
93/882.独立路径测试
独立路径测试(基本路径测试)从程序入口开始,执行程序的各个语句。如果每个独立路径都被执行,说明每个语句都已检验,即实现了语句覆盖。任务2.3了解路径分析测试94/88任务2.3了解路径分析测试以详细设计文档或源代码为基础,构建程序的控制流图。控制流图是一个有向图,其中节点代表基本块(顺序执行的语句序列),边代表控制流从一个基本块到另一个的转移。绘制控制流程图环路复杂性(CyclomaticComplexity),通常用V(G)表示,是衡量程序控制流复杂性的一个指标。它基于控制流图中边的数量和节点的数量计算得出,用于估算程序中独立路径的数量。计算环路复杂性通过分析控制流图,识别出所有独立路径。独立路径是指至少包含一条尚未被其他路径包含的新边的路径。这些路径构成了基本路径集,覆盖了程序中尽可能多的不同执行路径。确定独立路径集合根据基本路径集,设计测试用例以确保每条独立路径都被执行。测试用例应该能够触发程序沿着特定路径执行,从而验证该路径上的所有语句都被执行。设计测试用例95/882.独立路径测试案例1:依据以下代码,用基本路径测试法,设计该程序的测试用例。public
classMain{
public
static
voidmain(String[]args){
int
a=9;//假设a、b、c有某些初始值
int
b=11;
int
c=6;
int
m
=0;//假设m初始为0
if(a>8&&b>10){//条件1,2
m=m+1;//操作3
}
if(a==10||c>5){//条件4,5
m=m+5;//操作6
}System.out.println("m:"+m);
}}图2-11程序控制流图任务2.3了解路径分析测试
96/882.独立路径测试分析:(1)绘制程序控制流图(2)计算环路复杂度:V(G)=4(3个封闭区域+1个开放区域)(3)确定线性无关路径:
1、4、6;
1、4、5、6;
1、2、4、5、6;
1、2、3、4、5、6。(4)设计测试用例编号输入数据预期输出覆盖路径1a=2,b=3,c=4m=01、4、62a=2,b=3,c=8m=51、4、5、63a=10,b=6,c=8m=51、2、4、5、64a=10,b=15,c=8m=61、2、3、4、5、6表2-1测试用例任务2.3了解路径分析测试
97/882.独立路径测试案例2:依据以下代码,用独立路径测试法,设计该程序的测试用例。static
voidpermute_args(intpanonopt_start,intpanonopt_end,intopt_eng,intncycle){
intcstart,cycle,i,j,nnonopts,nopts,pos;//1nnonopts=panonopt_end-panonopt_start;nopts=opt_end-panonopt_end;cyclelen=(opt_end-panonopt_start)/ncycle;
for(i=0;i<ncycle;i++){//2cstart=panonopt_end+i;//3pos=cstart;
for(j=0;j<cyclelen;j++){//4
if(pos>=panonopt_end){//5pos-=nnonopts;//6}else{pos+=nopts;//7
}
}
}}//8任务2.3了解路径分析测试
98/8801请针对上述Java程序给出满足100%DC(判定覆盖)所需的逻辑条件。问题一03请给出问题2种控制流图的线性无关路径。问题三02请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。问题二任务2.3了解路径分析测试
99/882.4了解JUnit单元测试了解JUnit单元测试任务2.4了解JUnit单元测试简介JUnit是Java语言的单元测试框架,支持白盒测试和回归测试。使用步骤包括准备需测试类、引入JUnit包、编写测试类和测试方法、使用断言方法等。特性支持异常处理、参数化测试、批量测试等高级功能。101/88具体应用案例任务2.4了解JUnit单元测试Calculator类测试通过JUnit框架对Calculator类中的加、减、乘、除方法进行测试。Register类登录测试使用参数化测试对Register类的登录功能进行多组数据的测试。Controller测试为SpringBoot的Controller层编写JUnit测试,验证接口响应。102/88任务2.4了解JUnit单元测试1.JUnit测试框架
JUnit是一个用于Java语言的单元测试框架,由ErichGamma和KentBeck创建。作为白盒测试工具,JUnit让程序员能够测试软件的内部实现及其功能。它是xUnit单元测试框架的一部分,专门用于Java,主要应用于白盒测试和回归测试。下面介绍如何生成JUnit单元测试框架。103/88任务2.4了解JUnit单元测试(1)准备需测试类新建名称为Test的项目,在Test项目中新建一个Calculator.java,写入下面代码段,代码段中为加、减、乘、除运算。public
classCalculator{private
static
int
result;public
voidadd(int
m,int
n){result
=m+n;}public
voidsubstract(int
m,int
n){result
=m-n;}
public
voidmultiply(int
m,int
n){
result
=m*n;}public
voiddivide(int
m,int
n){result
=m/n;}public
voidclear(){result
=0;}public
intgetResult(){return
result;}}104/88(2)引入JUnit单元测试包图2-12添加单元测试包①在该项目上点右键,选择“BulidPath”>“AddLibraries...”。任务2.4了解JUnit单元测试105/88(2)引入JUnit单元测试包图2-13选择JUnit测试包导入②弹出“AddLibrary”窗口,选择“JUnit”,点“Next”。选择JUnit4,点“Finish”,JUnit测试包导入成功。图2-14选择JUnit4版本图2-15编写计算器类任务2.4了解JUnit单元测试106/88(3)生成JUnit测试框架图2-16新建JUnitTestCase①在Eclipse的PackageExplorer中用右键点击Calculator.java类弹出菜单,选择“New”>“JUnitTestCase”。任务2.4了解JUnit单元测试107/88(3)生成JUnit测试框架图2-17新建计算机类JUnitTestCase②在弹出的对话框中,进行相应的选择。③点击“Next”后,系统会自动列出Calculator这个类中包含的方法,选择要进行测试的方法。在该例中我们需要对“加、减、乘、除”四个方法进行测试,勾选相应的方法。图2-18选择生成计算器方法任务2.4了解JUnit单元测试108/88(3)生成JUnit测试框架图2-19新建计算器类图④操作“Finish”系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。任务2.4了解JUnit单元测试109/88(4)编写测试类。编写测试用例类。import
staticorg.junit.Assert.*;import
org.junit.After;import
org.junit.Before;import
org.junit.Test;public
class
CalculatorTest{private
static
Calculatorcalculator=newCalculator();
@Beforepublic
voidsetUp()throwsException{calculator.clear();}@Afterpublic
voidtearDown()throwsException{}@Testpublic
voidtestAdd(){
calculator.add(3,4);
//assertEquals判断对象中的值是否是期待的值7assertEquals(7,calculator.getResult());}@Testpublic
voidtestSubstract(){
calculator.substract(10,3);assertEquals(7,calculator.getResult());}@Testpublic
voidtestMultiply(){
calculator.multiply(5,5);assertEquals(25,calculator.getResult());}@Testpublic
voidtestDivide(){
calculator.divide(8,4);assertEquals(2,calculator.getResult());}}任务2.4了解JUnit单元测试110/88(5)运行测试代码。按照上述代码修改完毕后,我们在CalculatorTest类上点右键,选择“RunAs”>“JUnitTest”来运行我们的测试。(具体的测试结果在进度条上面有表示“共进行了4个测试”,4个均测试通过。)图2-20运行JUnitTest图2-21单元测试运行结果任务2.4了解JUnit单元测试111/882.注解
Unit是一个广泛使用的Java测试框架,用于编写和运行自动化测试,确保代码质量和正确性。在JUnit中,测试类和测试方法是核心概念。通过注解(Annotation),可以为测试类或测试方法添加元数据或特定行为,进一步简化测试流程。
以下是一些常见的JUnit注解及其用法。任务2.4了解JUnit单元测试112/882.注解1.Test标记一个方法为测试方法。JUnit会自动识别并运行这些方法。可以指定测试方法的前缀、测试类或测试方法的行为等。2.Before:用于在每个测试方法执行之前执行一些操作。非常适合用于初始化测试数据或设置测试环境。3.After:用于在每个测试方法执行之后执行一些操作。常用于清理测试数据或恢复测试环境,以避免测试间的相互影响。@TestpublicvoidtestMethod(){//测试逻辑}@BeforepublicvoidsetUp(){//初始化测试数据}@AfterpublicvoidtearDown(){//清理测试数据}任务2.4了解JUnit单元测试113/882.注解4.@BeforeClass:用于在所有测试方法执行之前执行一次,且仅执行一次。非常适合初始化全局变量或执行只需进行一次的设置工作。必须为静态方法。5.@AfterClass类似于@BeforeClass,但它在所有测试方法执行之后执行一次,且仅执行一次。常用于关闭资源或执行清理工作。同样必须为静态方法。@BeforeClasspublicstaticvoidsetUpAll(){//初始化全局变量}@AfterClasspublicstaticvoidtearDownAll(){//关闭资源}@Ignore("暂时忽略此测试")publicvoidtestMethod(){//测试逻辑}任务2.4了解JUnit单元测试114/882.注解6.@Ignore:用于暂时忽略某个测试方法。当测试方法尚未完成、存在缺陷或由于某种原因暂时不可用时非常有用。可以指定忽略的原因作为注解的参数。7.@RunWith:用于指定测试运行器,以改变测试的运行方式。例如,可以使用Parameterized运行器来执行参数化测试,或使用Suite运行器来组合多个测试类。应用于测试类上。任务2.4了解JUnit单元测试115/883.测试类与测试方法测试类:在JUnit中,测试类是一个包含测试方法的Java类,通常与被测试类相同或相关。测试类的名称应以Test作为后缀,如MyClassTest。测试方法:测试方法是包含测试代码的函数,每个测试方法应使用@Test注解进行标记。测试方法必须是publicvoid类型且不接受任何参数。importorg.junit.Test;import
static
org.junit.Assert.*;public
class
MyClassTest{
@Test
public
voidtestAdd(){
MyClassmyClass=newMyClass();
int
result=myClass.add(2,3);
assertEquals(5,result);
}
@Test
public
voidtestSubtract(){
MyClassmyClass=newMyClass();
int
result=myClass.subtract(5,3);
assertEquals(2,result);
}}任务2.4了解JUnit单元测试116/884.JUnit断言方法断言用于捕捉代码中的假设,主要在开发和测试阶段使用。它们用于验证关键数据是否符合预期,如果不符合,则程序会发出警告或终止执行。断言帮助创建更稳定和高质量的代码,并且在单元测试中必不可少。JUnit4提供了各种断言方法,通过org.junit.Assert类来检查期望结果与实际返回值,确保被测试方法正常工作。断言方法参数统一说明:message是个可选的消息,假如提供,将会在发生错误时报告这个消息。expected是期望值,通常都是用户指定的内容。
actual是被测试的代码返回的实际值。任务2.4了解JUnit单元测试117/884.JUnit断言方法(1)assertArrayEquals(Stringmessage,expecteds,actuals)用途:比较两个数组是否相等。这里的相等意味着两个数组具有相同的长度,且对应位置的元素也相等(通过equals方法比较)。参数:①message,断言失败时显示的附加信息。②
expected,期望的值。③actual,实际的值。任务2.4了解JUnit单元测试118/884.JUnit断言方法(2)assertEquals(Stringmessage,expected,actual)用途:比较两个对象是否相等。这通常通过调用两个对象equals的方法来实现。参数:①message,断言失败时显示的附加信息。②
expected,期望的值。③actual,实际的值。任务2.4了解JUnit单元测试119/884.JUnit断言方法(3)assertSame(Stringmessage,expected,actual)用途:比较两个对象的引用是否相同。这实际上是检查两个引用是否指向内存中的同一个对象(使用==操作符)。参数:①message,断言失败时显示的附加信息。②
expected,期望的值。③actual,实际的值。任务2.4了解JUnit单元测试120/884.JUnit断言方法(4)assertNotSame(Stringmessage,unexpected,actual)用途:比较两个对象的引用是否不相同。与assertSame相反,用于确保两个引用指向不同的对象。参数:①message,断言失败时显示的附加信息。②
expected,期望的值。③actual,实际的值。任务2.4了解JUnit单元测试121/884.JUnit断言方法(5)assertTrue(Stringmessage,condition)用途:验证条件是否为真。如果条件(condition)的值为true,则断言通过;否则,断言失败。参数:①message,断言失败时显示的附加信息。②
expected,期望的值。③actual
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床试剂工岗中安全专项考核试卷含答案
- 无线电监测设备测试员操作规程能力考核试卷含答案
- 甘油精制工安全生产知识考核试卷含答案
- 毛皮加工工岗位决策判断考核试卷含答案
- 十二碳二元酸装置操作工操作知识强化考核试卷含答案
- 拍卖业务员班组建设考核试卷含答案
- 加氢精制工岗中应急能力考核试卷含答案
- 胸膜反应临床分级与规范处理流程总结2026
- 2026年小学三年级数学上册第六单元《周长计算应用》说课教案
- 2026年小学成语故事《诚惶诚恐》心境感悟语文课堂教案
- 中国心肺复苏指南(2026年更新版)
- 2026年新闻记者职业资格考试试卷及答案(共十套)
- 四川广安加德学校2025-2026学年高一(领航班)上学期9月月考语文试题(无答案)
- 2026年甘肃社区工作者村文书招聘考试笔试试题(含答案)
- 2026秋新版小学湘科版科学四年级上册教学设计(附目录)适用于新课标
- (2026年)肺栓塞完整版课件
- 2026年及未来5年市场数据中国儿童国学教育培训行业全景评估及投资规划建议报告
- 灯塔工厂架构设计思路
- 脚手架安全通道施工实施方案
- 《新能源汽车底盘技术》职校新能源汽车专业全套教学课件
- 第2课《中国人首次进入自己的空间站》教学设计-统编版语文八年级上册
评论
0/150
提交评论