首页> 中国专利> 通过不一致处置检测的软件测试保证

通过不一致处置检测的软件测试保证

摘要

描述了检测开发中的软件的自动化测试中可能的漏洞的工具和方法。测试的完全行覆盖不一定指示执行场景的实际覆盖,例如,即使当所有源代码语句名义上被覆盖时,条件覆盖、决策覆盖、以及其他种类的执行场景覆盖也可以是缺乏的。当源代码改变被提交、并且对应的测试集保持未改变时,用户被通知充分的测试未由当前测试集保证。开发工具链中的测试保证代码可以标示拉取请求、测试集、或者源代码提交,以指示测试保证的缺乏。在一些情况下,例如,保证增强的工具可以要求新的测试或者不同的测试与已更新的源代码一起被提供,作为该源代码被接受以供包括在存储库或者构建中的先决条件。

著录项

  • 公开/公告号CN112771505A

    专利类型发明专利

  • 公开/公告日2021-05-07

    原文格式PDF

  • 申请/专利权人 微软技术许可有限责任公司;

    申请/专利号CN201980063816.X

  • 发明设计人 M·K·加亚斯沃;

    申请日2019-06-26

  • 分类号G06F11/36(20060101);

  • 代理机构11256 北京市金杜律师事务所;

  • 代理人黄倩

  • 地址 美国华盛顿州

  • 入库时间 2023-06-19 10:52:42

说明书

背景技术

通过向计算机程序馈送输入值、并且将产生的行为和输出与所预期的相比较,该计算机程序可以被测试。然而,除了最简单的程序以外,其他任何程序的测试都可能是不完整的,因为在测试期间,程序的可能行为的许多方面未被行使。例如,许多程序可以被给予极大数目的不同输入值。程序可能从可能输入的集合中接受电子邮件地址、电话号码或其他输入,这些输入既包括任意大数目的有效值,又包括任意大数目的无效值。而且,程序在执行期间可能采取的不同路径的数目可以是巨大的。如果给定程序包含具有对应的决策条件的二十个决策点,在这些决策点处如果条件为真则执行跟随一个分支,并且当条件为假时则执行跟随另一分支,然后存在通过该程序的超过一百万个不同的路径。广泛可用的软件应用可以具有数千个这样的决策点,而不仅是二十个,并且通过应用程序代码的路径数目也相应地增加。

计算机程序可以由向程序馈送输入值的人员手动测试,但是现在许多程序至少部分地通过自动化测试而被测试。测试自动化工具向被测试程序馈送输入,并且针对测试套件中所指定的标准自动地检查产生的行为和输出。自动化测试使更彻底地并且以更一致的方式测试程序成为可能。但是,即使利用自动化测试,程序的一些方面未被行使、或者不然以某种方式未完全被测试也可能发生。例如,甚至自动化测试也不能向程序输入每个可能的电子邮件地址、电话号码或者其他输入来检查程序针对每个输入是否表现正确。而且,对于大多数(如果不是全部)商业程序,对程序的测试的自动化不会固有地提供将是执行每个单个路径所需要的计算资源,每个单个路径可以通过程序而被采用,因此许多路径未被测试。

发明内容

本文的一些教导由结合存储库拉取(pull)请求来确保代码质量的最初技术挑战激发。一种新兴的技术挑战是如何改进自动化测试覆盖。在该上下文中,发明人断定现有方法可能错误地假设代码覆盖等于测试覆盖,并且标识了如何有用地利用测试套件来协调源代码变化的技术挑战。通过下面所提供的讨论,由此处所教导的创新解决的其他技术挑战对技术人员将是明显的。

一些实施例提供软件测试保证(assurance)技术,即,通过自动化测试来增强或提供关于软件覆盖的性质或程度的保证的技术。这些软件测试保证实施例中的一些软件测试保证实施例包括处理器、可操作地与处理器通信的存储器、以及保证代码。在利用处理器执行后,保证代码接收此处被表示为“S-当前”(S-current)的代码更新提交。该提交“S-当前”包括此处被表示为“P-当前”(P-current)的部分,“P-当前”包括对源代码的更新。保证代码确定部分“P-当前”至少部分地由测试套件的测试集(此处表示为“TS-当前”(TS-current))覆盖。保证代码查明(ascertain)测试集“TS-当前”是否与测试集“TS-在前”(TS-prior)不同,测试集“TS-在前”至少部分地覆盖代码更新提交“S-在前”(S-prior)的部分“P-在前”(P-prior)。在该示例中,“S-在前”比“S-当前”旧,并且“P-当前”更新“P-在前”。当该查明(ascertaining)查明了“TS-当前”没有与“TS-在前”不同时,保证代码基于“TS-当前”测试集来标示至少一个项以指示针对“P-当前”更新的测试保证的缺乏。即,保证代码设定(raise)以下至少一项的标记(flag):“S-当前”、“P-当前”或“TS-当前”。

一些软件测试保证实施例提供或者使用特定的动作。例如,实施例可以接收代码更新提交“S-当前”,代码更新提交“S-当前”包括具有源代码的一行或多行的部分“P-当前”,“P-当前”包括对源代码的更新。该实施例可以确定源代码的部分“P-当前”至少部分地由测试套件的测试集“TS-当前”覆盖,并且可以查明测试集“TS-当前”是否与测试集“TS-在前”不同,测试集“TS-在前”至少部分地覆盖代码更新提交“S-在前”的部分“P-在前”。在该上下文中,“S-在前”比“S-当前”旧,并且“P-当前”更新“P-在前”。当“TS-当前”没有与“TS-在前”不同时,该实施例可以基于“TS-当前”测试集来标示至少一个项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏,并且可以以其他方式在“TS-当前”相对于“P-当前”没有与“TS-在前”不同的基础上避免标示任何项。被标示的(多个)项可以是更新提交、或者已提交的代码、或者测试集、或者这些项的组合,每个被标示的项在过去的版本、当前的版本或两者中。

与本文的教导有关的其他技术活动对于本领域技术人员而言也将变得明显。给出的示例仅是说明性的。本发明内容既不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。相反,提供本发明内容是为了以简化的形式介绍一些技术概念,这些技术概念将在下面的具体实施方式中进一步被描述。本发明用权利要求来限定,并且在本发明内容与权利要求相抵触的情况下,以权利要求为准。

附图说明

将参考附图给出更具体的描述。这些附图仅图示所选择的方面,因此不能完全确定覆盖或范围。

图1是图示计算机系统并且还图示经配置的存储介质的框图;

图2是图示针对测试保证而被增强的计算系统的各方面的框图,其示出了测试保证代码和其他项;

图3是图示关于自动化测试的不同种类的代码覆盖的示例的框图;

图4是图示关于程序错误(bug)修复或特征改变的对应于源代码的和测试的不同处置的一些场景的框图;

图5是图示实现程序错误修复、特征改变或两者的一个或多个源代码更新的理想化的源代码示意图;

图6是图示在各种场景中通过测试的源代码覆盖的示例的理想化的源代码示意图;

图7是图示一些软件测试保证方法中的步骤的流程图;

图8是进一步图示一些软件测试保证方法中的步骤的流程图;以及

图9是图示存储库的框图。

具体实施方式

概述

创新可以超越其起源,但了解创新的起源可以帮助人们即使在创新已经超越其原始关注时也更充分地理解该创新。在当前情况下,软件测试创新产生在发明人寻求通过改进对软件组件功能性的自动化测试来改进这些功能性的方式的上下文中。

许多软件开发团队使用代码覆盖信息来检测测试覆盖中的缺失(deficiency)。然而,存在以下实例:在该实例中,代码行名义上被测试覆盖,但是测试不一定覆盖所有的执行场景。因此,当这样的代码被改变时,程序错误被引入。纯粹依赖于表面上的代码覆盖来高亮测试覆盖的缺乏在这样的情况下不足以适当地管理测试技术债(debt)。本文中所描述的一些实施例检查该情况并且警告可以是例如开发人员或测试者的用户。当代码被添加到项目而没有也添加对该代码的彻底的自动化测试时,“技术债”增加。

当开发人员改变代码行以修复程序错误、或者添加某种功能性时,自动化测试中的对应的改变是谨慎的。如果没有任何覆盖经编辑的行的测试被更改,并且没有覆盖该行的新测试被编写,则即使代码覆盖报告示出该行被覆盖,也存在将被填补的测试漏洞。对测试覆盖中缺乏的代码更新的智能检测识别到,当更新中的给定代码行经受任何自动化测试时,其可能被错误地视为被覆盖,而不是识别覆盖仅是部分的可能性并且对此采取动作。

针对代码的测试覆盖程度可以关于可能状态的完整空间而被定义,该可能状态可以在讨论中的代码的执行期间出现。不针对正确性检查可能状态的整个空间的测试仅提供部分的覆盖。实际情况是,大多数测试将是部分的。但是这不会使测试变得无用。实际上,鉴于本公开的教导,这是将测试工作量集中于以可以更有可能揭示缺点的方式来使用有限的测试资源、并且特别是集中于如本文中所教导的来标示潜在的测试缺失的原因。

当代码被更新、但是对应的测试未被改变时,存在若干可能性。一种可能性是未被改变的测试充分地覆盖已更新的代码,例如,覆盖与代码的先前版本中所覆盖的可能执行状态的大约相同的百分比。另一种可能性是更新未被充分地测试。或许不存在对该更新的测试覆盖,例如,代码行或变量状态被添加但是未被测试。或许存在对该更新的某种测试覆盖,但是针对该更新的原因是测试未能检测到现在(或许)已经被更新修复的程序错误,因此测试也应当被更新。换言之,除了广泛被认识到的经受测试的程序的程序错误的可能性以外,还可能发生程序测试自身具有程序错误。

在向存储库提交代码更新的上下文中,提交可以采取“拉取请求”的形式,其是更新被拉取到存储库中的一种请求。如果如本文中所教导的代码更新、测试更新(如果有)以及测试覆盖的分析揭示当代码被更新时测试还未谨慎地被更新,则该分析结果可以被显现给提交该拉取请求的用户。针对拉取请求的提交用户界面可以向用户警告或者通知代码更新与测试更新之间的不一致。用户界面可以建议或者甚至要求:(a)一个或多个测试被修改以覆盖激发了代码改变的场景;或者(b)一个或多个新的测试在测试套件中被编写并被激活以覆盖激发了代码改变的场景。

本文中所教导的实施例帮助提供软件测试保证。当源代码被更新、但是该代码的对应的自动化测试未被也更新时,或者当存在关于测试是否已充分更新的技术问题时,测试保证的缺乏可能发生。当代码被更新时,该更新可能已经完成修复测试未捕捉到的错误。因此,对测试的更新可以有助于检测相同或相似的错误。

本文描述的一些实施例可以由一些人在更广泛的上下文中看待。例如,诸如保证、一致性、覆盖、测试和更新的概念可以被认为与特定实施例相关。然而,从广泛上下文的可用性,不遵循在本文中寻求对抽象概念的排他性的权益;抽象概念不是本公开的目标。而是,本公开关注于提供适当的特定实施例,这些实施例的技术效果完全或部分地解决特定技术问题,诸如如何对警报进行优先级排序。涉及保证、一致性、覆盖、测试或更新的其他经配置存储介质、系统和方法在本公开范围之外。因此,在适当地理解本公开的情况下,也避免了模糊、仅抽象、缺乏技术特征以及伴随的证明问题。

技术特征

本文描述的实施例的技术特征对于本领域的普通技术人员将是明显的,并且也将以多种方式对于各种专注读者而言是明显的。实施例解决了根植于计算技术中的技术活动,诸如自动化测试和对程序错误的及时检测和改正,这影响了大范围的软件组件。一些软件测试保证实施例通过以下来改进计算系统的运作:自动地检测源代码更新相对于代码测试套件更新的处置中的不一致,并且通知用户附加的或者已更新的测试会是谨慎的。在被测试的代码被更新时检测测试覆盖中的潜在缺失并且一致地更新测试集帮助使得使用已更新代码的系统更安全、高效和有效地操作。

当测试缺失未被检测到时,时间和资源可能通过尝试标识、修复或绕过程序错误或安全性弱点而被浪费,这些程序错误或安全性弱点原本在已更新但是有程序错误的代码被提交时已经更早并且更有效地被解决。测试保证可以被添加到软件开发工作流,或者在这样的工作流内被改进。例如,通过利用本文中所教导的保证代码来增强开发工具、开发工具扩展、或者开发工具链中的独立实用程序(utility),测试覆盖的保证可以被改进。特别地,连续集成连续部署(CICD)工作流将受益于经改进的测试保证。当包含程序错误的代码在开发人员的思想中是新鲜的时,例如,在CICD工作流中开发人员提交经修改的代码以供包括在存储库或构建中时,修复这些程序错误更容易并且更快。

根据所提供的描述,本教导的技术特性的其他方面和优点对于本领域技术人员也是明显的。

首字母缩写词、缩写和名称

下面定义一些首字母缩写词、缩写和名称。其他的在本文的其他地方定义,或者这里不需要定义来使本领域技术人员理解。

ALU:算术和逻辑单元

API:应用程序接口

BIOS:基本输入/输出系统

CD:压缩盘

CPU:中央处理单元

DVD:数字通用盘或数字视频光盘

FPGA:现场可编程门阵列

FPU:浮点处理单元

GPU:图形处理单元

GUI:图形用户界面

DS:入侵检测系统,通常可以是例如HIDS(基于主机的IDS)或NIDS(基于网络的IDS)

IoT:物联网

IP:互联网协议

LAN:局域网

OS:操作系统

RAM:随机存取存储器

ROM:只读存储器

UEFI:统一可扩展固件接口

VM:虚拟机

VS:Visual

VS Code:Visual

WAN:广域网

附加术语

在本文中参考诸如附图中所示的示例性实施例,并且本文中使用特定语言来描述它们。但是,相关领域的并且拥有本公开的技术人员会想到的本文中所示的特征的更改和进一步修改以及由本文中特定实施例说明的抽象原理的附加技术应用,应当被认为在权利要求的范围内。

在本公开中澄清了术语的含义,因此在阅读权利要求时应当仔细注意这些澄清。给出了特定示例,但是相关领域的技术人员将理解,其他示例也可以落入所使用的术语的含义内,并且落入一个或多个权利要求的范围内。这里的术语不一定具有与它们在一般用途(尤其是在非技术用途中)、在特定行业的用途、在特定词典或词典集中的用途相同的含义。附图标记可以与各种措辞一起使用,以帮助示出术语的广度。从给定文本片段中省略附图标记并不一定意味着该文本未讨论图的内容。发明人主张并且行使对特定和所选择的词典编纂的权利。带引号的术语被显式地定义,但也可以不使用引号而隐式地定义术语。可以在具体实施方式中和/或在申请文件中的其他地方显式或隐式地定义术语。

如本文中使用的,“计算机系统”可以包括例如一个或多个服务器、主板、处理节点、膝上型电脑、平板电脑、个人计算机(便携式或非便携式)、个人数字助理、智能电话、智能手表、智能手环、蜂窝或移动电话、至少具有处理器和存储器的其他移动设备、视频游戏系统、增强现实系统、全息投影系统、电视、可穿戴式计算系统和/或提供至少部分地由指令控制的一个或多个处理器的(多个)其他设备。指令可以采用固件或存储器和/或专用电路系统中的其他软件的形式。

“多线程”计算机系统是支持多个执行线程的计算机系统。术语“线程”应当被理解为包括能够调度或经受调度(并且可能进行同步)的任何代码,并且例如还可以被称为诸如“任务”、“进程”或“协程(coroutine)”的另一名称。线程可以并行地运行、顺序地运行,或以并行执行(例如,多处理)和顺序执行(例如,时间分片)的组合运行。

“处理器”是线程处理单元,诸如同时多线程实现中的核心。处理器包括硬件。给定芯片可以容纳一个或多个处理器。处理器可以是通用的,或者可以被定制用于特定用途,诸如向量处理、图形处理、信号处理、浮点算术处理、加密、I/O处理、机器学习等。

“内核”包括操作系统、管理程序、虚拟机、BIOS或UEFI代码、和类似的硬件接口软件。

“代码”意味着处理器指令、数据(包括常量、变量和数据结构)或指令和数据两者。“代码”和“软件”在本文中可互换使用。可执行代码、解译代码和固件是代码的一些示例。必须被解译或被编译以便执行的代码经常称为“源代码”,但是当上下文向技术人员清楚指示讨论中的代码是源代码(例如,在提交已更新的代码以供包括在存储库中的上下文中)时,源代码可以被简单地称为“代码”。

“程序”在本文中被广泛地使用,以包括应用、内核、驱动、中断处理件、固件、状态机、库以及由程序员(也被称为开发人员)编写和/或自动生成的其他代码。

“服务”意味着在云计算环境或其他网络或计算系统环境中提供的消耗性程序。

“云”意味着用于计算、存储和联网的池化资源,其可弹性用于测量的按需服务。云可以是私有的、公共的、社区的或混合的,并且可以以基础设施即服务、平台即服务、软件即服务或另一服务的形式提供云服务。除非另有说明,否则从文件读取或写入文件的任何讨论都包括读取/写入本地文件或通过网络(可能是云网络或其他网络)进行读取/写入,或者同时进行两者(本地和联网读取/写入)。

“IoT”或“物联网”是指可寻址嵌入式计算节点的任何联网集合。这样的节点是本文定义的计算机系统的示例,但是它们还具有以下特性中的至少两个特性:(a)没有本地人类可读的显示器;(b)没有本地键盘;(c)输入的主要源是跟踪非语言数据的源的传感器;(d)没有本地可旋转磁盘存储装置-RAM芯片或ROM芯片提供唯一的本地存储器;(e)没有CD或DVD驱动器;(f)嵌入家用电器中;(g)嵌入经植入的医疗设备中;(h)嵌入交通工具中;(i)嵌入过程自动化控制系统中;或(j)专注于以下中的一项的设计:环境监视、市政基础设施监视、工业设备监视、能源使用监视、人类或动物健康监视或物理输运系统监视。

除非另有说明,否则如本文中使用的,“包括”允许附加元素(即,包括意味着包含)。

“优化”意味着改进,而不必完美。例如,可以在已经被优化的程序或算法中进行进一步的改进是可能的。

例如,“过程(process)”在本文中有时被用作计算科学领域的术语,并且在技术意义上涵盖资源用户,即协程、线程、任务、中断处理件、应用过程、内核过程、过程(procedure)和对象方法。“过程”在本文中也用作专利法领域的术语,例如,在描述与系统权利要求或制品(经配置的存储介质)权利要求相对的过程权利要求时。类似地,“方法”在本文中有时被用作计算机科学领域的技术术语(一种“例程”),也被用作专利法领域的术语(“过程”)。本领域技术人员将理解在特定情况下意图使用的含义,并且还将理解(在专利法意义上的)给定的要求保护的过程或方法有时可以使用一个或多个过程或方法(在计算科学意义上)而被实现。

与没有自动化相反,“自动地”意味着利用自动化(例如,通过软件被配置的、用于本文中讨论的特定操作和技术效果的通用计算硬件)。特别地,“自动地”执行的步骤虽然可以由人类发起或由人类以交互方式引导,但它们并不手动地在纸上或在人的思想中被执行。自动步骤利用机器执行,以便获取不利用如此提供的技术交互就不能够实现的一个或多个技术效果。

本领域技术人员理解,技术效果是技术实施例的推定目的。例如,在一个实施例中涉及计算,并且一些计算也可以在没有技术组件(例如,通过纸和铅笔,或者甚至作为精神步骤)的情况下执行,这一事实并不去除技术效果的存在或更改实施例的具体和技术性质。诸如以下的操作在本文中应当被理解为是固有地数字化的:接收源代码更新提交以供包括在构建或者存储库中、确定源代码由测试套件覆盖的程度、标示诸如代码更新提交和测试集的数字工件、以及执行代码。人的思想不能直接与CPU或其他处理器或与RAM或其他数字存储装置进行对接,以读取和写入必要的数据来执行本文中所教导的软件测试保证步骤。自动化程序测试存在的一个原因-或许是主要原因-是因为单凭仅使用脑力过程或者纸笔的手动测试实际上对当今的商业软件开发工作量严重不足。鉴于本公开,本领域技术人员将很好地理解这一点,但是有时可能需要将事实告知或提醒其他人。除非另有说明,否则假设实施例能够在商业的生产环境中或在生产环境的测试实验室中大规模地操作(即,对来自一百个或更多个被监视设备的事件数据进行操作),而不是单纯的思想实验。

“计算性地”同样表示计算设备(至少是处理器加存储器)正在被使用,并且排除了仅凭人类思想或仅凭人类行动获取的结果。例如,如本文中理解的,用纸和铅笔进行算术不是计算性地进行算术。计算结果更快、更广泛、更深入、更准确、更一致、更全面和/或以其他方式提供超出了仅人类执行范围的技术效果。“计算性步骤”是计算性地执行的步骤。“自动地”或“计算性地”都不必意味着“立即”。“计算性地”和“自动地”在本文中可互换使用。

“主动地”意味着没有来自用户的直接请求。实际上,在步骤的结果已经被呈现给用户之前,用户甚至可能没有意识到实施例的主动步骤是可能的。除非另有说明,否则本文中描述的任何计算性的和/或自动的步骤也可以主动地完成。

贯穿本文档,可选的复数“(多个)”的使用意味着存在一个或多个所指示的特征。例如,“(多个)处理器”意味着“一个或多个处理器”或等效地“至少一个处理器”。

出于美国法律和实践的目的,在权利要求或其他地方使用本文中的“步骤”一词并不旨在调用部件加功能、步骤加功能或35美国法典第112条第六款/第112(f)条权利要求解释。特此明确驳斥对此种效果的任何推定。

出于美国法律和实践的目的,除非权利要求使用短语“用于...的部件(meansfor)”,否则它们并不意图援引部件加功能的解释。旨在被解释为部件加功能语言的权利要求语言(如果有的话)将通过使用短语“用于...的部件”来明确叙述该意图。当采用部件加功能的解释时,无论是通过使用“用于...的部件”和/或通过法院对权利要求语言的法律解释,说明书中针对给定名词或给定动词列举的部件应当被理解为与权利要求语言链接在一起并且在此通过以下任何方式链接在一起:出现在附图框图中相同框内,由相同或相似名称表示,由相同附图标记表示,在任何附图中描述功能关系,在本公开文本中指出了功能关系。例如,如果权利要求限制中记载了“zac小部件”,并且该权利要求限制受制于部件加功能的解释,则至少在说明书中任何图块、段落或示例中提到“zac小部件”的任何地方标识的或由分配给zac小部件的任何附图标记绑在一起,或被公开为与zac小部件的结构或操作具有功能关系的所有结构,将被认为是zac小部件的应用中标识的结构的一部分,并且将有助于定义zac小部件结构的等效集合。

贯穿本文档,除非另有明确说明,否则对过程中的步骤的任何引用都假定该步骤可以由感兴趣的一方直接执行,和/或由一方通过干预机制和/或干预实体间接执行,并且仍然落入该步骤的范围内。即,除非直接执行是明确说明的要求,否则该步骤不需要由相关方直接执行。例如,涉及感兴趣的一方的关于目的地或其他主题的动作(诸如接受、查明、断言、保证、构建、检查、通信、覆盖、确定、辨别、显示、执行、标示、生成、调用、通知、拉取、读取、接收、报告、驻留、测试、更新、警告(和接受、被接受、查明、被查明等))的步骤可以涉及另一方的干预动作(诸如转发、复制、上传、下载、编码、译码、压缩、解压缩、加密、解密、认证、调用等),但仍应当被理解为直接由感兴趣的一方执行。

每当引用数据或指令时,应当理解,例如,这些项配置计算机可读存储器和/或计算机可读存储介质,从而将其转换为特定物品,与简单地存在于纸上、在一个人的思想中,或者仅仅是信号在电线上传播相反。出于美国专利保护的目的,根据美国专利商标局(USPTO)在In re Nuijten案中的解释,存储器或其他计算机可读存储介质不是在可专利主题范围之外的传播信号、载波或仅能量。在美国,没有任何一项权利要求涵盖信号本身或仅能量,并且根据本公开,任何主张相反的权利要求解释都是不合理的。除非在美国以外地区授予的权利要求中另有明确说明,否则权利要求并不涵盖信号本身或仅能量。

此外,尽管本文中其他地方有明显相反的规定,但是应当理解一方面(a)计算机可读存储介质和计算机可读存储器与另一方面(b)传输介质(也被称为信号介质)之间的明显区别。传输介质是传播信号或载波计算机可读介质。相比之下,计算机可读存储介质和计算机可读存储器不是传播信号或载波计算机可读介质。除非在权利要求中另有明确说明,否则“计算机可读介质”意味着计算机可读存储介质,不是传播信号本身,也不是仅能量。

本文中的“实施例”是示例。术语“实施例”不能与“本发明”互换。实施例可以自由地共享或借用方面以创建其他实施例(只要结果是可操作的),即使本文中本身未明确描述方面的所得组合。对于本领域技术人员而言,要求明确和个体地描述的每个许可组合是不必要的,这与承认专利说明书是为本领域技术人员编写的政策相反。关于即使由少量可组合特征产生的可能组合的数目的形式化组合计算和非正式的直觉也将表明,本文中描述的方面存在大量的方面组合。因此,要求每种和每一个组合的明确的叙述将与要求简明的专利说明书并且使读者对有关技术领域知识的政策背道而驰。

附图标记的列表

提供以下列表是为了方便和支持附图以及作为说明书的文本的一部分,其通过参考多个项来描述创新。尽管如此,这里未列出的项仍可以是给定实施例的一部分。为了使文本更清晰易读,在文本中一些(而非全部)引用项附近叙述了给定附图标记。可以参考给定项的不同示例或不同实例使用相同的附图标记。附图标记的列表是:

100:操作环境,也被称为计算环境

102:计算机系统,也被称为计算性系统或计算系统

104:用户

106:外围设备

108:网络,通常包括例如LAN、WAN、软件定义的网络以及其他有线或无线网络

110:处理器

112:计算机可读存储介质,例如RAM、硬盘

114:可移除的经配置的计算机可读存储介质

116:指令,利用处理器可执行;可以在可移除存储介质上,或在其他存储器(易失性或非易失性或两者)中

118:数据

120:(多个)内核,例如,(多个)操作系统、BIOS、UEFI、设备驱动

122:工具,例如,防病毒软件、防火墙、分组嗅探器软件、入侵检测系统(IDS)、入侵预防系统(IPS)、调试器、剖析器、编译器、解译器、静态代码分析工具、软件开发工具和工具套件、硬件开发工具和工具套件、诊断

124:应用,例如,文字处理器、web浏览器、电子表格、游戏、电子邮件工具

126:显示屏,也被称为“显示器”

128:未以其他方式与附图标记106、108、110、112、114相关联的计算硬件

202:利用软件测试保证技术而被增强的计算系统

204:软件测试保证代码

206:软件测试保证代码的用户界面

208:工具链,例如,可以共同地将源代码转换为可执行代码的一个或多个软件开发工具122

210:集成开发环境

212:对可扩展开发工具的扩展

214:可扩展开发工具,例如,Visual

216:(作为副本直接地或者凭借值针、索引或其他引用间接地)包含已更新的源代码的提交;还可以包含诸如时间戳、数字签名、作者名称、以及附注的其他数据;提交的一些示例包括(a)拉取请求,(b)向源代码版本控制系统的提交,无论其是使用HTTP、HTTPS还是另一网络协议,(c)向不包括同行审阅和评论步骤的源代码版本控制系统的提交,以及(d)向工具链的提交

218:提交216的包含已更新的源代码的部分;还可以包括未被更新的邻近代码或周围代码

220:源代码

222:对源代码的更新;可以采取文本插入、文本删除、文本替换、或者其混合的形式;除非另有指示,否则“更新”是体现文本插入、文本删除、或者文本替换的源代码行的集合,即使不是讨论中的行的每个字符都被从源代码的先前版本改变,但是不包括在其中未做出改变的源代码的行

224:接受状况,例如,针对同行审阅而被接受/被拒绝、针对包括在存储库中而被接受/被拒绝、或者针对被包括在构建中而被接受/被拒绝;

226:标记,例如,位、枚举值、整数值、或者指示例如测试保证是否存在、或不存在、或在审阅中的其他离散值

228:与测试保证有关的项,例如,代码更新提交216、提交的代码部分218、或者用于测试代码的测试或测试集232

230:可用于软件的自动化测试的测试套件

232:测试集,即,测试套件内的一个或多个特定的测试

234:测试覆盖报告工具,例如,Coverage.py、EMMA、JaCoCo、Serenity BDD、Clover

236:测试覆盖报告

238:自动化测试管理工具,例如,

240:一般地,计算系统硬件,例如,(多个)处理器110、存储器112、(多个)屏幕126、其他硬件128、以及未具体编号但是仍然在本文中所教导的其他硬件

242:通知或警告

244:时间戳

300:代码覆盖的种类

302:通过自动化测试的代码覆盖

304:函数覆盖,即,代码中的每个函数或其他子例程已经被调用的程度

306:决策覆盖,即,代码中的入口点和出口点已经被调用至少一次的程度,以及代码中的哪些决策对所有可能的结果做出了至少一次

308:语句覆盖,即,代码中的每个语句已经被执行的程度

310:有限状态机覆盖,即,代码中实现有限状态机的每个状态已经被达到的程度

312:分支覆盖,即,代码中的控制结构中的每个分支已经被执行的程度;控制结构的示例包括if-then语句、switch语句或case语句以及跳转表

314:入口/出口覆盖,即,代码中的子例程的每个入口(例如,调用)和出口(例如返回)已经被执行的程度

316:路径覆盖,即,通过代码的每个路径已经被执行的程度

318:数据流覆盖,即,每个变量定义和其用途已经被达到的程度

320:条件覆盖,即,代码中的布尔子表达式已经被评估为真和假两者的程度

322:循环覆盖,即,在代码的执行期间每个循环已经被执行零次、一次以及多于一次的程度

400:图示源代码220和测试232可以结合程序错误修复和特征改变而被处置的不同方式的场景

700:软件测试保证方法;也指图示这样的方法的流程图

702:接收代码更新提交

704:接收代码更新提交的已更新的代码部分

706:确定已更新的源代码部分218至少部分地由测试集覆盖

708:查明是否测试集已经改变

710:标识测试集中的变化的源代码影响区域

712:测试集中的变化的影响区域

714:标示一个或多个项;也称为设定标记

716:指示缺乏充分的测试覆盖存在的保证

718:避免标示任何项;也称为避免设定标记

800:流程图

802:保证软件测试被优化

804:软件测试(自动化的,除非另有说明)

806:利用软件测试来覆盖代码

808:接受针对一个或多个开发活动的已更新的源代码

810:在存储库中包括源代码

814:源代码的同行审阅

816:使用源代码来构建可执行文件

820:生成代码覆盖报告

822:通过一个或多个测试集检查代码覆盖

824:读取覆盖报告

826:断言值或值的相等性作为代码测试的一部分

828:接收拉取请求

830:拉取请求

832:调用工具,例如,覆盖报告工具或其他工具

834:与工具(例如,测试管理工具或其他工具)数字地通信

836:显示通知或者警告,例如,在屏幕上或者在列表或打印输出中,或者在文件中放置通知或警告,或者传输通知或警告;也指被称为通知或警告的动作

838:驻留在软件开发工具链中,例如,在工具链的工具内

840:检查时间戳

842:辨别对源代码的一行或多行的测试的相关性

844:拒绝已提交的代码

902:存储库,例如,支持开发人员之间的协作和提供版本控制的存储库;提供源针对源代码和开发项目托管的服务的最广泛地被使用的基于web的存储库中的一些基于web的存储库包括

操作环境

参考图1,用于实施例的操作环境100包括至少一个计算机系统102。计算机系统102可以是多处理器计算机系统,也可以不是。操作环境可以包括给定计算机系统中的一个或多个机器,这些机器可以在云中被聚类、被进行客户端服务器联网和/或被进行对等联网。个体机器是计算机系统,一组协作机器也是计算机系统。给定计算机系统102可以被配置成用于例如具有应用的最终用户、用于管理员、用作服务器、用作分布式处理节点和/或以其他方式来配置。

人类用户104可以经由键入的文本、触摸、语音、移动、计算机视觉、手势和/或其他形式的I/O,通过使用显示器、键盘和其他外围设备106与计算机系统102交互。屏幕126可以是可移除的外围设备106,或者可以是系统102的组成部分。用户界面可以支持实施例与一个或多个人类用户之间的交互。用户界面可以包括命令行接口、图形用户界面(GUI)、自然用户界面(NUI)、语音命令界面和/或其他用户界面(UI)呈现,它们可以作为不同的选项被呈现或者可以被集成。

系统管理员、网络管理员、云管理员、安全人员、操作人员、开发人员、测试者、工程师、审计员和最终用户均是特定类型的用户104。代表一个或多个人的自动化代理、脚本、回放软件等也可以是用户104,例如,以支持测试系统102。在一些实施例中,存储设备和/或联网设备可以被视为外围设备,而在其他实施例中,可以被视为系统102的一部分,这取决于它们与处理器110的可分离性。例如,图1中未示出的其他计算机系统可以使用经由网络接口设备到网络108的一个或多个连接,以技术性方式与计算机系统102或与另一系统实施例交互。

每个计算机系统102包括至少一个处理器110。与其他合适的系统一样,计算机系统102也包括一个或多个计算机可读存储介质112。存储介质112可以具有不同的物理类型。存储介质112可以是易失性存储器、非易失性存储器、就地固定介质、可移除介质、磁性介质、光学介质、固态介质,和/或其他类型的物理持久性存储介质(与仅传播信号或仅能量相反)。特别地,当被插入或以其他方式被安装时,经配置的存储介质114(诸如便携式(即,外部的)硬盘驱动器、CD、DVD、存储棒或其他可移除非易失性存储介质)可以在功能上成为计算机系统的技术性部分,使其内容可访问,以供与处理器110交互并且由处理器110使用。可移除的经配置的存储介质114是计算机可读存储介质112的示例。计算机可读存储介质112的其他一些示例包括内置的RAM、ROM、硬盘以及由用户104不易随时可移除的其他存储器存储设备。为了符合当前的美国专利要求,在美国待决或批准的任何权利要求下,计算机可读介质、计算机可读存储介质,或计算机可读存储器都不是信号本身,或者仅能量。

例如,存储介质114配置有由处理器110可执行的二进制指令116;“可执行”在本文中在广义上被用以包括例如机器代码、可解释代码、字节代码,和/或在虚拟机上运行的代码。存储介质114还配置有数据118,数据118通过指令116的执行而被创建、被修改、被引用,和/或以其他方式用于技术效果。指令116和数据118配置它们驻留在其中的存储器或其他存储介质114;当该存储器或其他计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118也配置该计算机系统。在一些实施例中,数据118的部分代表现实世界项,诸如产品特性、库存、物理测量、设置、图像、读数、目标、体积等等。这种数据还通过备份、还原、承诺(commit)、中止、重新格式化,和/或其他技术性操作而被转换。

给定的操作环境100可以包括集成开发环境(IDE)210,IDE 210向开发人员提供一组协调的计算技术开发工具,诸如编译器、源代码编辑器、剖析器、调试器、布局工具、模拟器等。特别地,用于一些软件开发实施例的合适的操作环境中的一些合适的操作环境包括或者帮助创建被配置为支持程序开发的

尽管实施例可以被描述为由计算设备(例如,通用计算机、服务器,或集群)中的一个或多个处理器执行的软件指令来实现,但是这种描述并不意味着穷尽所有可能的实施例。本领域技术人员将理解,相同或相似的功能性通常也可以直接在硬件逻辑中全部或部分地被实现以提供相同或相似的技术效果。备选地,或除了软件实现以外,本文中描述的技术功能性可以至少部分地由一个或多个硬件逻辑组件执行。例如,并且在不排除其他实现的情况下,实施例可以包括硬件逻辑组件110、128,诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、系统片上组件(SOC)、复杂可编程逻辑设备(CPLD)和类似组件。例如,实施例的组件可以基于实施例的组件的输入、输出,和/或它们的技术效果而被聚集成多个交互功能模块。

除了处理器110(例如,CPU、ALU、FPU和/或GPU)、存储器/存储介质112和显示器126以外,操作环境还可以包括其他硬件128,例如,诸如电池、总线、电源、有线和无线网络接口卡。名词“屏幕”和“显示器”在本文中可互换使用。显示器126可以包括一个或多个触摸屏、响应于来自笔或平板电脑的输入的屏幕,或仅操作用于输出的屏幕。在一些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、平板电脑、麦克风、扬声器、运动传感器等)的外围设备106将被呈现为与一个或多个处理器110和存储器进行可操作的通信。

在一些实施例中,系统包括通过有线或无线的网络108连接的多个计算机。联网接口设备128可以使用例如可以存在于给定的计算机系统中的网络组件(例如,分组交换网络接口卡、无线收发器或电话网络接口)来提供对网络108的访问。联网接口设备和诸如交换机或路由器或防火墙的其他网络组件的虚拟化也可以存在于例如软件定义的网络或沙盒的或其他安全云计算环境中。给定的实施例还可以通过直接存储器访问、可移除非易失性存储介质或其他信息存储-取回和/或传输方法来传送技术数据和/或技术指令。

本领域技术人员将理解,本文中在“操作环境”中呈现的前述方面和其他方面可以形成给定实施例的一部分。本文档的标题并不旨在将特征严格分类为实施例和非实施例特征集。

一个或多个项在附图中以轮廓形式被示出,或者在括号内被列出,以强调它们不一定是所示操作环境的一部分或所有实施例的一部分,而是可以与操作环境中的项或本文中讨论的一些实施例互操作。在任何附图或任何实施例中,并不遵循非轮廓或括号形式的项是必需的。特别地,图1为了方便起见而被提供;在图1中包括项并不表示该项或该项的描述用途是在本发明之前已知的。

关于系统的更多信息

本文提供了示例以帮助说明技术的各个方面,但是本文档内给出的示例并未描述所有可能的实施例。实施例不限于本文提供的特定实现、布置、显示、特征、方法或场景。给定的实施例可以包括例如附加的或不同的技术特征、机制、序列、数据结构或功能性,并且可以以其他方式脱离本文提供的示例。

图1-图6图示了适用于本文中所教导的实施例的一些架构的各方面。特别注意图2,系统102可以通过本文中所描述的一个或多个软件测试保证功能性而被增强,以产生或者利用测试保证增强的系统202。增强的系统202至少包括测试保证代码204,测试保证代码204根据本文中所提供的至少一个示例操作。保证代码204包括用户界面206或者与用户界面206通信;GUI和其他示例用户界面技术在本文中其他地方被讨论。例如,保证代码204可以驻留在开发工具链208、集成开发环境210、开发工具214或者开发工具扩展212中。技术人员将理解,项208、210、212、214和122不一定是互斥的,例如,给定的工具122可以是IDE 210中的开发工具214。

在该示例中,增强的系统202接收或者以其他方式包括可以包含不同部分(例如,路由部分、授权部分、历史部分、时间戳244等)的代码更新提交216。特别地,代码更新提交215具有直接或间接地包括源代码220的部分218。该源代码的至少一部分相对于源代码的先前部分被更新;代码更新提交216的主要角色是提交更新222以供包括在源代码的主体中。在实践中,一些已提交的源代码可以不具有相关联的测试232,但是本公开对涉及已更新的源代码和来自测试套件230的相关联的测试集232两者的情形特别感兴趣,测试集230可以被用于以某种方式在某种程度上自动地测试已提交的源代码的至少一部分。

在该示例中,提交216的关于一个或多个工作流状态的接受状况224可以在变量或者其他数据结构中被跟踪。例如,给定的状况224可能指示提交已经被接收并且被排队以供分析,或者提交正在经历代码覆盖分析以辨别相关联的测试集(如果有)232的哪些部分与源代码中通过对提交的完全接受而将被做出的改变222有关。更一般地,接受状况224可以指示本文中所讨论的任何工作流或其他过程中的任何位置。当工作流断定与更新222有关的测试集232自身还未被更新时,表示该结论的标记226可以在一个或多个项228上被设定,例如,标记可以在提交自身上、在提交中的源代码上、在测试集上、或者其组合上被设定。

在该示例中,增强的系统202包括覆盖报告工具234或者与覆盖报告工具234通信,覆盖报告工具234生成覆盖报告236,覆盖报告236指示已提交的源代码220被相关联的测试套件测试232覆盖的程度。覆盖报告可以简单地指示代码的哪一行或哪些行被测试覆盖。但是在一些实施例中,覆盖报告还指示或者备选地指示哪个种类300的代码覆盖302由与已提交的代码相关联的测试232提供。

图3图示了代码覆盖302的若干种类,其在附图标记的列表中被定义,包括函数覆盖304、决策覆盖306、语句覆盖308、有限状态机覆盖310、分支覆盖312、入口/出口覆盖314、路径覆盖316、数据流覆盖318、条件覆盖320、以及循环覆盖322。在本文所讨论的测试的单个种类的代码覆盖被指示、但是哪个种类300未被明确说明的状况中,语句覆盖308被假定。

在该示例中,增强的系统202还与自动化测试管理工具238通信或者包括自动化测试管理工具238。尽管在图2中测试管理工具238和测试报告工具234在不同的框中被描绘,但是那些功能性可以例如被组合成单个工具122或者是给定工具链208中协调的模块。

图2还示出通知242。由于缺乏空间,图2没有也明确示出警告242,但是其也可以在增强的系统202的保证代码204中存在或者由增强的系统202显示。通知向用户提供关于输入的结论或状况,例如,通知可以报告接受状况或标记。通知不一定是负面的。相反,警告是一种指示错误、或者指示存在或者被认为可能存在开发上不想要的约束的通知。例如,警告可以告诉用户提交的代码更新222将不被拉取到存储库中,直到已更新的测试232被提交并且针对代码更新222被执行为止。

图4-图6图示了若干场景400,在场景400中,源代码220和相关联的测试集232可以在某种程度上被更新,范围从完全没有到充分被更新到完全被更新。其他场景也是可能的;此处所讨论的示例不是全面的。而且,尽管一些实施例在一些情形中针对代码更新的接受而要求测试更新,但是,一般情况下对测试集232的更新不一定在此处所呈现的每个实施例下是强制的,既不在某个种类的测试更新是强制的的意义上,也不在提供特定种类300的代码覆盖302的测试更新是强制的的意义上,也不在提供特定程度的代码覆盖302的测试更新是强制的的意义上。

例如,项目管理领域技术人员将认识到对测试集的更新是实施例的一种可能的技术效果,但不是仅有的可能的技术效果。技术风险的知情的接受是另一种技术效果,例如,开发人员可以被通知以下被检测到的风险:鉴于源代码更新的测试更新是谨慎的,但是然后开发人员决定接受程序错误已经被引入或者保留在已更新的代码中的风险,并且不管对技术风险知情而选择继续利用已更新的代码。

考虑到前述上下文,图4图示了七个场景400,表示为场景A至场景G以供引用。这些场景不以任何特定次序被列出,并且如以上所指出的,不作为涉及对源代码的更新、或者对针对该源代码的相关联测试的更新、或者两者的所有场景的全面的集合而被呈现。图7图示了和图4相同的七个场景,但是使用理想化的源代码。理想化的源代码被图形地使用点和线段来描述,而不是源代码文本,以强调本讨论不限于任何特定的编程语言。

图5示出了源代码220的理想化的部分,以图示源代码可以被更新的不同方式。为方便引用,图5中理想化源代码在其中被列出的行被编号(1)至(4),但是本文中的教导也适用于没有这样被安排在行的列中的源代码。图5的左侧示出了产生更新的编辑之前的源代码,并且图5的右侧示出了编辑已经被做出之后的代码。左侧上的行(1)中的源代码未被编辑;其在右侧的代码的已更新部分中与其在左侧的代码的先前版本中是相同的。左侧上的行(2)中的代码也未被编辑。左侧上的行(3)中的代码占据右侧上的行(4),因为一个新的代码行已经在其上方被插入。新的代码行在右侧上被表示为四个连续点。该图中所使用的点的数目对本文中所呈现的教导不重要。通过插入文本、或者删除文本、或者替换文本、或者其某种组合,左侧上的行(3)中的源代码已经被编辑。该经编辑的代码在右侧上被表示为七个连续点。再次地,该图中所使用的点的数目对本文中所呈现的教导不重要。左侧上的行(4)中的代码已经通过编辑而被删除,因此其在右侧上不具有表示它的对应的点或者线段。简而言之,如图5所示,使用文本插入、文本删除、文本替换或其组合,对源代码的更新可以被实现,并且更新不一定改变提交的代码部分218中的每个代码行。

鉴于图4和图5,图6可以被理解为示出以下场景。在每个场景中,仅有一部分的源代码(被描绘为点)已经被更新。在场景A中,已改变的测试提供对源代码的整个已提交的部分218的至少一些覆盖。在场景B中,源代码的整个已提交的部分218再次被测试覆盖,但是那些测试还未被更新。在场景C中,已更新的测试提供对源代码的已提交的部分218的已更新的部分的至少一些覆盖;没有测试覆盖已提交的代码的未被更新的部分。在场景D中,未被更新的测试提供对源代码的已提交的部分218的已更新的部分的至少一些覆盖;没有测试覆盖已提交的代码的未被更新的部分。在场景E中,测试被更新,但是它们仅覆盖源代码的未被更新的部分。在场景F中,未被更新的测试覆盖源代码的未被更新的部分;没有测试覆盖已更新的源代码。在场景G中,没有测试覆盖已提交的源代码部分的任一部分。

在一些实施例中,场景A至场景G中的一个或多个场景被检测到,并且然后在除了A和C之外的每个场景中,该实施例通知用户其会谨慎更新测试套件230以覆盖已提交的代码的至少已更新部分。在场景A和场景C中,该实施例确定对与已提交的源代码中的更新有关的测试的某种更新已经被做出,并且因此无警告被给出。

一些实施例使用或者提供计算系统202,计算系统2020可操作以支持软件测试保证。该示例系统包括处理器110、与处理器可操作地通信的存储器112以及保证代码204。在利用处理器的执行后,保证代码204执行软件测试保证方法,该软件测试保证方法包括接收在此处被表示为“S-当前”的代码更新提交216。提交“S-当前”包括此处被表示为“P-当前”的部分218,其转而包括对源代码220的更新222。软件测试保证方法还包括确定部分“P-当前”至少部分地被测试套件230的测试集232(此处被表示为“TS-当前”)覆盖。软件测试保证方法还包括查明测试集“TS-当前”是否与测试集“TS-在前”不同,“TS-在前”至少部分地覆盖代码更新提交“S-在前”的部分“P-在前”。在该上下文中,“S-在前”比“S-当前”旧,并且“P-当前”更新“P-在前”。软件测试保证方法还包括:当该查明查明了“TS-当前”没有与“TS-在前”不同时,基于“TS-当前”测试集来标示至少一个项228以指示针对“P-当前”更新的测试保证的缺乏。该标示设定以下至少一项的标记:“S-当前”、“P-当前”或“TS-当前”。

在一些实施例中,系统202包括集成开发环境210,并且保证代码204至少部分地驻留在集成开发环境中。

在一些实施例中,系统202包括可扩展软件开发工具214,并且保证代码204至少部分地驻留在可扩展软件开发工具的扩展212中。当扩展212被功能性地安装在可扩展软件开发工具中时,保证代码204也相应地驻留在可扩展的软件开发工具中。

在一些实施例中,测试集232“TS-当前”驻留在系统202中,并且测试集“TS-当前”包括将由“P-当前”的至少一部分的执行产生的值的断言。作为这样的断言的示例,本文中在别处所详述的PQ()函数接受表示月份的整数值,并且返回指示该月份在哪个日历季度中的字符串;“PQ”代表“打印季度(Print Quarter)”。若干相关联的断言测试232中的一个相关联的断言测试断言PQ(2)等于“第一季度”,因为2表示二月,并且二月在日历年的第一季度中。

在一些实施例中,系统202被配置为要求由保证代码204设定的任何标记226在部分“P-当前”被接受之前被解析。这自然导致了被接受意味着什么的问题。在一些实施例中,部分218被接收意味着以下至少一项:该部分被接收以供包括在存储库中,该部分被接受以供同行审阅,或者该部分被接受以供包括在构建中。

在一些实施例中,系统202还包括由覆盖报告工具234生成的覆盖报告236。覆盖报告表示由测试集“TS-当前”对源代码的至少一部分的测试覆盖302。在一些实施例中,系统202还包括或者备选地包括覆盖报告工具234自身。覆盖报告工具234可执行来检查由测试集232“TS-当前”对源代码220的至少一部分218的测试覆盖302。

本文还描述了其他系统实施例,或者直接或者衍生为所描述的方法或经配置的介质的系统版本,这通过本文对计算硬件的扩展讨论来进行通知。

方法

图7图示了用于优化软件测试保证的方法700。增强的系统或其他设备或位置接收702代码更新提交,该代码更新提交特别地包括:接收704包含某个源代码的提交的部分,该源代码的至少一部分是已更新的源代码。所图示的方法确定706该源代码部分至少部分地被测试套件覆盖。例如,这可以包括确定图6的场景A至F中的一个场景适用,如与场景G相反的。所图示的方法查明相关的测试集是否与先前的版本不同,换言之,与该源代码部分有关的测试集是否已经改变。这可以包括标识测试集差异的影响区域712或者被与之联合。图6以虚线的形式图示了若干不同的影响区域,如由图6中的图例所指示的,其将被包围在虚线中的区域联系到“已改变的测试覆盖”。将注意返回到图7,所图示的方法或者标示714(多个)项以指示716在由该部分、更新、以及测试集版本限定的特定的上下文中的测试保证的缺乏,或者否则所图示的方法避免718设定这样的标记。

除非另外指示,否则将由例如用保证代码204而被增强的工具自动地执行附图中所示或以其他方式公开的技术方法。在牵涉到人类管理员或其他人类的行动的范围内,方法也可以部分地自动并且部分地手动地被执行,例如,输入命令以向存储库提交源代码的部分或者使用已更新的源代码构建项目可执行文件。本文中被预期为创新的方法都不是完全手动的。在给定的实施例中,方法的零个或更多个所图示的步骤可以被重复,也许利用不同的参数或数据来进行操作。实施例中的步骤还可以按照与图7和图8中所示的从上到下的顺序不同的顺序来完成。步骤可以顺序地、以部分地重叠的方式或完全并行地被执行。特别地,流程图800项被遍历以指示在方法期间所执行的步骤的顺序可以从方法的一种执行到方法的另一种执行而变化。遍历顺序也可以从一个方法实施例到另一方法实施例变化。步骤也可以被省略、组合、重命名、重新组合、在一个或多个机器上被执行,或者以其他方式脱离所示流程,只要所执行的方法可操作并且符合至少一个权利要求。

一些实施例使用或提供用于软件测试保证的方法。该方法包括电子地接收702代码更新提交“S-当前”,代码更新提交“S-当前”包括部分“P-当前”,部分“P-当前”具有源代码的一行或多行,部分“P-当前”包括对源代码的更新。该方法还包括自动地确定706源代码的部分“P-当前”至少部分地由测试套件的测试集“TS-当前”覆盖。该方法还包括自动地查明708测试集“TS-当前”是否与测试集“TS-在前”不同,“TS-在前”至少部分地覆盖代码更新提交“S-在前”的部分“P-在前”,其中“S-在前”比“S-当前”旧,并且其中“P-当前”更新“P-在前”。该方法还包括当该查明查明了“TS-当前”没有与“TS-在前”不同时,基于“TS-当前”测试集来自动地标示714至少一个项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏,并且以其他方式在“TS-当前”相对于“P-当前”没有与“TS-在前”不同的基础上避免718标示任何项,其中被标示的至少一个项包括以下至少一项:“S-当前”、“P-当前”、或者“TS-当前”。

在一些实施例中,其中该查明查明了“TS-当前”与“TS-在前”不同,该方法还包括辨别842“TS-在前”与“TS-当前”之间没有与覆盖“P-当前”的任何测试有关的差异,并且然后标示714该项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏。

在一些实施例中,其中该查明查明了“TS-当前”与“TS-在前”不同,该方法还包括辨别842“TS-在前”与“TS-当前”之间没有与覆盖“P-当前”中的更新的任何测试有关的差异,并且然后标示714该项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏。

在一些实施例中,接收702代码更新提交“S-当前”包括接收828、702拉取请求830,即,包括针对将被拉取到存储库902中的部分“P-当前”的请求的数据结构,存储库902包含项目、应用、程序或依赖于源代码编译或解译来提供功能性的其他工件的源代码。

在一些实施例中,确定706源代码的部分“P-当前”至少部分地由测试集“TS-当前”覆盖包括:读取824由覆盖报告工具生成的覆盖报告,例如,通过打开包含报告的文件并且解析文件的内容,或者通过接收并且解析包含关于测试覆盖302的XML数据结构或另一种数字数据结构。在一些实施例中,确定706源代码的部分“P-当前”至少部分地由测试集“TS-当前”覆盖包括:调用832覆盖报告工具并且与该覆盖报告工具通信834,以检查由测试集“TS-当前”对源代码的至少一部分的覆盖。

在一些实施例中,查明708测试集“TS-当前”是否与测试集“TS-在前”不同包括检查840测试集“TS-当前”的时间戳。在一些中,查明708包括调用832自动化测试管理工具并且与自动化管理工具通信834,该自动化管理工具跟踪至少测试集“TS-当前”。

在一些实施例中,其中至少一个项被标示,该方法还包括通过显示通知242来通知836用户,通知242指示源代码的行至少部分地由测试覆盖,但是由于该测试不一定提供完全覆盖,其应当被审阅。在一些实施例中,该方法包括显示836列出代码覆盖302的以下种类中的至少两个种类的通知242:函数覆盖304、语句覆盖308、分支覆盖312、条件覆盖320、决策覆盖306、路径覆盖316、入口/出口覆盖314、循环覆盖322、有限状态机状态覆盖310或者数据流覆盖318。其他实施例显示这些种类的代码覆盖的恰当的子集,例如,仅语句覆盖和分支覆盖,或者单独地仅函数覆盖。

经配置的存储介质

一些实施例包括经配置的计算机可读存储介质112。存储介质112可以包括盘(磁的、光学的等)、RAM、EEPROM或其他ROM、和/或其他可配置的存储器,特别是包括计算机可读存储介质(不是仅传播的信号)。特别地,被配置的存储介质可以是可移除存储介质114,诸如CD、DVD或闪存。通用存储器(其可以是可移除或不可移除的、并且可以是易失性或非易失性的)可以使用以数据118和指令116形式的项(诸如测试保证代码204、接受状况数据结构224、标记226、覆盖报告236以及工具234、238)而被配置到实施例中,以形成经配置的存储介质,该项从可移除存储介质114和/或另一源(诸如网络连接)读取。经配置的存储介质112能够使计算机系统执行如本文所公开的用于软件测试保证以检测测试覆盖中的潜在缺失的步骤。因此,附图帮助说明经配置的存储介质实施例和过程实施例,以及系统和过程实施例。特别地,图7或图8中所示或本文另外教导的任何过程步骤都可以用于帮助配置存储介质以形成经配置的存储介质实施例。

一些实施例使用或者提供被配置为具有代码的存储介质112、114,在由一个或多个处理器的执行后,该代码执行软件测试保证方法,该软件测试保证方法包括:接收702代码更新提交“S-当前”,代码更新提交“S-当前”包括部分“P-当前”,部分“P-当前”包括已更新的源代码;确定706部分“P-当前”至少部分地由测试套件的测试集“TS-当前”覆盖;查明708测试集“TS-当前”是否与测试集“TS-在前”不同,“TS-在前”至少部分地覆盖代码更新提交“S-在前”的部分“P-在前”,其中“S-在前”比“S-当前”旧,并且其中“P-当前”更新“P-在前”;以及当该查明查明了“TS-当前”没有与“TS-在前”不同时,基于“TS-当前”测试集来标示714至少一个项以指示针对“P-当前”的测试保证的缺乏,并且以其他方式在“TS-当前”相对于“P-当前”没有与“TS-在前”不同的基础上避免718标示任何项,其中被标示的至少一个项包括以下至少一项:“S-当前”、“P-当前”、或者“TS-当前”。

在一些实施例中,接收702代码更新提交“S-当前”包括接收828拉取请求,该拉取请求包括针对将被拉取到存储库中的部分“P-当前”的请求。

在一些实施例中,其中该查明查明了708“TS-当前”与“TS-在前”不同,该方法还包括辨别842“TS-在前”与“TS-当前”之间没有与覆盖“P-当前”218的任一部分的任何测试有关的差异,并且然后标示714该项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏。

在一些实施例中,其中该查明查明了708“TS-当前”与“TS-在前”不同,该方法还包括辨别842“TS-在前”与“TS-当前”之间没有与覆盖“P-当前”中的更新222的任何测试有关的差异,并且然后标示714项以指示针对被包含在“P-当前”中的更新的测试保证的缺乏。

在一些实施例中,确定706源代码的部分“P-当前”至少部分地由测试集“TS-当前”覆盖包括:读取824由覆盖报告工具生成820的报告。

在一些实施例中,查明708测试集“TS-当前”是否与测试集“TS-在前”不同包括以下至少一项:检查840测试集“TS-当前”的时间戳,或者与自动化测试管理工具通信834。

在一些实施例中,至少一个项被标示714,并且该方法还包括通过显示以下通知来通知836用户:该通知指示“P-当前”源代码的至少一部分至少部分地由测试覆盖,但是由于该测试不一定提供完全覆盖,其应当被审阅。

附加示例和观察

本领域技术人员将认识到,满足诸如使能、书面描述或最佳模式的法律标准并非必需本公开的每一部分或其中的任何特定细节。而且,实施例不限于本文描述的特定编程语言、工具上下文、标识符、字段、类定义或其他实现选择。与任何其他专利公开的任何明显冲突,即使来自本发明的所有者,也没有解释本专利公开中提出的权利要求的作用。基于与本公开的所有部分相关的理解,提供了一些附加示例和观察。

驱动至少实施例中的至少一些实施例的一个见解是测试期间的代码覆盖并不总是等于代码的测试覆盖。因此,为了最佳的、可能是最大的测试保证,每个程序错误修复拉取请求830应当包括测试232变化。测试变化可以是新测试或者对现有测试的修改,以覆盖由程序错误修复解决的执行场景。基本的假设是存在一个测试漏洞(即,测试的缺乏,也称为测试缺失)因为在更早的测试中错过了该程序错误。即使作为该程序错误修复的一部分而正被修改的产品代码显露为使用现有测试而被覆盖,对现有测试集的新的测试或修改也是谨慎的,并且可能被要求覆盖执行场景。

以下代码和测试列表说明了在其中代码行被覆盖的实例,但其不一定覆盖所有的执行场景。该列表是行编号的以供引用,但是在实践中可能不具有这样的行编号。在该示例列表中,第02-15行可以作为已提交的代码部分218的示例,并且第01、16-26行可以作为测试集232的示例。第20行处的测试至少与第06-07代码行有关;其也可以被理解为与第04行有关,甚至是与第02行有关。类似地,第21行的测试至少与第08-09代码行有关;其也可以被理解为与第04行有关,甚至与第02行有关。所示的其他测试以类似的方式与代码行有关。

在该示例列表中,第06行有一个程序错误;它应该陈述“month<=3”而不是“month<3”。但是所使用的测试都是已通过的,并且具有该程序错误的行由测试集覆盖。如果开发人员修复了该程序错误,则如之前那样,测试将继续通过,并且在其上做出了修复的行将在代码覆盖报告中继续示出为被覆盖。然而,“月份=3”时的执行场景仍然没有被覆盖。通过应用本文中所呈现的教导,这样的拉取请求可以由系统标示,并且用户被要求添加针对该场景的测试覆盖。

一些实施例帮助降低或避免增加技术债,该技术债是由在没有对代码的彻底的自动化测试的情况下添加代码招致的。这可以在使用敏捷开发方法的项目中、或者在连续集成连续部署环境中尤其有益,因为当所涉及的代码在开发人员思想中是新鲜的,尚未被敏捷或CICD环境中所考虑的其他代码的快速流取代时,错误更容易修复,并且更有可能正确地被修复。类似地,当代码是新鲜的时,测试更可能被与测试中的代码很好地协调。

一些实施例使用或者提供软件测试保证方法,该软件测试保证方法包括接收828拉取请求830。该拉取请求包括源代码部分218,源代码部分218指示在存储库中将被改变的源代码。拉取请求还包括测试节(test section)232,测试节232指示与源代码相关联的自动化测试。在以上示例中,例如,源代码部分可以是第01-15行并且测试节可以是第16-26行。方法还包括查明708测试节是否指示对与源代码相关联的自动化测试的任何改变。当测试节指示对与源代码相关联的自动化测试的改变时,该方法包括接受808拉取请求,并且当测试节未指示对与源代码相关联的自动化测试的任何改变时,方法包括拒绝844拉取请求。

一些实施例如下操作。该实施例确定已提交的代码包括更新;这可以是隐式的,例如,凭借代码是拉取请求的一部分。例如通过使用一个或多个工具234、238,该实施例找到覆盖代码的测试。如果覆盖代码的测试还未改变,则该实施例设定714标记。如果覆盖代码的至少一个测试已经改变,则实施例不设定标记,至少尚不设定标记。在确定已改变的测试不与已提交的源代码的已更新部分相关之后,一些实施例可以还是设定标记。

特别地,一些实施例识别其中至少一个测试已经改变、但是该改变不与已提交的代码中的任何代码有关的情形,并且即使测试已经发生也设定标记。例如,如果感兴趣的代码部分是部分A,并且测试覆盖部分A、B和C,并且测试中的改变仅与B和C有关而不与A有关,则这可以发生。一些实施例识别其中至少一个测试已经改变,但是该改变不与已提交的代码中的(多个)已更新的行有关的情形。因此,即使测试改变并且即使该改变与部分“P-当前”的一部分有关,该实施例也设定标记。例如,如果部分“P-当前”具有第1-10行,更新在部分“P-当前”的第1行中,测试覆盖第1-10行,并且测试中的改变仅与第3行有关但是不与第1行有关,则这可以发生。

一些附加的组合和变型

代码、数据结构、逻辑、组件、通信和/或它们的功能等效物的这些组合中的任何组合也可以与上述任何系统及其变型组合。过程可以以可操作的任何子集或组合或序列包括本文中描述的任何步骤。每个变型可以单独出现,或者可以与任何一个或多个其他变型组合出现。每个变型可以与任何过程一起出现,并且每个过程可以与任何一个或多个其他过程组合。每个过程或过程的组合(包括变型)可以与上述经配置的存储介质组合和变型中的任一组合。

结论

简而言之,受益于本文提供的教导,实施例可以被用来检测开发中的软件的自动化测试中可能的漏洞。通过测试232完全行覆盖不一定指示执行场景的实际覆盖,例如,即使当所有源代码语句名义上被覆盖308时,条件覆盖320、决策覆盖306、以及其他种类的执行场景覆盖302也可能是缺乏的。当源代码改变222被提交、并且对应的测试集保持未改变时,用户104被通知836充分的测试804未由当前测试集保证。开发工具链208中的测试保证代码204可以标示714项228(诸如拉取请求830、216、测试集232、或提交216的源代码220)以指示716测试保证的缺乏。在一些情况下,例如,作为源代码被接受808以供包括810在存储库902或构建816中的先决条件,或者甚至是作为同行审阅814的先决条件,保证增强的工具122、208、210、214、202可以要求新测试或者不同的测试与已更新的源代码一起被提供。即,源代码处置和对应的测试集的不一致被标记,并且引起开发人员、测试者以及其他用户的注意,以或者通过获取已更新的测试来降低测试漏洞的风险,或者通过在源代码更新在工作流中前进之前获得知情同意来管理该风险。

尽管在本文中将特定实施例明确地示出和描述为过程、经配置的存储介质或系统,但是应当理解,对一种类型的实施例的讨论通常还扩展到其他实施例类型。例如,结合图7和图8进行的过程的描述也有助于描述经配置的存储介质,并且有助于描述与结合其他附图所讨论的那些类似的系统和制造的技术效果和操作。并非遵循,必须将来自一个实施例的限制读入另一实施例。特别地,过程不必限于在讨论诸如经配置的存储器的系统或制造时所呈现的数据结构和布置。

本领域技术人员将理解,实现细节可以与特定代码有关,诸如特定API、特定字段、特定种类的组件和特定样本程序,并且因此不需要在每个实施例中都出现。本领域技术人员还将理解,在讨论细节时使用的程序标识符和一些其他术语是特定于实现的,并且因此不需要与每一个实施例有关。尽管如此,虽然这里不一定要求它们存在,但是这种细节可以通过提供上下文来帮助一些读者,和/或可以说明本文中讨论的技术的很多可能的实现中的一些实现。

本文中对具有一些特征X的实施例的引用以及本文中其他地方对具有一些特征Y的实施例的引用并不排除同时具有特征X和特征Y的实施例,除非本文中明确指出了这种排除。所有可能的否定权利要求限制都在本公开的范围内,因为即使在本文中的任何示例中未给出特定排除,也可以将被规定为实施例的一部分的任何特征从其他实施例中明确删除。术语“实施例”在本文中仅用作“过程、系统、制品、经配置的计算机可读存储介质和/或以与适用法律相一致的方式应用的本文中的教导的其他示例”的更方便形式。因此,给定“实施例”可以包括本文中公开的特征的任何组合,只要该实施例与至少一个权利要求相一致。

在每个实施例中,并非图中所示的每个项都需要存在。相反,实施例可以包含未在图中明确示出的(多个)项。尽管这里通过特定示例在文本和附图中示出了一些可能性,但是实施例可以脱离这些示例。例如,示例的特定技术效果或技术特征可以被省略、重命名、不同地聚集、重复、在硬件和/或软件中不同地实例化,或者是出现在两个或更多个示例中的效果或特征的混合。在一些实施例中,在一个位置处示出的功能性也可以在不同的位置处被提供;例如,本领域技术人员认识到,可以在给定实现中以各种方式定义功能性模块,而不必从被视为一个整体的交互模块的集合中忽略所需要的技术效果。由于空间限制或为方便起见,不同的步骤可以在附图中的单个框中一起被示出,但是仍然单独地可执行,例如,在方法的给定性能中,可以在没有另一个步骤的情况下执行一个步骤。

在全文中通过附图标记对附图进行了参考。在附图或文本中,与给定附图标记相关的措辞中的任何明显不一致之处应当被理解为简单地扩大了该数字所参考的范围。即使使用相同的附图标记,给定附图标记的不同实例也可以指代不同的实施例。类似地,给定附图标记可以用于指代动词、名词和/或每个的对应实例,例如,处理器110可以通过执行指令来处理110指令。

如本文中使用的,诸如“一”和“该”等术语包括所指示的项或步骤中的一个或多个。特别地,在权利要求中,对项的引用通常意味着存在至少一个这种项,而对步骤的引用表示执行该步骤的至少一个实例。

标题仅是为了方便;可以在标题指示该主题的部分之外找到有关给定主题的信息。

所提交的所有权利要求和摘要是说明书的一部分。

尽管已经在附图中示出并且在上面描述了示例性实施例,但是对于本领域的普通技术人员很清楚的是,在不脱离权利要求中阐述的原理和概念的情况下,可以进行多种修改,并且这种修改不需要包含整个抽象概念。尽管以特定于结构特征和/或程序动作的语言描述了主题,但应当理解,所附权利要求中定义的主题不必限于权利要求中所述的特定技术特征或动作。在给定定义或示例中标识的每个部件或方面或技术效果不必在每个实施例中都存在或被利用。而是,所描述的特定特征以及作用和效果作为示例被公开,以在实现权利要求时考虑。

在法律允许的最大范围内,所有落入整个抽象概念但落入权利要求等同含义和范围之内的变化都应当被包含在其范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号