回归测试中的测试用例优先排序技术述评
- 格式:pdf
- 大小:1.13 MB
- 文档页数:18
测试用例优先级分配策略研究在软件开发过程中,测试用例是评估软件质量的重要工具。
然而,在大型软件项目中,测试用例数量庞大,测试资源有限。
因此,合理地分配测试用例的优先级是非常重要的,以确保测试工作的高效和准确性。
本文将探讨测试用例优先级分配策略的研究。
测试用例优先级分配是一种为了确定测试用例执行顺序的方法。
通常情况下,测试用例的优先级根据错误的严重程度、风险和覆盖率等因素进行确定。
根据这些因素,可以将测试用例分为高优先级、中优先级和低优先级。
以下是一些常见的测试用例优先级分配策略。
1. 错误严重程度分配策略错误严重程度是确定测试用例优先级的重要指标之一。
对于严重的错误,测试用例的优先级会被提高。
这种分配策略适用于需要尽快修复严重错误的情况下,以减少潜在的风险。
2. 风险分配策略风险分配策略是一种根据测试对象的风险程度分配测试用例优先级的方法。
通常情况下,风险程度较高的功能和模块将被分配更高的优先级。
这种分配策略适用于需要尽快检测和修复风险问题的场景。
3. 覆盖率分配策略覆盖率分配策略是根据需求和规范的覆盖情况分配测试用例优先级的一种方法。
具有更高覆盖率的需求和规范将被分配更高的优先级。
这种分配策略适用于侧重于全面覆盖系统功能的情况。
除了以上几种常见的测试用例优先级分配策略,还存在其他一些策略,如用户重要性、业务优先级等。
不同的项目根据实际情况选择适合的分配策略,以提高测试工作的效率和准确性。
在进行测试用例分配时,有几个要点需要注意。
测试用例分配应该满足业务需求和客户期望。
优先级高的测试用例应该关注用户关注度和重要性。
测试用例分配应该尽量覆盖不同的测试场景和功能模块,以确保广泛而全面的测试覆盖。
测试用例分配应该合理平衡测试资源的分配。
优先级高的测试用例可能需要更多的资源和时间,因此需要综合考虑资源的可用性。
测试用例分配应该是一个动态的过程。
在软件开发过程中,需求和风险可能会发生变化,因此测试用例的优先级也应相应调整。
如何确定测试(用例)的优先级?
测试人员在设计测试用例时,应对测试用例排定优先级。
优先级越高的测试用例,意味着越应该优先得到测试,并尽早地执行。
所以,测试用例的优先级即是测试的优先级。
那么,如何确定测试的优先级呢?测试的优先级排定可从下列3个角度考虑:
1.用户需求的角度
测试人员应站在用户的角度来分析用户需求,那些用户最常用的功能或者是对用户使用或体验影响最大的性能、质量特性等非功能需求,对用户来说都是最重要的,其对应的测试(用例)优先级也最高。
根据80/20原则,大约20%的软件功能/特性是用户经常接触的,应将其设置为高优先级。
那些认为软件需求同样重要,具有相同优
先级的开发人员可以想想这个法则对他的软件
是不是使用!
2.测试效率的角度
从测试效率角度看,由于在边界区域更容易发现软件的缺陷,所以测试人员可以将测试边界区域的测试用例设置比正常区域的测试用例优先级高。
测试人员也可以根据自己的经验,将容易发现缺陷的其他类型测试用例设置为较高的优先级。
3.修复缺陷的角度
从修复缺陷角度看,开发人员修复一个逻辑方面的缺陷远比修复一个界面或者简单的功能缺陷更难、花费的时间更长或改动范围更大。
因为要修复这种缺陷,开发人员不单纯是修改程序代码,而且很可能还需要变更设计。
因此逻辑方面的测试用例比其他方面的测试用例的优先级要高。
这正是:
确定测试优先级,三个角度可考虑
用户关注最重要,测试过程要效率
参考书目:全程软件测试,作者: 朱少民,出版社: 电子工业出版社。
软件测试中的回归测试指南回归测试是软件测试过程中必不可少的一项重要任务,它用于确保系统在进行了修改或新功能添加之后依然稳定可靠。
本文将为您提供软件测试中的回归测试指南,帮助您提高测试效率和准确性。
一、回归测试概述在软件开发周期中,随着需求变更、修复缺陷和增加新功能的不断进行,回归测试起着至关重要的作用。
回归测试旨在验证软件的修改没有引入新的错误或导致现有功能的退化。
回归测试的流程包括以下几个关键步骤:1. 确定回归测试的范围和目标。
根据需求变更和修改的影响范围,确定需要进行回归测试的模块和功能。
2. 识别关键的回归测试用例。
回归测试用例应该覆盖软件系统的核心功能和主要路径,同时重点考虑修改过的代码和相关模块。
3. 定义回归测试的环境和工具。
根据项目需求,选择适合的测试环境和测试工具,如自动化测试工具、版本控制工具等。
4. 执行回归测试。
按照预先定义的回归测试计划和用例,对被修改过的软件进行测试,并记录测试结果和问题。
5. 分析和修复问题。
对于在回归测试中发现的问题,进行问题分析,并及时修复和验证解决方案。
6. 审核回归测试结果。
根据回归测试的结果,评估软件的稳定性和质量,决定是否继续进行下一轮的回归测试。
二、回归测试的策略和技巧1. 自动化回归测试自动化回归测试能够极大地提高测试效率和准确性。
通过使用自动化测试工具,可以快速重复执行回归测试用例,并生成详细的测试报告。
选择适合的自动化测试工具,并编写可维护和可扩展的测试脚本,可以有效地提高回归测试的效率。
2. 优先级排序在回归测试中,对测试用例进行优先级排序是非常重要的。
优先考虑覆盖核心功能和关键路径的测试用例,以及与修改相关的测试用例。
通过合理的优先级排序,可以更快地发现潜在的问题,并提高测试效果。
3. 版本控制在进行回归测试之前,确保代码已经进行了适当的版本控制是十分必要的。
通过版本控制工具,可以追踪代码的修改和变更,准确定位问题所在,并快速恢复到之前的稳定版本。
软件测试中的回归测试方法分析与比较软件测试是保证软件质量的重要环节,其中回归测试是一种常见的测试方法。
在软件开发过程中,随着需求的变更和新功能的添加,之前已经通过测试的部分功能可能会受到影响。
为了验证软件的修改是否引入了新的错误或导致已有的功能发生异常,回归测试就显得尤为重要。
本文将对软件测试中的回归测试方法进行分析与比较。
我们来了解一下回归测试的定义。
回归测试是指对已经通过的软件功能进行再次测试,以确保新的修改没有损坏已有的功能。
回归测试通过重复执行已有的测试用例来确保软件的稳定性和可靠性。
回归测试方法可以分为以下几种:1.全量回归测试:全量回归测试是指对软件的所有功能都进行测试。
这种方法适用于小型软件或者开发周期短的软件项目。
全量回归测试确保了所有功能都经过测试,但测试执行时间较长,成本较高。
2.部分回归测试:部分回归测试是指选取被修改的功能以及与之相关的功能进行测试。
这种方法适用于大型软件项目或者开发周期较长的软件。
部分回归测试通过选择性地测试被修改的功能和相关功能,减少了测试工作量和时间成本。
3.优先级回归测试:优先级回归测试是指根据功能的优先级对测试用例进行排序,对优先级高的功能进行更多的测试。
这种方法适用于软件开发周期较紧张的情况下,能够尽快验证重要功能的正确性。
4.自动化回归测试:自动化回归测试是指通过编写脚本自动执行回归测试。
这种方法可以提高测试效率,减少人力成本。
自动化回归测试适用于重复性较高的测试工作,如界面验证、功能测试等。
不同的回归测试方法适用于不同的软件项目和开发周期。
在实际应用中,我们需要根据具体的情况进行选择。
以下是几种回归测试方法的比较:1.全量回归测试和部分回归测试:全量回归测试可以确保所有功能都经过测试,但测试工作量和时间成本较高。
部分回归测试可以减少测试工作量和时间成本,但可能会遗漏一些未被修改但相关的功能。
因此,在开发周期紧张的情况下,可以考虑优先选择部分回归测试。
测试用例优先级与设计测试是软件开发过程中至关重要的一环,通过对软件系统进行各种测试来验证其功能的正确性和稳定性。
在进行测试过程中,确定测试用例的优先级并进行设计是一项重要的工作,可以提高测试效率和准确性。
本文将讨论测试用例优先级与设计的相关内容。
一、测试用例优先级的重要性测试用例的优先级指的是测试任务中各个测试用例的执行顺序和重要性。
确定测试用例的优先级可以帮助测试团队合理安排测试资源,提高测试效率和覆盖率。
同时,通过合理设置测试用例的优先级,可以保证测试过程中的风险控制和问题解决的及时性。
二、确定测试用例优先级的方法1. 风险驱动风险驱动的测试方法是根据系统的风险程度来确定测试用例的优先级。
通过分析软件系统中的潜在风险和问题,将可能导致较大影响的功能和模块的测试用例优先级设置为高。
这样可以优先测试风险高的功能,保证关键功能的稳定性和可靠性。
2. 功能关联性功能关联性的测试方法是根据不同功能之间的依赖关系来确定测试用例的优先级。
将功能之间的关联程度较高的测试用例设置为高优先级,这样可以避免由于某一个功能出现问题而导致其他功能无法正常运行的情况。
3. 市场需求根据市场需求和用户的关注点来确定测试用例的优先级。
将用户较为关注的功能和需求的测试用例设置为高优先级,以便尽早发现和解决与用户需求不符的问题。
4. 业务流程根据软件系统的业务流程来确定测试用例的优先级。
将业务流程中的核心环节和关键路径的测试用例设置为高优先级,确保系统在关键流程下的正确性和稳定性。
三、测试用例设计的要点1. 等价类划分等价类划分是测试用例设计中常用的方法,将输入和输出的有效和无效情况划分为不同的等价类,从每个等价类中选取代表性的测试用例进行测试。
这样可以减少冗余的测试用例数量,提高测试效率。
2. 边界值分析边界值分析是针对输入输出的边界值进行测试用例设计的方法。
边界值通常是系统的极端情况,比如最大值、最小值、正常值的边界等。
通过针对边界值的测试可以发现潜在的问题和错误。
软件测试中的回归测试方法在软件开发过程中,随着需求的变更和代码的修改,我们经常需要对软件进行回归测试。
回归测试是为了确保在软件修改之后,已经通过测试的功能仍然正常运行,并且修复的问题不会对其他功能产生负面影响。
本文将介绍几种常见的回归测试方法。
一、冒烟测试冒烟测试是一种快速而简单的回归测试方法,旨在确定软件的基本功能是否受到了严重影响。
在冒烟测试中,只运行最关键的测试用例,并检查软件的基本功能是否正常。
如果冒烟测试失败,说明软件存在严重问题,需要进行进一步的调查和修复。
二、选择性回归测试选择性回归测试是一种根据需求和代码变更的重要性选择回归测试用例的方法。
在选择性回归测试中,测试团队需要对变更的模块和相关功能进行分析,确定需要运行的回归测试用例。
通过这种方式,可以将测试资源集中在最关键的测试用例上,节省时间和人力成本。
三、完全回归测试完全回归测试是指运行所有的回归测试用例,对软件的每个功能进行全面测试。
尽管完全回归测试会耗费大量时间和资源,但它可以最大程度地确保软件的稳定性和兼容性。
完全回归测试适用于关键业务流程发生变化或软件的整体架构发生重大改变的情况。
四、自动化回归测试自动化回归测试是使用测试工具和脚本来自动运行回归测试的方法。
通过自动化回归测试,可以减少手动测试的工作量,并且可以快速地运行大量的测试用例。
自动化回归测试特别适用于对重复性操作进行测试的场景,可以提高测试效率和一致性。
五、排除回归测试排除回归测试是一种将已经通过的测试用例从回归测试中排除的方法。
在排除回归测试中,测试团队会对测试用例进行优先级排序,并将那些不受变更影响的测试用例从回归测试中剔除,以减少回归测试的工作量。
这种方法适用于对特定模块进行修改,且其他模块不会受到影响的情况。
六、逆向回归测试逆向回归测试是一种针对已知的错误进行测试的方法。
在逆向回归测试中,测试团队会集中精力对已经修复的缺陷进行回归测试,以确保修复的问题不会再次出现。
软件测试中的回归测试技巧回归测试是软件开发中非常重要的一项测试活动。
当软件经历了更新、修改或新增功能之后,开发人员需要确保修改不会对软件的其他部分产生负面影响。
因此,回归测试需要在每次修改后进行,以确保软件的稳定性和可靠性。
在本文中,我将介绍一些在软件测试中进行回归测试的技巧。
建立回归测试策略是回归测试的基础。
回归测试策略应该根据软件的复杂性和需求确定测试的优先级和深度。
测试团队需要了解软件的核心功能和主要用例,并基于这些信息来设计回归测试套件。
通过优先级排序测试用例,测试团队可以在有限的时间内完成回归测试,并确保关键功能的稳定性。
有效的回归测试需要充分利用自动化测试工具。
自动化测试可以提高测试的效率和一致性,并降低人为错误的风险。
测试团队可以使用工具来编写脚本或测试用例,以自动执行回归测试。
自动化测试还可以帮助测试团队及时识别问题,并快速进行处理。
然而,测试人员需要谨慎选择自动化测试的范围,并确保测试用例的可维护性。
第三,回归测试需要持续监控,特别是在多次迭代后的长期项目中。
随着软件的复杂性增加,回归测试套件也会逐渐扩大。
因此,测试团队应该定期审查和更新回归测试套件。
通过监控测试结果、识别失败的测试用例并修复问题,测试团队可以保持回归测试的有效性和准确性。
利用版本控制系统是进行回归测试的关键。
版本控制系统可以帮助测试团队在多个版本之间快速切换,并跟踪软件的变更历史。
测试人员可以利用版本控制系统来确定需要进行回归测试的版本,确保测试的准确性和全面性。
针对回归测试,还可以利用测试数据管理技术。
测试数据是回归测试中至关重要的一部分,因为不同的数据输入可能会导致不同的行为和结果。
测试团队应该建立测试数据管理策略,包括创建和维护测试数据集、为测试用例提供合适的测试数据,以及验证测试数据的正确性和覆盖范围。
回归测试中的缺陷管理是关键步骤之一。
测试团队应该及时记录和跟踪回归测试中发现的缺陷,并确保问题得到及时解决。
回归测试的用例选取方法综述回归测试是软件开发过程中的一个重要环节,它的目的是确保新添加的功能或修复的缺陷不会影响原来的功能和性能。
在进行回归测试时,用例的选取方法非常重要,可以影响测试的效果和覆盖面。
本文将综述一些常用的回归测试用例选取方法,帮助测试人员选择合适的方法进行回归测试。
1.功能测试用例选取方法功能测试用例选取方法主要基于软件需求和功能规格说明书。
在回归测试中,我们需要重点验证新功能是否能够正常工作,同时还要保证旧功能不受新功能的影响。
因此,可以按照以下方法选取功能测试用例:(1)按照功能模块选择用例:将系统的功能模块划分,选取每个模块的关键功能用例进行测试,以确保每个模块都能正常工作。
(2)按照覆盖面选择用例:根据功能需求,选择一些典型的测试用例,覆盖功能的各个方面,尽可能地涵盖不同的功能和性能情况。
(3)按照边界条件选择用例:选择一些极端情况下的测试用例,验证系统在边界条件下的正确性和稳定性。
2.性能测试用例选取方法性能测试用例选取方法主要基于系统的性能需求和规格说明书。
在回归测试中,我们需要验证系统的性能是否满足要求,同时还要保证性能测试对其他功能的影响不大。
因此,可以按照以下方法选取性能测试用例:(1)按照负载选择用例:根据系统的负载要求,选择一些负载较高的测试用例进行测试,验证系统在高负载情况下的性能。
(2)按照并发选择用例:选择一些并发较高的测试用例,验证系统在并发情况下的性能。
(3)按照响应时间选择用例:选择一些需要较快响应的测试用例,验证系统在响应时间上的性能。
3.兼容性测试用例选取方法兼容性测试用例选取方法主要基于系统的兼容性要求和规格说明书。
在回归测试中,我们需要验证系统在不同环境下的兼容性,同时还要保证兼容性测试对其他功能的影响不大。
因此,可以按照以下方法选取性能测试用例:(1)按照不同操作系统选择用例:选择一些典型的操作系统,包括Windows、Mac OS、Linux等,在不同操作系统下进行测试,验证系统在不同操作系统下的兼容性。
测试用例优先级划分和定义摘要:1.测试用例优先级的重要性2.测试用例优先级的划分方法3.测试用例优先级的定义4.实施测试用例优先级的注意事项正文:【测试用例优先级的重要性】测试用例是软件测试过程中必不可少的组成部分,它对保证软件质量起到至关重要的作用。
测试用例的优先级则是在有限的时间和资源下,帮助测试人员合理安排测试任务,有效提高软件测试效率和质量的关键因素。
因此,测试用例优先级的划分和定义对于软件测试的成功与否有着重要意义。
【测试用例优先级的划分方法】测试用例优先级的划分通常根据以下几个方面进行:1.根据功能模块的重要性:对软件系统的各个功能模块进行排序,重要性较高的功能模块对应的测试用例优先级较高。
2.根据功能模块的复杂性:对软件系统的各个功能模块进行排序,复杂性较高的功能模块对应的测试用例优先级较高。
3.根据历史缺陷情况:根据以往的缺陷统计,对出现缺陷较多的功能模块对应的测试用例进行优先级排序。
4.根据风险评估:通过对软件系统的风险评估,确定可能导致严重问题的功能模块,并对其对应的测试用例进行优先级排序。
【测试用例优先级的定义】测试用例优先级的定义通常分为以下几个等级:1.高优先级:对软件系统功能、性能、安全等方面有严重影响的测试用例,需要优先执行。
2.中优先级:对软件系统有一定影响的测试用例,可以在高优先级测试用例完成后进行执行。
3.低优先级:对软件系统影响较小的测试用例,可以在高、中优先级测试用例完成后进行执行。
【实施测试用例优先级的注意事项】在实施测试用例优先级时,应注意以下几点:1.确保测试用例划分的合理性,避免因划分不合理导致测试遗漏或重复。
2.在测试过程中,根据实际情况对测试用例优先级进行调整,以保证测试进度和质量。
3.注重与开发团队、项目经理等其他角色的沟通,确保测试用例优先级的实施得到有效支持。
总之,测试用例优先级的划分和定义对于保证软件测试质量和效率具有重要作用。
测试用例的优先级划分如何合理安排测试工作在软件开发过程中,测试是一个至关重要的环节。
为了保证软件质量,需要对软件进行全面而有效的测试工作。
而在测试工作中,测试用例的优先级划分对于测试工作的合理安排起着至关重要的作用。
下面将介绍如何合理划分测试用例的优先级,并针对不同优先级的用例进行测试工作安排。
一、测试用例优先级划分的重要性测试用例优先级划分是测试工作的基础,它决定着测试工作的全面性和高效性。
在测试工作有限的资源下,通过划分测试用例的优先级,可以合理安排测试工作,确保对软件的核心功能和重要性进行覆盖性测试,从而最大程度地提高软件的质量。
因此,测试用例优先级划分是测试工作中的一个关键步骤。
二、测试用例优先级划分的原则测试用例优先级划分应该遵循以下几个原则:1. 核心功能优先原则:首先需要对软件的核心功能进行深度测试。
核心功能是软件的最基本和最主要的功能,对于软件的正常运行至关重要,因此需要优先进行测试。
2. 风险优先原则:测试用例的优先级也应该根据风险来划分。
对于可能引起较大影响或者较高风险的模块或功能,需要优先进行测试。
3. 依赖关系原则:测试用例之间可能存在依赖关系,存在依赖关系的用例需要优先进行测试。
例如,某个用例只有在前置用例通过之后才能进行测试,那么它的优先级就应该低于前置用例。
4. 重要性原则:对于软件中重要的功能和模块,需要优先进行测试。
重要性可以根据用户需求、需求文档和业务流程来确定。
5. 可用性原则:测试用例的优先级也可以根据软件的可用性来划分。
如果某个功能对用户来说非常重要,那么用例的优先级也应该相对较高。
三、测试用例优先级划分的具体方法在实际测试工作中,可以使用如下方法来划分测试用例的优先级:1. 梳理需求并分析功能的重要性和优先级,根据功能的重要程度来划分测试用例的优先级。
将核心功能、高风险功能和重要功能作为高优先级用例。
2. 根据用户需求和流程来划分测试用例的优先级。
将对用户体验和用户操作流程影响较大的功能作为高优先级用例。
测试用例排序规则在软件测试中,测试用例是为了验证软件功能是否按照预期进行的一种手段。
编写有效且高质量的测试用例对于保证软件的质量至关重要。
测试用例的排序规则可以帮助测试团队在开发周期中更好地组织和执行测试。
以下是一些可能的测试用例排序规则:1.功能相关性:将测试用例按照它们与软件功能的相关性进行排序。
将相关的测试用例放在一起可以帮助测试团队更有针对性地检查软件的各个方面。
例如,对于一个电子商务网站,可以将登录和注册功能的测试用例放在一起,将商品和购买功能的测试用例放在一起。
2.优先级:将测试用例按照其重要性和紧急程度进行排序。
这可以帮助测试团队优先处理最关键和最紧急的部分。
例如,一些软件的主要功能故障会导致重大经济损失,那么相关的测试用例应该拥有高优先级。
3.正常流程和异常流程:将测试用例按照它们所涵盖的正常和异常输入进行排序。
这样可以帮助测试团队更好地覆盖软件的各种情况。
例如,对于一个输入验证功能的测试用例,可以先测试正常输入,再测试边界情况和异常输入。
4.依赖性:将测试用例按照它们之间的依赖关系进行排序。
这可以确保测试团队在执行测试时的顺序正确。
例如,对于一个需要先登录才能进行其他操作的软件,登录功能的测试用例应该排在最前面。
5.开发周期:将测试用例按照它们在开发周期中的不同阶段进行排序。
这可以帮助测试团队在合适的时间对不同部分进行测试。
例如,在敏捷开发中,可以将每个迭代或每个功能模块的测试用例分组并按照发布顺序进行排序。
6.可重用性:将测试用例按照它们的可重用性进行排序。
这可以帮助测试团队在不同的项目中更好地复用已有的测试用例。
例如,对于一个通用的登录验证功能,可以编写一个可重用的测试用例,并在不同的项目中使用。
7.风险评估:将测试用例按照它们对软件的潜在风险进行排序。
这可以帮助测试团队优先处理潜在风险较高的部分。
例如,一些软件的一些功能对于用户数据的处理存在潜在的隐私泄露风险,相关的测试用例可以排在前面。
测试⽤例的优先级
刚接触软件测试,先熟悉⼀下测试⽤例的优先级概念:
有时会听到0级别case的说法,其实这是对具有⼀定优先级的测试⽤例的说法。
在实际测试实践中,测试⽤例根据重要性分成⼀定的等级。
在不同的公司,可能测试⽤例的等级划分有所差异,但是基本⼤同⼩异。
如下就是⼀种测试⽤例等级划分的⽅法,共分为4级,由⾼⾄低依次为P0—P3。
P0:核⼼功能测试⽤例(冒烟测试),确定此版本是否可测的测试⽤例,此部分测试⽤例如果fail会阻碍⼤部分其他测试⽤例的验证。
P1:⾼优先级测试⽤例,最常执⾏以保证功能性是稳定的;基本功能测试,和重要的错误、边界测试。
P2:中优先级测试⽤例,更全⾯的验证功能的各个⽅⾯,异常测试,边界、中断、断⽹、容错、UI等测试⽤例。
P3:低优先级测试⽤例,不常常被执⾏,性能、压⼒、兼容性、稳定性、安全、可⽤性等等。
测试用例优先级划分和定义
测试用例的优先级划分是为了在测试资源有限的情况下,根据测试目标和需求的重要性,合理安排测试用例的执行顺序和分配资源。
优先级划分和定义可以通过以下几个方面进行:
1. 需求优先级:将测试用例的优先级根据需求的紧急程度和重要程度进行划分。
需求优先级高的测试用例应该先执行,确保关键功能的测试。
2. 风险优先级:根据软件风险评估的结果,将测试用例按照风险的程度进行划分。
风险高的测试用例应该优先执行,以减少潜在问题对软件质量带来的影响。
3. 功能依赖优先级:将测试用例按照功能的依赖关系进行划分,确保被依赖的功能先进行测试。
这样可以避免功能之间的相互影响,提高测试效果。
4. 代码覆盖率优先级:将测试用例按照代码覆盖率的目标进行划分,优先执行那些能够覆盖更多代码的测试用例。
这样可以提高测试的全面性和有效性。
5. 影响面优先级:将测试用例按照影响面进行划分,优先执行那些能够覆盖更广泛用户或场景的测试用例。
这样可以提高软件的适应性和用户体验。
定义测试用例的优先级可以使用数字或者标签进行表示,例如,可以使用数字1到5来表示优先级,1为最高优先级,5为最
低优先级。
同时,可以为每个测试用例添加标签,比如"高优先级"、"中优先级"、"低优先级"等,方便测试人员进行管理和执行。
另外,还可以使用测试管理工具来对测试用例进行优先级划分和定义,以便更好地进行测试计划和执行。
回归测试的用例选取方法综述回归测试是软件测试过程中重要的一环,主要用于验证软件修改或更新后是否影响了之前已经通过测试的功能和性能。
回归测试的目标是确保软件的稳定性和兼容性,是软件开发生命周期中的一项关键任务。
回归测试用例的选取方法有多种,下面将综述其中几种较常用的方法。
1.影响域分析法影响域分析法是回归测试用例选取的一种常用方法。
该方法基于对软件修改和更新内容的分析,选择那些与被修改部分相关的功能模块来进行测试。
具体步骤包括:识别被修改的代码模块、了解被修改的模块所影响到的其他模块、根据影响程度和重要性选择测试用例。
优点:通过分析软件修改的代码,可以快速定位受影响的模块,提高测试效率。
缺点:需要开发人员提供详细的修改文档或代码变更列表,否则分析的准确性会受到影响。
2.版本增量法版本增量法是基于软件版本的不同来选择回归测试用例的方法。
通过对新版本和旧版本间的对比,找出新版本所增加、修改或删除的功能,并对这些变动进行测试。
通常会选择那些新增或修改较多的功能来进行回归测试。
优点:适用于大型软件项目,通过按版本分别进行测试,可以减少测试用例的数量,提高测试效率。
缺点:要求对软件版本变动有较好的跟踪和管理,否则可能会漏掉一些需要测试的功能变更。
3.预定义的核心测试用例法预定义的核心测试用例法是一种事先定义好一组核心测试用例,每次回归测试都执行这些核心用例的方法。
核心测试用例是软件的基本功能和典型场景的测试用例,可以代表软件的主要功能和性能。
优点:能够快速发现软件修改对核心功能的影响,保证核心功能的稳定性。
缺点:无法覆盖到软件的所有功能,可能漏掉一些边界和异常情况。
4.全量回归测试法全量回归测试法是指每次回归测试都执行全部测试用例的方法。
将软件所有的测试用例都包含在回归测试中,旨在全面验证软件修改后的稳定性和兼容性。
优点:能够最大程度地覆盖软件的所有功能,发现修改产生的潜在问题。
缺点:测试用例数量庞大,执行时间较长,消耗资源较多。
《云网环境下测试用例优先级及自动化测试框架的研究与实现》篇一一、引言随着云计算和互联网技术的飞速发展,云网环境已成为当今信息技术的重要支柱。
在这样的环境下,软件系统的开发和测试变得尤为重要。
为了确保软件系统的质量,测试用例的优先级和自动化测试框架的研发显得尤为关键。
本文将探讨云网环境下测试用例优先级的设定,以及自动化测试框架的研究与实现。
二、云网环境下测试用例优先级的研究1. 需求分析在设定测试用例优先级时,首先需要进行需求分析。
通过分析用户需求,明确软件系统的功能点和性能要求,为后续的测试用例设计提供依据。
2. 风险评估根据需求分析结果,对软件系统进行风险评估。
通过分析系统的复杂度、关键性功能、潜在错误等,确定各功能点的风险等级。
风险等级高的功能点应优先进行测试。
3. 测试用例设计根据需求分析和风险评估结果,设计测试用例。
测试用例应覆盖系统的所有功能点和性能要求,同时要确保测试用例的可行性和可执行性。
4. 优先级设定在完成测试用例设计后,需要根据测试用例的重要性和紧急程度设定优先级。
一般而言,关键性功能、高风险功能点以及性能要求较高的测试用例应设为高优先级。
三、自动化测试框架的研究与实现1. 框架设计自动化测试框架的设计应考虑可扩展性、易用性和可维护性。
框架应支持多种测试类型(如功能测试、性能测试、安全测试等),并具备灵活的测试用例管理和执行机制。
2. 工具选择选择合适的自动化测试工具是实现自动化测试框架的关键。
应根据项目需求、团队技术栈以及工具的功能特点等因素进行综合考量,选择适合的自动化测试工具。
3. 脚本编写与执行根据测试用例和框架设计,编写自动化测试脚本。
脚本应具备可读性、可维护性和可复用性。
编写完成后,通过自动化测试框架执行测试脚本,获取测试结果。
4. 结果分析与报告对测试结果进行分析,生成测试报告。
报告应包含详细的测试过程、测试结果以及改进建议等信息,为项目团队提供有力的质量保障依据。
软件学报ISSN 1000-9825, CODEN RUXUEW E-mail: jos@Journal of Software,2013,24(8):1695−1712 [doi: 10.3724/SP.J.1001.2013.04420] +86-10-62562563 ©中国科学院软件研究所版权所有. Tel/Fax:∗回归测试中的测试用例优先排序技术述评陈翔1,2, 陈继红1, 鞠小林1, 顾庆21(南通大学计算机科学与技术学院,江苏南通 226019)2(计算机软件新技术国家重点实验室(南京大学),江苏南京 210093)通讯作者: 陈翔, E-mail: xchencs@摘要: 测试用例优先排序(test case prioritization,简称TCP)问题是回归测试研究中的一个热点.通过设定特定排序准则,对测试用例进行排序以优化其执行次序,旨在最大化排序目标,例如最大化测试用例集的早期缺陷检测速率.TCP问题尤其适用于因测试预算不足以致不能执行完所有测试用例的测试场景.首先对TCP问题进行描述,并依次从源代码、需求和模型这3个角度出发对已有的TCP技术进行分类;然后对一类特殊的TCP问题(即测试资源感知的TCP问题)的已有研究成果进行总结;随后依次总结实证研究中常用的评测指标、评测数据集和缺陷类型对实证研究结论的影响;接着依次介绍TCP技术在一些特定测试领域中的应用,包括组合测试、事件驱动型应用测试、Web服务测试和缺陷定位等;最后对下一步工作进行展望.关键词: 回归测试;测试用例优先排序;贪心法;元启发式搜索;实证研究中图法分类号: TP311文献标识码: A中文引用格式: 陈翔,陈继红,鞠小林,顾庆.回归测试中的测试用例优先排序技术述评.软件学报,2013,24(8):1695−1712.http:///1000-9825/4420.htm英文引用格式: Chen X, Chen JH, Ju XL, Gu Q. Survey of test case prioritization techniques for regression testing. Ruan JianXue Bao/Journal of Software, 2013,24(8):1695−1712 (in Chinese)./1000-9825/4420.htmSurvey of Test Case Prioritization Techniques for Regression TestingCHEN Xiang1,2, CHEN Ji-Hong1, JU Xiao-Lin1, GU Qing21(School of Computer Science and Technology, Nantong University, Nantong 226019, China)2(State Key Laboratory for Novel Software Technology (Nanjing University), Nanjing 210093, China)Corresponding author: CHEN Xiang, E-mail: xchencs@Abstract: Test case prioritization (TCP) issue is a hot research topic in regression testing research. This method tries to optimize theexecution schedule based on a specific prioritization criterion. The purpose of the TCP techniques is to maximize a specific prioritizationobjective, such as the early fault detection rate of the original test suite. This technique is especially applied to some testing scenarios, forexample testing resource is limited for executing all the test cases. This paper first describes the issue of TCP and classifies the existingTCP techniques into three categories: source code, requirement, and model. The paper secondly formulates a specific TCP issue (i.e.,resource-aware TCP issue) and summarizes its research work. The paper finally summarizes commonly-used evaluation metrics andsubjects in experimental studies, and empirical result affection of different fault injection types. The paper fourthly summarizes theapplication of TCP in some specific testing domains, such as combinatorial testing, event-driven applications testing, fault localization,and Web services testing and discusses some future work of the TCP issue.∗基金项目: 国家自然科学基金(60873027, 61202006); 国家高技术研究发展计划(863)(2006AA01Z177); 国家重点基础研究发展计划(973)(2009CB320705); 江苏省高校自然科学研究项目(12KJB520014); 江苏省研究生培养创新工程(CXZZ120935); 南通市应用研究计划(BK2012023); 南京大学计算机软件新技术国家重点实验室开放课题(KFKT2012B29);收稿时间:2013-01-21; 修改时间: 2013-03-29; 定稿时间: 2012-04-22; jos在线出版时间: 2013-05-23CNKI网络优先出版:2013-05-23 15:18, /kcms/detail/11.2560.TP.20130523.1518.002.html1696 Journal of Software软件学报 V ol.24, No.8, August 2013 Key words: regression testing; test case prioritization; greedy algorithm; meta-heuristic search; empirical study软件产品在开发和维护过程中,因移除软件内在缺陷、完善已有功能、重构已有代码或提高运行性能等,需要执行代码修改并触发软件演化.随着以统一过程和敏捷方法为代表的增量、迭代式开发过程的流行,软件演化频率也随之迅速提高并亟需经济、有效的测试方法来确保演化后软件产品的质量.回归测试作为一种有效的方法,可有效保证代码修改的正确性并避免代码修改对被测程序其他模块产生的副作用.但统计数据表明,回归测试一般占软件产品测试预算的80%以上,占软件维护预算的50%以上[1,2].为了大幅度削减这部分开销,国内外研究人员对自动高效的回归测试技术展开了深入研究,其中,测试用例维护策略的设定是一个核心问题.一种简单维护策略是重新执行已有的所有测试用例,但存在如下问题:(1) 在一些测试场景中,若测试用例数量较多或单个测试用例执行开销较大,则项目实际预算不允许执行完所有测试用例.例如,Rothermel等人在某一合作企业内,在测试一个包含约20 000行代码的软件产品时发现,运行所有测试用例所需的时间长达7周[3].(2) 部分代码修改会影响到被测模块的原有外部接口或内在语义,并导致部分测试用例失效.(3) 若代码修改生成新的测试需求,则需额外设计新的测试用例.针对上述问题,学术界和工业界提出了一系列测试用例维护技术.典型技术包括失效测试用例的识别和修复、测试用例选择、测试用例优先排序(test case prioritization,简称TCP)、测试用例集缩减和测试用例集扩充(test suite augmentation)等[4,5].TCP问题是目前回归测试研究中的一个热点,针对该问题的研究工作最早可以追溯到Wong等人在1997年发表的论文[6].TCP技术通过优化测试用例的执行次序来提高回归测试效率.具体来说,在特定排序准则指导下,将测试用例按重要程度从高到低进行排序并依次执行.实践表明,TCP技术可以协助测试人员提高缺陷检测速率并使开发人员尽早展开调试工作.目前,TCP技术中采用的排序准则一般建立在对源代码、需求或模型的分析基础上;同时,TCP技术不仅成功应用到传统软件的测试中,而且也逐渐成功应用到特定领域的测试中,包括图形用户界面测试、Web应用测试、Web服务测试、组合测试和缺陷定位等.为了对该研究问题进行系统分析、总结和比较,我们通过论文数据库的检索,最终选择出与该主题直接相关的论文共77篇(截止到2013年1月).从论文发表的时间来看,该问题一直是回归测试中的一个研究热点;从论文发表的会议和期刊来看,绝大部分论文均发表在软件工程领域的权威期刊和会议上.本文第1节对TCP问题进行描述.第2节依次从源代码、需求和模型这3个角度对已有的TCP技术进行分类.第3节对资源感知的TCP问题的已有研究成果进行总结.第4节依次分析实证研究中经常采用的评测数据集、评测指标和缺陷植入类型对实证研究结论的影响.第5节依次总结TCP技术在不同特定测试领域中的应用.最后对TCP问题的未来可能研究工作进行了展望.1 测试用例优先排序问题描述对TCP问题的研究最早可以追溯到Wong等人在1997年发表的研究工作[6].他们结合测试用例历史覆盖信息和代码修改信息,针对特定程序版本提出一种混合方法,并开发出ATAC工具.该方法首先借助测试用例集缩减技术识别出冗余测试用例,对余下的非冗余测试用例,根据其覆盖能力进行排序.但未对冗余测试用例给出明确的排序方法.随后,Elbaum和Rothermel等人在2000年对TCP问题给出如下一般性描述[7]:• 给定:测试用例集T,T的全排列集PT,排序目标函数f,其定义域为PT,值域为实数.• 问题:寻找T′∈PT,使得(∀T″)(T″∈PT)(T″≠T′)[f(T′)≥f(T″)].根据上述描述可知,集合PT包含了T中所含测试用例的所有可能执行次序,函数f的输入是一个特定执行次序,输出值与排序目标相关,假设取值越大,该执行次序的排序效果越好.一种典型排序目标是最大化测试用例集的早期缺陷检测速率,实践中还可以考虑其他排序目标,例如代码覆盖率、高风险缺陷的检测率、代码修陈翔等:回归测试中的测试用例优先排序技术述评1697改相关缺陷的检测率和系统可靠性等[8].随后,研究人员又将TCP问题进一步细分为两类:非特定版本(general)TCP问题和特定版本(specific)TCP 问题.前者在测试用例排序时不需要执行代码修改分析,并希望排序结果可以在随后的一系列程序版本上均有效;而后者则需执行代码修改分析,并希望排序结果在特定程序版本上有效.2 测试用例优先排序技术分类本文依次从代码、模型和需求这3个角度对已有TCP技术进行分类.2.1 基于代码的TCP技术2.1.1 贪婪法贪婪法是目前解决TCP问题的一类常用方法.在搜集完测试用例的历史覆盖信息后,依据每个测试用例的程序实体(例如语句、分支或函数)覆盖能力,为其设置权重,并应用贪婪法来指导测试用例的排序,其假设是提高程序实体的早期覆盖率有助于提高缺陷的早期检测速率.根据是否引入反馈机制,可以将贪婪法细分为两种策略:Total策略和Additional策略[3,8].其中,Total策略直接计算出各个测试用例的程序实体覆盖率,并从高到低进行排序.假设测试用例有m个,需要覆盖的程序实体有n个,则该策略的时间复杂度为O(mn).而Additional策略则引入反馈机制.该策略从整体角度出发,认为当一部分程序实体被已执行测试用例覆盖后,对剩余测试用例进行排序时则并不需要考虑对上述程序实体的覆盖.具体来说,即每次执行完一个测试用例时,需要对余下测试用例的覆盖信息进行实时更新.当所有程序实体均覆盖后,将这些程序实体重新设置为未覆盖并对剩余测试用例迭代应用上述过程.该策略的时间复杂度为O(m2n).Rothermel等人在研究TCP问题时,首先关注的是测试用例的语句和分支覆盖情况[3,8].这类程序实体可归为细粒度程序实体.他们提出了一系列排序策略,其中,stmt-total和branch-total属于Total策略,stmt-addtl和branch-addtl属于Additional策略.他们在实证研究中将这些策略与保持原有次序不变策略、随机排序策略和最优排序策略进行了比较,并验证了TCP技术的有效性.随后,Elbaum等人进一步分析了程序实体的粒度大小对排序效果的影响[7,9].他们关注的是测试用例的函数覆盖情况.这类程序实体可归为粗粒度程序实体.实证研究结果验证了他们的推测,即基于粗粒度程序实体的排序方法虽然程序分析的开销较小,但也会降低排序效果. Jones和Harrold考虑的程序实体是MC/DC(modified condition/decision coverage)[10].MC/DC覆盖准则在测试充分性上要强于分支和条件覆盖准则,但他们在实证研究中仅考察了排序所需时间,而未考察其缺陷检测速率.上述研究工作均采用基于C编程语言的评测程序进行有效性评估,Do等人则尝试将TCP技术应用于Java编程语言实现的评测程序和基于JUnit框架的测试用例.他们提出了一系列基于语句块和方法覆盖的Total策略和Additional策略[11,12].实证研究结果表明,TCP技术在面向对象程序的回归测试中同样有效.上述TCP技术均需通过插桩被测程序和执行测试用例来搜集程序实体的覆盖信息.梅宏等人对JUnit测试用例和被测程序进行静态分析来构建出静态调用图,随后,通过估计每个测试用例的代码覆盖能力来完成测试用例的排序[13,14].但Rothermel等人也承认,上述两类策略与最优解之间仍存在一定的差距.李征等人在Additional策略基础上提出另一种贪婪法,即2-Optimal策略[15].该策略的不同之处在于,每一次需选择出两个测试用例,其时间复杂度为O(m3n).在执行Total策略或Additional策略中,有时会出现多个候选测试用例拥有相同的覆盖能力.传统方法是从中随机选择一个,而姜博等人则从另一个角度出发,采用自适应随机测试(adaptive random testing)技术进行选择并提出了多种排序方法[16].也有研究人员借助软件度量技术来进一步提高TCP技术的有效性.Rothermel等人根据测试用例的FEP (fault exposing potential)值来指导测试用例的排序[3,8].FEP值可以用于估计测试用例的缺陷检测能力,其计算基于PIE模型[17]和变异测试分析.PIE模型认为可检测程序内在缺陷的测试用例,需满足3个条件:(1) 测试用例执行了包含缺陷的语句;(2) 造成程序内部状态出错;(3) 通过传播错误的内部状态影响到程序的输出.变异测试是评估测试用例集充分性的一种有效手段.对被测程序执行符合语法约束的简单代码修改(即变异算子)可生成大量变异体,当测试用例在变异体和原有程序上的执行行为不一致时,则称该测试用例可以检测到该变异体.以1698 Journal of Software 软件学报 V ol.24, No.8, August 2013语句覆盖为例,给定被测程序P 和测试用例t ,首先计算语句s (s ∈P )的ms 值,计算公式为ms (s ,t )=killed (s ,t )/mutants (s ).其中,mutants (s )返回一组变异算子应用到语句s 上得到的变异体数,killed (s ,t )返回测试用例t 在上述生成的变异体中可以检测出的数量.假设测试用例t 覆盖的语句集为S ,则该测试用例的FEP 值为(,).s S ms s t ∈∑基于FEP 值,Rothermel 等人分别应用Total 策略和Additional 策略完成测试用例的排序.Elbaum 等人则从函数覆盖角度出发,对测试用例的FEP 值进行计算[7,9].除此之外,Elbaum 等人还将FEP 值与其他缺陷倾向值(fault proneness)(例如fault index 值和Diff 值)结合使用,提出一系列排序方法.以Diff 值、FEP 值和Total 策略为例,首先根据Diff 值对测试用例进行排序,然后对拥有相同Diff 值的测试用例,按照FEP 值进行排序[7,9].Jeffrey 和Gupta 借助程序切片来解决TCP 问题[18,19].他们基于测试用例输出的相关切片(relevant slice)提出一种新的TCP 技术,应用相关切片可以识别出所有可能影响程序输出结果的语句或分支,并在排序时仅考虑对这些语句或分支的覆盖情况.Elbaum 等人认为,在测试用例排序时仅考虑对程序实体的覆盖并不充分,他们在排序时进一步考虑了测试用例的执行开销和缺陷的危害程度[20].在实证研究中,他们考虑了不同的测试用例执行开销和缺陷危害程度分布,其中,测试用例执行开销的分布包括均匀分布、随机分布、正态分布、取自Mozilla 开源项目中的分布和取自QTP 应用中的分布.而缺陷危害程序的分布包括均匀分布和取自Mozilla 开源项目的相关分布.赵建军等人通过分析被测程序内部结构,可以估计出每个模块的缺陷倾向性和重要性,并用于指导测试用例的排序[21].虽然研究人员提出了大量TCP 技术,但根据测试场景特征从中选出合适的TCP 技术同样值得关注.Elbaum等人通过实证研究考察了不同测试场景(主要考察因素包括被测程序特征、测试用例特征和代码修改类型等)对TCP 技术有效性的影响.实证结果为测试人员在不同测试场景下选择出合适的TCP 技术提供了重要依据[22].Arafeen 等人认为,在软件持续演化过程中,每次演化时的代码修改类型对TCP 技术的选择存在影响.他们将该问题建模为多准则决策(multiple criteria decision making)问题,并采用层次分析法(analytical hierarchy process,简称AHP)进行选择.结果表明,他们提出的方法可以为每次回归测试活动选择出最为经济有效的TCP 技术[23].2.1.2 机器学习法李征等人通过将TCP 问题多项式时间规约为背包问题,证实该问题是一个NP 难问题[15].所以,除了上述贪婪法,也有研究人员尝试采用典型的机器学习方法来提高TCP 技术的执行效果.李征等人将元启发式搜索(meta-heuristic search)技术应用到TCP 问题上[15].元启发式搜索技术提供了一个高层框架,基于特定的启发式技术,可以采用合理的计算开销去求解组合优化问题.李征等人考虑了两种元启发式搜索技术:爬山法和遗传算法.其中,爬山法属于局部搜索算法,容易陷入局部最优;而遗传算法属于全局搜索算法,受达尔文的“适者生存和优胜劣汰”思想的启发来指导搜索最优解.结果表明,Additional 策略、2-Optimal策略和遗传算法都要优于其他方法.陈振宇等人同样采用爬山法和遗传算法[24].他们采用模拟实验方式将这两种策略与Total 策略、Additonal 策略以及2-Optimal 策略进行了比较,结果表明,绝大部分情况下,Additonal 策略和2-Optimal 策略的有效性要优于遗传算法、爬山法和Total 策略.Mirarab 和Tahvildari 从概率观点出发,将贝叶斯网络应用到TCP 问题上[25].他们在构建贝叶斯网络模型时需要如下信息:程序实体、每个程序实体的缺陷倾向和每个测试用例检测到缺陷的概率.随后,他们通过引入反馈机制对上述方法进行了扩充[26],即假设若选择出的测试用例覆盖了一部分程序实体,则将降低覆盖同类程序实体的测试用例的选择概率.该方法与Rothermel 等人提出的Additional 策略类似.Leon 和Podguski 引入一类基于执行轨迹分布的测试用例筛选和排序方法[27].首先设置相异性函数来评估两个测试用例执行轨迹间的相异程度,然后借助相异性函数完成测试用例的聚类分析.通过聚类分析可获得如下辅助信息:(1) 同一聚类内的测试用例可能是冗余测试用例;(2) 孤立点包含的测试用例有可能会触发失效;(3) 空间内低密度区域包含的测试用例可能覆盖了罕见行为模式.第1点可用于指导冗余测试用例的筛选,而满足后两点的测试用例则更有可能检测到被测软件的内在缺陷.所以,给这类测试用例设置更高的优先级有助于提高缺陷检测速率.随后,他们进一步提出Cluster Filtering 和Failure-pursuit 采样策略来指导测试用例的筛选和陈翔等:回归测试中的测试用例优先排序技术述评1699排序.实证研究结果表明,基于分布的方法在缺陷检测能力上要优于基于覆盖的方法,但这两类方法在不同类型缺陷上的检测能力并不相同,且可以形成互补.所以,他们综合这两类方法提出了一种有效的测试用例混合排序方法.Carlson等人同样将具有相似性质的测试用例划分到同一聚类里,并推断同一聚类内的测试用例具有相似的缺陷检测能力.但与Leon和Podguski的研究工作不同,他们在完成聚类分析后,在随后的测试用例排序时还综合考虑了代码覆盖信息、代码复杂度以及测试用例的历史缺陷检测信息等[28].与Elbaum等人的研究[20]相似,Huang等人认为,在实际软件测试过程中,测试用例的执行开销和缺陷危害程度并不一致.他们通过搜集测试用例的历史执行信息来估计测试用例的执行开销和缺陷危害程度,并提出了一种基于遗传算法的TCP技术[29].2.1.3 融合专家知识法研究人员认为,在已有排序方法的基础上,若考虑融合专家知识,则有助于进一步提高测试用例的排序效果.Tonella等人提出一种基于实例的排序(case-based ranking,简称CBR)方法[30].该方法借鉴了机器学习中的提升(boosting)策略.提升策略提供了一个通用框架,可以将多个简单学习器合并为一个高效学习器.CBR方法可以同时考虑多种不同类型的排序准则,并可以进一步融合专家知识.其中,通过指定部分测试用例间的两两优先级关系来构造专家知识库.CBR方法采用迭代方式进行学习,且每次迭代完成后,均会返回一个临时排序结果,其排序效果随迭代次数的增加而逐渐提高.Yoo等人则将专家知识融合到基于聚类分析的TCP技术中[31].该方法可以有效减少专家需要指定的测试用例间的两两优先级关系.具体来说,在完成聚类分析后,簇间的排序依赖专家知识,而簇内测试用例的排序则基于代码覆盖率.在完成这两层排序后,他们提出一种交织聚类排序(interleaved clusters prioritisation)技术,即,首先从优先级最高的簇类内选择一个优先级最高的测试用例,然后根据簇间优先级选择下一个簇类,并从中选择一个优先级最高的测试用例,依此类推,直到所有测试用例都被选择出来.在上述方法中,他们采用层次分析法完成专家知识的构建,层次分析法最早由运筹研究界提出并已经成功应用于需求工程研究中.实证结果表明,他们所提出的方法的有效性要高于传统的基于覆盖的TCP技术.同时,该方法具有一定的鲁棒性,即,在存在专家误判的情况下,该方法仍然可以取得很高的缺陷检测速率.他们认为,上述现象的出现是因为这类方法的有效性受聚类分析结果的影响较大.该结论与Leon和Podgurski的研究工作[27]保持一致.而且,这类方法有时候可以让具有缺陷检测能力的测试用例优先执行,即使这类测试用例可能因语句覆盖率较低而导致优先级较低.2.1.4 其他方法除了上述方法,也有研究人员从其他角度对TCP问题进行研究.Srivastava和Thiagarajan开发出了Echelon 工具[32].该工具可以对修改前后程序的二进制代码进行比较并识别出受代码修改影响的基本语句块,随后根据测试用例对这些基本语句块的覆盖能力进行排序.Sherriff等人借助矩阵分析中的奇异值分解来获取软件制品中的关联聚类(association cluster),并提出一种TCP方法[33].该TCP方法依赖关联聚类、测试用例和文件间的关联关系以及修改向量.具体来说,在修改矩阵上应用奇异值分解可以生成关联聚类,即,若两个文件在缺陷修复时经常被同时修改,则将这两个文件聚类到同一关联聚类内.每个文件与影响或覆盖该文件的测试用例建立关联关系.修改向量被用于描述代码修改信息,其中,相关分量反映了对应文件是否被修改过.使用关联聚类和修改向量可以为每个文件设置优先级,以衡量新的代码修改与每个测试用例的匹配程度.该方法的一个新颖之处在于,可以使用任意软件制品来指导测试用例的排序.Ramanathan等人提出了PHALANX框架.他们搜集测试用例的历史覆盖信息,并将其建模为测试用例相异图(test-case dissimilarity graph),其中,节点代表测试用例,边上的权重代表测试用例间的相似程度,基于该模型提出了多种TCP技术[34].2.1.5 基于源代码的经典TCP研究工作比较本节对基于源代码的经典TCP研究工作进行系统的比较,比较因素包括方法类型、排序准则、排序策略以及实现评测程序的编程语言,最终结果见表1.1700Journal of Software 软件学报 V ol.24, No.8, August 2013Table 1 Comparison for typical TCP research work based on source code表1 基于源代码的经典TCP 研究工作比较 References Type Prioritization criterion Prioritization strategy ProgramminglanguageRothermel, et al .[3,8] Greedy Statement/decision coverage; FEP based on statementTotal/additional C Elbaum, et al .[7,9] Greedy Statement/function coverage;FEP based on statement/function; FI-FEP based on function;Diff-FEP based on functionTotal/additional C Jones, et al .[10] Greedy MC/DC coverage Additional CDo, et al .[11,12] Greedy Block/method coverage; Diff based on methodTotal/additional Java Mei, et al .[13,14] Greedy Method/statement coverage; Static call graphs of JUnit test cases and the program under testTotal/additional JavaGreedy Total/additional/2-Optimal Li, et al .[15] Meta-Heuristic search Block/decision/ statement coverage Hill climbing/genetic algorithmC Total/additional Jiang, et al .[16] Greedy Statement/decision/ function coverage Adaptive random testingC Jeffrey, et al .[18,19] Greedy Statement/decision coverage Relevant slices CGreedy Total/additional/2-optimal Li, et al .[24] Meta-Heuristic search Requirement coverage Hill climbing/genetic algorithmSimulation Mirarab, et al .[25,26] Machine learning Class/method coverage Bayesian network JavaCarlson, et al .[28] Machine learning Code coverage, code complexity metric, and fault history informationCluster analysis C++ Tonella, et al .[30] Machine learning Statement coverage, loop complexity, and expert knowledgeCase based ranking C Yoo, et al .[31] Machine learning Statement coverage and expert knowledge Interleaved cluster analysis and analytical hierarchy process C2.2 基于模型的TCP 技术目前,实践人员和研究人员逐渐倾向于借助模型来辅助软件系统的设计、开发和维护.Korel 等人重点关注了一类基于状态的软件系统,典型系统包括计算机通信系统和工业控制系统等.他们将这类系统用扩展有限状态自动机(EFSM)进行描述,EFSM 模型由状态(state)和迁移(transition)构成.首先,通过对比修改前后模型可以识别出模型差异.模型差异通过基本模型修改操作(包括迁移添加、迁移移除等)序列来表示;随后,在修改后的模型上执行所有测试用例,以搜集测试用例对模型差异的覆盖信息;最后,基于上述覆盖信息提出两种排序方法:选择性排序法和基于模型依赖关系的排序法.前一种方法将测试用例分为两类:高优先级测试用例TS H 和低优先级测试用例TS L ,将覆盖了模型差异的测试用例放置到集合TS H ,否则放置到集合TS L .在执行时,先执行TS H 中的测试用例,后执行TS L 中的测试用例.对同一集合内的测试用例,通过随机排序方式决定先后执行次序.后一种方法对TS H 中的测试用例,通过分析模型差异与模型其他模块间的控制和数据依赖关系来确定测试用例的执行次序[35].在上述工作的基础上,他们进一步提出一些启发式设定来辅助测试用例的排序.这些启发式包括为覆盖更多迁移修改操作的测试用例设置更高的优先级,为覆盖迁移修改操作频次更高的测试用例设置更高的优先级等[36,37].在面向对象软件系统的系统测试阶段,Kundu 等人采用UML 中的序列图(sequence diagrams),基于场景覆盖准则来指导测试用例的设计.随后,基于序列图中的消息权重和边权重,提出了3种不同的测试用例排序准则:消息权重总和、加权平均路径长度和代码权重[38].2.3 基于需求的TCP 技术也有研究人员从需求角度出发来指导测试用例的排序.Srikanth 等人在系统测试阶段提出了PORT 排序方法[39].该方法在对测试用例排序时考虑如下的影响因素:需求变更的可能性、客户定义的需求优先级、需求的实现复杂度和需求的缺陷倾向性.该方法的不足在于,一些影响因素的取值需要人工估计,造成取值具有主观性并会影响随后的排序效果.屈波等人基于测试用例的设计信息,提出了一组基于需求的测试用例优先级动态调整算法.该方法不仅可以充分利用测试用例的设计信息(论文中主要考虑的是测试用例对测试需求的预期覆盖。