通过使用测试用例来执行测试的方法和装置与流程

文档序号:18888363发布日期:2019-10-15 21:18阅读:283来源:国知局
通过使用测试用例来执行测试的方法和装置与流程
本发明涉及用于使用测试用例来进行测试的方法和装置,并且更具体地涉及自动生成用于在商业系统的开发过程中发现系统错误的测试用例并通过使用所生成的测试用例来测试系统的方法和装置。
背景技术
:测试方法包括静态地测试源代码而实际上不执行程序的静态测试、以及通过实际上执行程序并检查返回的执行结果来测试程序的动态测试。静态测试是一种分析源代码的模式和处理流程以检测错误的方法。在静态测试中,可以找到测试用例或者可以生成测试用例值,并且开发人员可以使用测试用例来测试程序。动态测试需要输入值,因为程序的操作应该被测试,并且作为程序的操作的结果而产生输出值。此外,当测试程序的操作时,基础单元可以是一个函数,这是该程序的最小模块。在这里,该函数具有输入参数和输出参数,并且该函数可以返回值。现有的测试用例生成研究之一(例如,gupta等人)已经通过使用迭代缓解(iterativemitigation)技术来自动生成测试数据。具体地,基于基础路径来选择测试用例,并且使用高斯消元方案(gaussianeliminationscheme)来获得解决方案。在这里,所获得的解决方案是测试路径值。但是,这些研究没有考虑企业商业系统中经常使用的sql查询语句,并且当变量的数量增加时会存在高斯消元方案无法解决的问题。在其他一项研究(例如,godefroid等人)中,通过组合符号执行和具体执行来生成测试用例。具体地,使用随机测试方案、代码插入方案和符号执行方案来导出影响外部环境的变量,通过使用随机测试方案(在该随机测试方案中使用所导出的变量来随机生成测试用例)来生成初始值,并且通过工具代码来分析执行结果。然而,这项研究存在一个问题,即严格意义上难以将其视为符号执行。此外,通过组合符号执行和具体执行来生成测试用例的另一项研究(sen等人)定义并使用类c语言来进行符号执行,并且主要被用于查找null指针。但是,因为它没有显式地生成和管理测试用例,所以存在每次都重新解析整个源代码的问题以及不考虑任何sql查询语句的问题。如果不考虑数据库环境,则在测试企业系统时,可能会通过sql查询语句来改变数据库中的数据以进行注册、修改和删除,这些改变可能会影响测试结果,并且无法执行精确测试。技术实现要素:技术问题用于解决上述问题的本发明的目的是提供一种使用测试用例的测试方法。用于解决上述问题的本发明的另一个目的是提供一种用于生成测试用例的装置。用于解决上述问题的本发明的另一个目的是提供一种使用测试用例的测试装置。技术方案用于解决上述问题的本发明提供了一种使用测试用例的测试方法。在这里,一种使用测试用例的测试方法可以包括:基于符号执行来生成针对包括结构化查询语言(sql)语句的源代码的测试用例;以及通过将测试用例应用于与数据库交互工作的被测系统来执行测试。在这里,所述测试用例可以包括以下值中的至少一个:被测系统的输入值、当在被测系统中处理输入值时被预测为输出值的预期输出值、针对数据库的设置值、以及当被测系统与数据库交互工作时被预测为要存储在数据库中的预期结果值。在这里,所述测试用例的生成可以包括确定源代码的至少一个程序路径;根据至少一个程序路径来执行符号执行;以及使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例。在这里,确定至少一个程序路径可以包括:解析源代码以生成抽象语法树(ast);基于所生成的抽象语法树来生成控制流图(cfg);以及基于控制流图来确定至少一个程序路径。在这里,执行符号执行可以包括:当sql语句被包括在至少一个程序路径中时,根据源代码的sql语句和宿主变量来映射数据库中所包括的表的列。在这里,映射可以包括:解析sql语句以识别表;使用数据库的元数据来获取构成所识别的表的列;以及将所获取的列映射到源代码的宿主变量。测试方法还可以包括:在生成测试用例之后,以xml格式和json格式中的一种来存储所生成的测试用例。在这里,当被测系统是模块时,测试用例的执行可以包括:将设置值应用于数据库;利用输入值来配置被测系统的输入参数;利用所配置的输入参数来调用被测系统的函数;以及将作为调用函数的结果而获得的被测系统的输出值与预期输出值进行比较,并且将存储在数据库中的结果值与预期结果值进行比较。在这里,当被测系统是中间件服务时,测试用例的执行可以包括:使用测试用例来生成输入文档;调用与被测系统交互工作的中间件的服务,并且将输入文档发送到中间件;以及从中间件接收测试结果文档。在这里,中间件可以被配置为:从输入文档中识别测试用例的数据库设置值;使用所识别的数据库设置值来对数据库执行初始设置;从输入文档中识别测试用例的输入值;以及通过输入该输入值作为被测系统的输入参数来执行被测系统。在这里,当在每次执行被测系统时被测系统的输出值改变时,可以从测试用例中排除预期输出值,或者可以通过宏、引用或脚本中的一个来确定预期输出值。用于实现另一目的的本发明的一个方面提供了一种测试用例生成装置。在这里,一种用于生成测试用例的装置可以包括执行至少一个指令的处理器和存储至少一个指令的存储器。当执行至少一个指令时,处理器可以被配置为:基于符号执行来确定包括结构化查询语言(sql)语句的源代码的至少一个程序路径;根据至少一个程序路径来执行符号执行;以及通过使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例。在这里,处理器还可以被配置为:通过解析源代码来生成抽象语法树(ast);基于所生成的抽象语法树来生成控制流图(cfg),并且基于控制流图来确定至少一个程序路径。用于实现另一目的的本发明的一个方面提供了一种使用测试用例的测试装置。在这里,一种使用测试用例的测试装置可以包括执行至少一个指令的处理器和存储至少一个指令的存储器。当执行至少一个指令时,处理器可以被配置为:基于符号执行来生成针对包括结构化查询语言(sql)语句的源代码的测试用例;以及通过将测试用例应用于与数据库交互工作的被测系统来执行测试。该测试用例可以包括以下值中的至少一个:被测系统的输入值、当在被测系统中处理输入值时被预测为输出值的预期输出值、针对数据库的设置值、以及当被测系统与数据库交互工作时被预测为要存储在数据库中的预期结果值。在这里,处理器可以被配置为:确定源代码的至少一个程序路径;根据至少一个程序路径来执行符号执行;以及使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例。在这里,处理器可以被配置为:解析源代码以生成抽象语法树(ast);基于所生成的抽象语法树来生成控制流图(cfg);以及基于控制流图来确定至少一个程序路径。在这里,处理器可以被配置为:当sql语句被包括在至少一个程序路径中时,根据源代码的sql语句和宿主变量来映射数据库中所包括的表的列。在这里,处理器可以被配置为:解析sql语句以识别表;使用数据库的元数据来获取构成所识别的表的列;以及将所获取的列映射到源代码的宿主变量。在这里,处理器可以被配置为以xml格式和json格式中的一种来存储所生成的测试用例。在这里,当被测系统是模块时,处理器可以被配置为:将设置值应用于数据库;利用输入值来配置被测系统的输入参数;利用所配置的输入参数来调用被测系统的函数;以及将作为调用函数的结果而获得的被测系统的输出值与预期输出值进行比较,并且将存储在数据库中的结果值与预期结果值进行比较。在这里,当被测系统是中间件服务时,处理器可以被配置为:使用测试用例来生成输入文档;调用与被测系统交互工作的中间件的服务,并且将输入文档发送到中间件;以及从中间件接收测试结果文档。有益效果当使用如上所述的根据本发明的使用测试用例的测试方法和装置时,可以提供一种用于迭代测试的测试用例,并且因此具有可以将其用在回归测试中以发现回归错误的优点。此外,可以通过考虑程序中所包括的嵌入式sql语句来生成测试用例,以便可以容易地测试与数据库交互工作的系统。此外,测试用例是自动生成的,这可以大大减少测试所需的工作量和时间。附图说明图1是示出根据本发明的示例性实施例的使用测试用例的测试方法的概念图。图2是根据本发明的示例性实施例的使用测试用例的测试方法的流程图。图3是示出根据本发明的示例性实施例的确定程序路径的步骤的流程图。图4是根据本发明的示例性实施例的用于解释抽象语法树(ast)的概念图。图5是根据本发明的示例性实施例的用于导出测试用例的源代码的示例图。图6是用于解释控制流图(cfg)的概念图。图7是示出模拟针对路径6的符号执行过程的结果的示图。图8是示出根据本发明的示例性实施例的执行测试的过程的第一示例图。图9是示出根据本发明的示例性实施例的执行测试的过程的第二示例图。具体实施方式尽管本发明容易受到各种修改和替换形式的影响,但是在附图中以示例的方式示出了特定实施例并详细描述了特定实施例。然而,应该理解,该描述并非旨在将本发明限定于特定实施例,而是相反,本发明将覆盖落入本发明的精神和范围内的所有修改、等同物和替代物。尽管在这里可以参考各种元件使用术语“第一”、“第二”等,但是这些元件不应该被解释为受这些术语的限制。这些术语仅用于区分一个元件与另一个元件。例如,在不脱离本发明的范围的情况下,第一元件可以被称为第二元件,且第二元件可以被称为第一元件。术语“和/或”包括相关联的所列条目中的一个或多个的任何和所有组合。应当理解,当一个元件被称为“连接”或“耦合”到另一个元件时,它可以直接连接或耦合到其他元件,或者可以存在居间元件。相反,当一个元件被称为“直接连接”或“定向耦合”到另一个元件时,不存在居间元件。在这里使用的术语仅用于描述特定实施例的目的,并不意图限制本发明的实施例。如在这里所使用的,单数形式“一”、“一个”和“该”也旨在包括复数形式,除非上下文另有明确说明。将进一步理解,术语“包括”、“包含”、“包括有”和/或“包括有”在本文中使用时指定存在所述特征、整数、步骤、操作、元件、部件和/或其组合,但不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、部件和/或其组合。除非另外定义,否则在这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域的普通技术人员通常理解的含义相同的含义。将进一步理解,在常用词典中定义的术语应该被解释为具有与其在相关领域的上下文中的含义相一致的含义,并且将不以理想化或过于正式的含义来解释它们,除非在本文中明确地那样定义。在下文中,将参考附图更详细地描述本发明的示例性实施例。图1是示出根据本发明的示例性实施例的使用测试用例的测试方法的概念图。参照图1,根据本发明的示例性实施例的使用测试用例的测试方法可以由测试装置来执行,所述测试装置包括符号执行器10、测试管理器20和具体执行器40。在这里,测试装置可以包括在内部或外部的单独的测试数据库30。将描述根据本发明示例性实施例的测试方法。首先,测试管理器20可以从测试器接收测试用例生成请求。测试管理器20可以请求符号执行器10生成测试用例。被请求生成测试用例的符号执行器10可以从配置管理中下载源代码。在这里,配置管理可以是管理最新源代码的实体,以便即使在开发过程期间随时改变源代码或数据库表时测试也能反映源代码的变化,并且源代码可以被解释为包括结构化查询语言(sql)语句。此外,在这里下载的源代码可以由开发人员直接输入到符号执行器10。符号执行器10可以生成测试用例并将其发送到测试管理器20。测试管理器20可以将所接收到的测试用例存储在测试db30中。当测试者通过测试管理器20请求查询时,可以通过测试管理器20将所存储的测试用例提供给测试者。测试管理器20可以请求具体执行器40执行测试。被请求执行测试的具体执行器40可以从测试db30查询测试用例,并且可以根据所查询到的测试用例来将测试的设置值应用于与被测系统(sut)60交互工作的数据库50。在这里,测试的设置值可以是应该被存储在数据库50中的初始值,以便被测系统60与数据库50一起操作。在一些情况下,初始值可以不存在或者是空值。具体执行器40可以通过将来自所查询到的测试用例的输入值输入到被测系统60来获得被测系统60的输出值。此外,当被测系统60接收输入值并进行操作时,新的结果值可以被存储在与被测系统交互工作的数据库50中。因此,具体执行器40还可以从数据库获取结果值。具体执行器40可以将所获取的被测系统60的输出值和数据库50的结果值与存储在测试db30中的确认值进行比较,并且可以通过比较来诊断并识别被测系统60中是否存在错误。然后,具体执行器40可以将测试结果存储在测试db30中并将测试结果返回给测试管理器20。测试管理器20可以将返回的测试结果提供给测试者。通过这些过程,可以生成、存储并执行测试用例,并且可以存储测试结果。此外,可以支持一系列测试使用周期,包括关于测试结果的报告和统计。在这里,符号执行器10可以使用由数据库50提供的元信息来获得在执行符号操作时理解相应列的约束和sql查询语句所需的表的列。测试管理器20可以根据测试db30中的测试路径以作为国际标准的可扩展标记语言(xml)格式来存储并管理测试路径、测试用例和测试结果值。此外,可能需要测试用例和被测系统60之间的同步,以便可以使用反映最新源代码的测试用例来执行测试。每次改变被测系统60时,可以通过识别来自配置管理的改变来生成测试用例。可选地,可以通过仅在测试被请求时检查被测系统60是否是配置管理中的最新的来生成测试用例。具体地,当测试管理器20从用户或管理员接收到测试请求时,测试管理器可以检查测试db30中是否已经生成了测试用例。当存在测试用例且不存在新的修改时(或者,当测试用例是针对最新源代码而生成的测试用例时),测试管理器可以通过将测试用例的标识符和被测系统60的标识符转发给具体执行器40来请求测试。此外,当测试db30中不存在测试用例或者没有基于最新的被测系统60来生成测试用例时,测试管理器可以请求符号执行器10生成测试用例。具体执行器40可以检索存储在测试db30中的测试用例以执行测试,利用所述值来生成驱动程序或文档,执行测试,并且将测试结果值存储在测试db30中并管理测试结果值。配置管理管理要被测试的所有源代码,并且符号执行器10可以生成针对最新源代码的测试用例。被测系统60可以是要被测试的模块或服务。例如,模块可以以源代码、目标代码、静态库和动态库的形式存在。服务也可以是在中间件基础下运行的二进制类型程序。可以通过文档来测试该服务。存在基于位置的文档和基于标签的文档。在基于位置的文档中,数据的含义可以由数据的位置和长度来定义。在基于标签的文档中,数据的含义由标签来定义,并且基于标签的文档可以具有诸如javascript对象表示法(json)和可扩展标记语言(xml)的形式。测试管理器20可以以统计和状态报告的形式向开发人员、质量保证人员和项目经理提供各种测试结果。这些报告可以包括通过项目进行测试的状态、通过任务进行测试的状态、通过模块或服务进行测试的状态、以及排除或处理缺陷的结果。另外,测试管理器20可以支持单元测试、综合测试(integrationtest)和回归测试。单元测试而生成的测试用例也可以被用于综合测试和回归测试。综合测试由一个场景组成,该场景可以通过按顺序组合单元测试用例来组织。为了将单元测试用例组合成场景,可能必须将先前测试用例的实际输出值映射到输入值。此外,可以提供用于将期望输出值映射到输入值的算术表达式。单元测试的测试用例可以被用作回归测试中使用的测试用例而无需修改,但是用于根据回归分析来选择各种测试用例的方法可能是必要的。也就是说,在回归分析的范围内,可以应用诸如通过程序依赖性来选择测试用例、通过函数依赖性来选择测试用例以及仅选择受影响的测试用例的技术。在这里,为了便于解释,已将符号执行器10、测试管理器20和具体执行器40描述为单独的实体。然而,应该理解的是,它们可以不被实现为单独的实体,而是它们中的一些可以被实现为组合在一个实体中。它们不被解释为限于示例性实施例。图2是根据本发明的示例性实施例的使用测试用例的测试方法的流程图。参照图2,使用测试用例的测试方法可以包括基于符号执行来生成针对包括结构化查询语言(sql)语句的源代码的测试用例的步骤s200、以及通过将测试用例应用于与数据库交互工作的被测系统来执行测试的步骤s300。在这里,该测试用例可以包括以下值中的至少一个:被测系统的输入值、当在被测系统中处理输入值时被预测为输出值的预期输出值、针对数据库的设置值、以及当被测系统与应用了设置值的数据库交互工作时被预测为要存储在数据库中的结果值的预期结果值。具体地,输入值可以是与函数的输入参数相对应的值,预期输出值可以是与用来识别在函数被执行之后返回的结果的输出参数相对应的值,设置值可以是应该被存储在数据库中以便被测系统与数据库交互工作的初始值,并且预期结果值可以是作为被测系统与数据库共同操作的结果而被存储在数据库中的值。此外,输入值和预期输出值或预期结果值可以根据输入参数的数据类型、返回类型(或输出参数)或存储在数据库中的数据而具有诸如整数或字符串的类型,并且数据库设置值可以是由insert、update和delete语句中的至少一个组成的sql查询语句。另外,包括输入值、预期输出值、数据库设置值和预期结果值中的至少一个的测试用例可以以javascript对象表示法(json)格式和可扩展标记语言(xml)格式中的一个而被存储。然而,实施例不限于此,并且测试用例可以以字符串或二进制等形式存储。在这里,源代码可以意指被测系统的源代码。另外,源代码可以包括sql语句,其中源代码可以包括用商业语言编写的各种代码,所述商业语言包括java、swift和objectc等。在某些情况下,源代码可以是通过从商业语言中去除一些语法而单独定义的语言。特别地,此处包括的sql语句可以被定义为嵌入式sql。例如,可能有甲骨文公司(oracle)的pl/sql、postgresql全球发展集团(postgresql)的ecpg、赛贝斯公司(sybase)的ase等。这些嵌入式sql支持的语言可以包括c/c++、cobol和pl/1等。尽管为了便于解释,通过去除其一些语法以商业语言描述了本发明的示例性源代码,但是本发明不限于此,并且可以被应用于各种编程语言。在这里,被测系统可以是使用数据库的信息系统。在这里,数据库可以存储至少一个表,所述至少一个表中的每个表存储一个或多个记录,并且具有针对每个记录的至少一个属性。在下文中,根据本发明的示例性实施例的被测系统将被解释作为与数据库交互工作的商业利息计算程序的示例。然而,被测系统不限于特定系统,并且下面在图5中可以参考商业利息计算程序的示例性源代码。在这里,符号执行指的是使用由符号定义的值而不是特定值来分析程序,并且将基于以下示例性源代码来描述符号执行。[表1]参照表1,可以针对示例性源代码来描述符号执行。首先,定义为输入参数的‘a’可以被赋给作为符号值的‘a’。因此,算术表达式b=a*10+1变为b=a*10+1,其可以直接被赋给变量‘b’。当基于a来计算建立了条件语句if表达式的用列时,a!=3,因此a可以是除3之外的各种整数(int)。另一方面,当基于a来计算未建立条件语句if表达式的用列(即,‘else’语句)时,可以将3导出为符号a(即,a==3)。在这里,各种求解器可以被用于计算由如上所述的符号值组成的条件表达式。例如,可以使用microsoft已发布用于研究的z3。同时,如果符号表达式是非线性的,例如,a*b=10或sin(a)=1,则可能难以使用求解器进行计算。在这种情况下,可以通过使用将实际特定值赋给符号值中的一个的方法等将其改变为线性条件来解决。在这里,存储在与被测系统交互工作的数据库中的表的示例可以如以下表2中所示。[表2]韩文名称英文名称类型长度描述账户号acc_non1414个数字(第一个数字是1)贷款额loan_amtn1717个数字贷款率loan_raten8前5个数字是整数部分,而后3个数字是实数部分贷款日loan_daten8yyyymmdd贷款期loan_periodn44个数字贷款类型loan_typen10-直接贷款、1-全额分期偿还、2-摊还本金…参照表2,可以识别存储在数据库中的账户表,并且可以存储关于诸如账户号、贷款额等属性的信息。在这里,例如,存储在账户表中的账户数据可以如以下表3中所示。[表3]参照表3,可以识别存储在数据库中的账户数据,并且可以存储表2中的账户号、贷款额等的值。另一方面,由于可能存在链接到被测系统的多于一个的数据库表,并且商业利息计算被描述为示例,因此利息还款表可以如下。[表4]韩文名称英文名称类型长度描述账户号acc_non1414个数字(第一个数字是1)还款日repay_daten8yyyymmdd利息金额interest_amtn1717个数字....参照表4,根据账户号的还款日期可以被存储在利息还款表中。在这里,记录在利息还款表中的利息还款数据可以如下。[表5]acc_norepay_dateinterest_amt....12345678901234201605212750....12345678901234201604212750....99999999990000201605155500....参照表5,可以根据每个账户号来存储还款日期和利息金额。在这里,生成测试用例的步骤s200可以包括:确定源代码的至少一个程序路径的步骤s210、根据至少一个程序路径来执行符号执行的步骤s220、以及使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例的步骤s230。在下文中,可以参考附图来详细地描述每个步骤。图3是示出根据本发明的示例性实施例的确定程序路径的步骤的流程图。图4是用于解释根据本发明的示例性实施例的抽象语法树(ast)的概念图。图5是根据本发明的示例性实施例的用于导出测试用例的源代码的示例图。图6是用于解释控制流图(cfg)的概念图。参照图3,确定图2的程序路径的步骤s210可以包括:通过解析源代码来生成抽象语法树(ast)的步骤s211、基于所生成的ast来生成控制流图(cfg)的步骤s212、以及基于控制流图(s213)来确定至少一个程序路径的步骤s213。抽象语法是由运算符组成的抽象语法树(ast)的归纳定义。抽象语法可以使用运算符来去除源代码的语法的模糊性。此外,可以通过将不同的抽象语法树与构造函数(constructor)和运算符组合来生成抽象语法树。抽象语法树和抽象语法的详细描述可以参考r.harper(harper,r.,2005,op.cit.)。参照图4,抽象语法树可以以结构类型400来表示。当为了便于理解而示出时,它也可以以示意性类型410来表示。具体地,抽象语法树具有树结构,其可以以各种形式来表示。例如,它可以使用诸如arraylist(数组列表)、list(列表)和map(映射)的数据结构来实现。在图4的示意性类型410和结构类型400之间的比较中,顶部节点可以是<program(程序)>。在这里,<program>可以由一个或多个函数(即,列表)组成。函数可以由返回类型、函数名称、参数和块声明组成。参数可以由类型和变量名称组成。块声明可以由零个或多个语句组成。该语句可以是局部变量声明、赋值、if语句或查询语句等等。根据本发明的示例性实施例,由于包括sql查询语句的源代码被作为目标,因此包括查询语句的符号操作的执行可能是最重要的因素。为了根据图4来确定抽象语法树中的程序路径,抽象语法树本身已经是树结构,但是由于它具有多个节点,因此在这里可能难以确定程序路径。因此,可以引入控制流图(cfg)。控制流图可以将在执行期间通过程序的所有路径表示为图表。在该图表中,每个节点可以表示一个基础块,并且箭头可以被用于指示跳转。该图表可以具有入口块和出口块。作为箭头的每一行都可以具有(outdegree(a)>1)或(indegree(b)>1)或这两者的属性。而且,在程序路径的确定中,可能发生导出大量路径的路径爆炸。可以使用独立的程序路径来解决路径爆炸问题。独立程序路径可以不是特定路径的组合,而可以是区别于其他独特路径的路径。可以使用被称为基础路径测试的白盒测试技术来找到独立的程序路径。详细地,可以参考mccabe(即,mccabe,t.j.,1976,acomplexitymeasure,ieeetransactionsonsoftwareengineering,vol.se-2,issue4)。根据被采用来获得独立程序路径的图论,节点可以是通过添加决策和进程而获得的值。通过图论来计算独立程序路径的等式可以如下。[表6]参照表6,可以通过将边缘数减去节点数(edges-nodes)加上2、通过将区域数加上1、或者通过将决策数加上1来导出独立程序路径。参照图5和图6,描述了图4的抽象语法树被简化为二叉树的控制流图。具体地,可以通过使用图4的抽象语法树从图5的样本源代码来生成图6的控制流图500。通过访问所生成的控制流图的路径,可以导出6个独立程序路径510。在这里,根据图5的样本源代码被用于根据图6来导出每个程序路径510。在图5中,每行的编号可以指示语法号。在语法号7中,根据在if语句中是否满足每个条件表达式(accno<0,paydate<0)来表示7.1和7.2。当if语句被满足时,可以将路径移动到语法号8。此外,语法号11可以被分支为条件语句,并且语法号14的sql语句可以根据是否执行insert而被分支到不同的路径。通过根据每种语法来跟踪独立路径,可以导出图6的控制流图500和对应的程序路径510。这里导出的程序路径可以补充有语法号和指示它是否是分支语句的信息。语法号可以被用于得到要被执行的实际语法,并且语句是否是分支语句的信息可以被用于生成对用于执行对应路径的变量的约束。图7是示出模拟路径6的符号执行过程的结果的示图。参照图7,可以详细地描述根据图2的程序路径来执行符号执行的步骤s220。具体地,图7中的(1)、(2)、(3)、(4)等等可以分别指示图5中的语法号。因为图5中的语法号1至4用于在比较图5的原始源代码与图7的符号执行结果时声明变量,所以图7的(1)至(4)可以将变量声明部分的变量设置为符号值。作为应用它的示例,如果变量声明部分中不存在值,则变量名称可以被转换为大写,并且其名称可以被设置为符号值。如果变量声明部分中存在值,则其值可以被设置为初始值。当进行符号执行时,可以将作为数字值的常数计算为单个常量值,并且符号可以在算术表达式中保持为变量。在执行符号执行之后,可以得到由符号组成的一个算术表达式。满足图7中的独立路径的一个算术表达式可以是逻辑表达式(7)和(11)为true(真)的情况。然后,可以将作为这种符号执行的结果而生成的逻辑表达式应用于求解器,以导出满足对应逻辑表达式的值的条件(约束)。同时,当sql语句被包括在图5的语句号9和14中时,当执行符号执行时可能需要一些额外的考虑。其中一个可能是对宿主变量的分析和管理。宿主变量可以被映射到数据库列并且被用于将值输入(或注册)在数据库中或从数据库中查询值。这些值在配置数据库环境以启用迭代测试中也起着重要作用。然后,可能需要注意在sql语句中使用的where条件语句的结果。在select语句的情况下,可以另外考虑当存在满足条件的记录时以及当不存在满足条件的记录时的两种情况。因此,测试用例的数量可能会根据独立程序路径中有多少个sql语句而变化。例如,在帐户表中,可能具有一条记录(在该记录中acc_no列的值与宿主变量accno的值相同),或者可能没有记录。因此,可以得到测试用例,并且可以通过考虑两种情况来计算对应测试用例的值。为了理解对sql语句中使用的宿主变量的考虑,可以如下描述四种类型的sql语句select、update、insert和delete。在这些sql语句中,包括where子句的3种类型语句是select、update和delete。这些查询语句的条件子句可以对应于与现有编程语言相比的分支语句,它们可以被包括在路径约束中。[表7]参照表7,示出了作为样本源代码的图5中的语法号7和9。具体地,示出了作为if语句的样本的语法号7、以及作为select语句的样本的语法号9。为了使sql查询语句的执行结果成为普通查询,语法号7(if语句)的路径约束可能需要如下改变。!(accno<0||paydate<0)在语法9中,当执行符号执行时,宿主变量‘:accno’的值可以变成被称为accno的符号值。为了便于解释,前面的程序假设在两个路径中执行符号执行。首先,第一经过是生成测试用例的路径,并且可能需要在考虑sql查询语句的where子句中的条件的情况下将该路径细分。当将图6的select语句和insert语句的结果分别视为成功和失败两种情况时,从它们的组合导出的路径可以是3条路径。考虑一对select和insert,存在三种情况:(成功和成功)、(成功和失败)、失败和失败(或成功)。简单组合存在四种情况,但如果select失败,则insert语句可能不会产生任何效果,并且因此可以排除对应的情况。同时,当在符号执行的解析阶段遇到sql语句时,可以解析sql查询语句以查找from子句中使用的表,并且可以从商业数据库的元数据中提取构成表的所有列。[表8]参照表8,在oracledbms的情况下,可以识别基于数据库的元数据中的表名称来查询所有列的select查询语句。[表9]参照表9,示出了mysql的select查询语句,其通过表名称和模式名称来检索作为元数据的列信息。在从数据库查询针对表的所有列的元信息之后,可以将它们存储在映射列和值的表中。[表10]语句号表名称列或常量宿主变量名称分类条目值7accacc_nonull条件07accloan_amtloanamt列17accinterest_rateinterestrate列17accloan_dateloandate列17accloan_periodnull列07accloan_typenull列07null100addin常量1参照表10,可以识别针对表2中的帐户表的列和宿主变量映射表。该表中的列可以由语句号、表名称、列/常量、宿主变量名称、分类、条目和值组成。在这里,列/常量可以有列名称或常量值。在具有常量值的情况下,可以假设值100被设置为如上面表7中所示的addin。例如,当sql查询语句中的where条件为‘k=?’时,‘?’可以是宿主变量、常量或列。如果‘?’是宿主变量,则宿主变量的值是序列中较早设置的值。因此,在符号执行期间,搜索计算sql查询语句的表达式时的值。宿主变量的值可以是常量值,或者它可以是由符号组成的算术表达式。如果‘?’是常量,则立即赋给与k列相对应的值。然而,如果‘?’是由符号组成的算术表达式,则这时候应该计算该算术表达式的值。如果‘?’是列,则在连接查询的情况下可能会发生这种情况。然而,计算有点复杂,但可以以类似的方式应用。对第二条路径执行符号执行。[表11]表11是作为符号执行的结果而生成的符号表。符号表可以由变量、初始值和符号表达式组成。当执行图7中的第7行时,路径约束可以如下。pc1:!(accno<0||paydate<0)当执行图7中的第9行时,可以获得acc表中的列的列表,acc表是从select语句的from子句中提取的表,并且into子句的列和变量的映射表如以下表12中所示。[表12]参照表12,可以识别列和into子句的变量映射表,在假设当前路径的where子句为真的情况下执行针对其的计算。下面的表13是反映作为根据图7中的第9行来执行select语句的结果的、从数据库中检索的值的符号表。[表13]参照表13,反映了每个变量的查询结果。例如,loanamt可以是从loan_amt列读取的loanamtdb的值,并且interestrate可以是从interest_rate列读取的interestratedb的值。另一方面,当获得了select语句的where条件子句的值时,可以根据在where条件子句中使用的条件的类型来获得该值。通过在符号表中搜索与符号变量的执行时间相对应的值,可以在表列结构中注册或修改宿主变量。如果符号表中不存在该值,则可以配置一个值。一旦完成该任务,就可以再次计算由符号组成的算术表达式。当它是常量时,列的值可以直接被注册在如表5中所示的宿主变量映射表的列和列值中。当图7的第10行被执行时,可以如下导出天数的表达式。days=paydate-loandate当图7的第11行被执行时,可以如下导出路径约束。pc3:pc2anddays>0当图7的第13行被执行时,可以如下导出利息的表达式。interest=loanamt*interestrate/1000*days/365当用上述等式中的天数的表达式代替时,可以导出下面的表达式。interest=loanamt*interestrate/1000*(paydate-loandate)/365表14是在其中执行了图7的第14行的映射表。[表14]参照图14,可以查询还款表的列,并且可以生成宿主变量映射表和还款表的列。最后,当图7中的第15行被执行时,可以如下导出calcinterest的表达式。calcinterest=loanamt*interestrate/1000*(paydate-loandate)/365在符号执行之后,如果宿主变量映射表和列中的值是一个符号变量(诸如表的表10和表14中所示),可以选择默认值或者可以选择在数据库中配置的约束中定义的值。例如,可以通过使用随机数将loan_period的值导出为正值,或者可以通过使用在列约束中声明的值或检查表达式中的有效值来导出loan_type的值。总之,执行符号执行的步骤s220可以包括当至少一个程序路径包括sql语句时根据源代码的sql语句和宿主变量来映射数据库中所包括的表的列的步骤。在这里,映射步骤的步骤可以包括:解析sql语句以识别表的步骤;使用数据库的元数据来获取构成所识别的表的列的步骤,以及将所获取的列映射到源代码的宿主变量的步骤。在下文中,将详细描述使用针对根据图2的符号执行而生成的逻辑表达式的求解器来生成测试用例的步骤s230。使用求解器来创建测试用例的步骤s230还可以包括将所生成的逻辑表达式转换为可满足性模数理论(smt)语言的步骤。该步骤可以是将根据逻辑表达式的约束转换为求解器可以理解的形式的步骤。在这里,求解器可以是例如由microsoft公开的z3。此外,转换为smt语言的过程可以详细地参考:moura等人(moura,l.de,n.,2008,z3:anefficientsmtsolver,14thinternationalconference,tacas2008,pp.337-340)和brummayer等(brummayer,r.,biere,a.,2009,boolector:anefficientsmtsolverforbit-vectorsandarrays,proceedingsofthe15thinternationalconferenceontoolsandalgorithmsfortheconstructionandanalysisofsystems:heldaspartofthejointeuropeanconferenceontheoryandpracticeofsoftware,pp.174-177)。返回参照图7,在路径6的符号执行中,由于要在语句行11中计算的约束应该满足(7)和(11)二者,因此可以导出以下内容。pc2anddays>0=>!(accno<0||paydate<0)&&!((paydate-loandatedb)<0)表15示出了将上述约束转换为smt语言的结果。[表15]参照表15,可以识别从约束转换为smt语言的脚本,该smt语言是求解器可以理解的形式,并且当求解器执行经过转换的脚本时,可以获得与符号变量相对应的值。首先,可以获得与函数的输入和输出相对应的符号的值。在前面的示例中,可以通过分别计算符号accno和paydate来导出作为函数的输入的accno和paydate的具体值。在这里,loandatedb可以指从数据库中检索的常量值,而不是符号。同时,本发明中的测试用例可以包括数据库设置值,以便适用于与数据库交互工作的系统。因此,下面将描述生成数据库设置值的方法。可以以insert、update或delete语句的形式来生成数据库设置值。对于每次测试运行,可以对业务程序所使用的表执行这些查询,以便正好在测试运行之前生成数据库状态。[表16]为了测试存在select语句的查询结果的情况,可以生成表16中所示的查询语句作为数据库设置值。在帐户表在测试执行时应该具有数据的情况下,如果该表中不存在记录,则可以使用insert语句来重新注册记录,如果存在数据,则可以利用update语句来修改对应记录的值。[表17]为了测试select语句的结果不存在的情况,可以生成表17中所示的查询语句。无论记录是否在帐户表中,都可以通过执行delete语句来显式地删除记录。[表18]为了在对图7的第14行的insert语句执行冗余测试的情况下配置数据库环境。可以生成如表18中所示的查询语句。参照表14,当在测试执行时repay表中不存在记录时,可以执行insert语句以注册记录。当存在记录时,可以通过执行update语句来改变该记录的值。[表19]表19是用于配置测试insert语句正常注册的情况的数据库环境的查询语句。参照表19,可以从表中删除记录,而不管还款表中是否存在对应的记录,以使得该表中不存在对应的记录。从图6导出的程序路径6中的测试用例的数量是3,并且在每个sql查询语句中测试用例可以乘以大约2。因此,可以通过2(查询的数量)来算术地生成测试用例的数量,并且可以在下面的表20中总结由程序路径6生成的测试用例。[表20]参考表20,测试用例6-1可以测试持有账户但利息尚未偿还的情况。在这种情况下,输入值可以是12345678901234(它是在表中注册的账户号)和paydate(它是符号执行的结果)。另外,作为数据库设置值,insert语句可以注册一个帐号,delete语句可以删除利息偿还的历史,并且insert语句的loan_period和loan_method的值可以设置为帐户表的任意值或查询结果。测试用例6-2可以是持有账户并且利息已被偿还的情况。输入值可以与测试用例6-1的输入值相同,并且数据库设置值可以是将帐户和利息偿还历史注册为insert语句。在这种情况下,可以使用被称为today的宏来设置repay_date。测试用例6-3可以测试不持有账户的情况。因此,在这种情况下,作为输入值,可以使用0(其表示帐户表中不存在的账户号),并且作出数据库设置值,可以通过delete语句来删除所有帐户和利息偿还历史。一些数据库设置值可以通过符号计算来计算,但是它们中的一些可以不通过符号计算来计算。这些可以被称为自由变量。任何值都是可接受的,但是可以通过参考关于经过先前执行的应用程序而生成的事务日志的信息或数据库的约束来生成接近实际值的自由变量,从而可以尽可能地生成实际值。同时,为了检查测试的准确性,根据本发明的测试用例可以包括用于确认与输入值相对应的输出值的预期输出值(或预期结果值)、以及用于确认作为测试的结果而实际存储在数据库中的值的预期数据库结果值(或预期确认值)。表21是用于确认测试结果的预期输出值和预期数据库结果值的表。[表21]参照表21,预期输出值(或预期结果值)可以是函数的返回值。具体地,calcinterest的值(其是测试用例6中的预期输出值(或预期结果值))可以从paydate(其是符号执行的结果)、loanamtdb、loandatedb和interestratedb(其是检索自数据库)来导出。此外,可以由select语句来生成预期数据库结果值(或预期确认值)。预期数据库结果值可以被来通过以下方式检查数据库的预期结果值是否等于实际结果值:使用分隔符(‘||’),将作为根据select语句的执行而输出的结果值的带分隔符的字符串(例如‘a||b’)分开,并比较左右两侧的值。另外,测试用例6-2和6-3针对预期结果值是返回的错误值的情况。在这种情况下,可以如表20中所示那样来说生成预期数据库结果值(或预期确认值),或者根本不生成预期数据库结果值(或预期确认值)。总之,自动生成的测试用例可以生成与输入值相对应的预期输出值,并生成与数据库设置值相对应的预期数据库结果值,以确认测试结果。此外,在生成图2的测试用例的步骤s300之后,该方法还可以包括以xml格式和json格式中的一种存储所生成的测试用例的步骤。然而,测试用例不限于此,并且测试用例可以以字符串、二进制等形式来存储。在这种情况下,可以通过向“info”标签赋值来参考关于要存储测试用例的位置的信息,并且测试用例可以被存储为具有路径的主关键字、文件名称、方法名称和测试用例号,它们是info标签所具有的位置信息。此外,测试用例在被测系统发生变化时需要进行同步。一种同步方法是在被测系统被改变之后立即改变所有测试用例,而另一种方法是在执行测试时通过使测试用例同步来改变所述测试用例。第一种方法具有被测系统总是与测试用例匹配的优势,但是在发生大规模改变的情况下,可能存在影响测试的整体性能的缺点。第二种方法的缺点是测试执行时间延长,因为同步是在执行时间执行的。图8是示出根据本发明的示例性实施例的执行测试的过程的第一示例图。图9是示出根据本发明的示例性实施例的执行测试的过程的第二示例图。参照图8和图9,可以描述根据被测系统的类型以不同方式来执行测试的过程。根据本发明的被测系统可以是服务或模块。首先,参照图8,可以描述当被测系统(sut)是模块时执行测试的方法。生成在执行测试时要执行的测试驱动程序的方法可以根据被测系统的类型而变化。被测系统可以以源代码或目标代码的形式来提供,或者以共享库的形式来提供。当以源代码或目标代码的形式来提供被测系统时,应该执行包括被测系统的构建(编译和链接),这可能使构建环境复杂化。在这种情况下,存在一个缺点,即被测系统是在测试驱动程序作为一个主体的情况下构建并执行的,并且当被测系统中存在错误时不执行测试构建。当以共享库的形式来提供被测系统时,可以将模块的动态调用用于测试的执行。对应模块的共享库的存在可以意味着在要被测试的模块中不存在错误。参照图8,当被测系统是模块时,用于执行测试的方法可以包括:将测试用例中所包括的数据库设置值应用于数据库的步骤;利用测试用例中所包括的输入值来配置被测系统的输入参数的步骤;利用被配置的输入参数来调用被测系统的函数的步骤;以及将作为调用函数的结果而获得的被测系统的输出值与测试用例中所包括的预期输出值进行比较,并将存储在数据库中的结果值与测试用例中所包括的预期结果值进行比较的步骤。在这里,可以通过执行编译的测试驱动程序来执行每个步骤。在这里,由于在开发过程中可以随时改变由被测系统的输出值和预期输出值以及数据库的表和列组成的结构,因此还可以支持检测变化且实时同步的函数。如上所述,通过生成测试驱动程序的测试方法具有以下优点:测试管理器可以直接控制事务,并且可以在没有完全配置实际测试环境的情况下执行测试。[表22]表22示出了使用测试驱动程序的测试方法的源代码。参照表22,可以将设置值输入到数据库,可以输入测试用例的输入值作为被测系统的功能参数,并且可以比较根据它的结果。另一方面,参照图9,可以描述当被测系统是服务时执行测试的方法。具体地,当被测系统是中间件服务时,执行测试的方法可以包括:使用测试用例来生成输入文档的步骤;调用与被测系统交互工作的中间件的服务并将输入文档发送到中间件的步骤;以及从中间件接收测试结果文档的步骤。在这里,由于一旦生成测试用例,输入文档就可以以xml、json等形式预先存储,所以生成输入文档的步骤可以被处理为获得所存储的文档的步骤。此外,该方法还可以包括在生成输入文档的步骤之后将输入文档转换为中间件服务所支持的格式的步骤。这可以是为了确保兼容性,因为存储并使用测试用例的输入文档的格式可能与中间件服务所支持的格式不同。在这里,用于开发被测系统的中间件可以是socket、rmi、rpc、http、tuxedo、t-max、entera等。可以确定调用服务的方法,并且可以根据开发的被测系统所使用的中间件来改变控制事务的方法。由于商业中间件(诸如tuxedo和t-max)在测试时提供两阶段提交,所以可以有效地控制与测试任务和业务任务相关的事务,诸如数据库环境的配置、预期结果的处理和将测试结果存储在数据库中。此外,如果被测系统使用框架,则被测系统可以提供更结构化的形式。框架允许调用拦截例程(诸如预处理和后处理)以便处理业务事务,并执行在调用服务之前通常使用的函数。通过嵌入配置数据库环境并处理这样的预处理和后处理中的预期结果的模块,可以有效地处理事务。表23是用于测试基于中间件的被测系统的样本代码。[表23]参照表23,可以识别测试代理侧中的每个进程和由中间件的框架执行的每个进程。在详细描述上述进程时,首先,测试代理可以用程序号和测试用例号来查询测试用例的输入文档,并在输入文档的保留区域中配置值。其次,测试代理可以通过将输入文档发送到框架来调用服务。框架可以将包括在该文档的保留区域中的程序号和测试用例号转发给服务的预处理模块。服务的预处理模块可以通过使用程序号和测试用例号来从存储测试用例的数据库中读取数据库设置值,并在测试执行之前配置预测试环境。然后,框架可以调用被测系统(sut)来执行业务逻辑。sut可以在操纵交互工作业务数据库中的数据的同时执行业务处理。最后,框架可以用程序号和测试用例号来检索期望的数据库结果值。此外,可以对业务数据库执行查询,以通过比较预期结果值和实际结果值来验证测试的准确性。在上述步骤中的每一个步骤中,管理测试的结果所需的信息可以被记录在测试数据库中。第三,测试用例结果文档处理模块可以用程序号和测试用例号来查询测试用例的测试结果。测试用例结果文档处理模块可以将预期输出值与实际输出值进行比较,并将结果存储在记录了测试用例的数据库中。因此,中间件(或中间件的框架)可以被配置为:从输入文档中识别测试用例的数据库设置值,使用所识别的数据库设置值来对数据库执行初始设置,从输入文档中识别测试用例的输入值,以及通过输入测试用例的输入值作为被测系统的输入参数来执行被测系统。基于中间件的测试方法可以使测试代理使用通用模块而不生成源代码。此外,如果使用框架来开发业务系统,则具有使用两阶段提交事务管理的优势。在这里,在测试结果之中存在无法静态定义的值。例如,每次运行测试时会改变的信息(诸如所生成的序列号或运行测试的日期或时间)可能会增加测试结果的不确定性。因此,可能难以清楚地定义并测试数据库的预期输出值或预期结果值作为其测试用例。在这种情况下,这样的信息可以不是确定测试结果的目标,并且可以将其定义为诸如宏、引用和脚本的值,并且可以用逻辑来处理。此外,可以将值输入作为根据常量值、宏、引用或脚本而分离的类型。例如,常量值可以是数字或字符串,宏可以被定义为预定义的名称(诸如todate),并且在诸如当前日期的情况下,可以查询并使用系统的当前日期。引用可以检索文档的特定列的值,该值处于测试用例被存储的形式。脚本可以将执行脚本的结果值与输出值进行比较。但是,脚本可能具有包括宏的含义。因此,当在每次执行被测系统输出值改变时,可以从测试用例中排除预期输出值,或者由宏、引用和脚本中的一个来确定预期输出值。同时,可以使用上面生成的测试用例来将各种测试方案应用于执行测试的过程。测试方案可以包括单元测试、综合测试或回归测试。首先,单元测试可以是测试源代码的各个单元的软件测试方案。在这里,单元是应用程序的最小单位,并且可能表示可以被测试的一组行。单元测试是在开发的初始阶段发现问题的测试方案,并且旨在发现程序员在实现时造成的错误或得到的规范中的缺陷或遗漏。可以保证已经过单元测试的模块在被用于回归测试中时能正常工作。因此,可以为可能存在缺陷的程序编写单元测试的测试用例。如上所述编写的单元测试的该测试用例不仅可以被用于经过单元测试的程序的回归测试,而且还可以被用于需要整合稳定模块的综合测试。但是,单元测试可能无法检测到程序中的所有错误。由于仅测试了单元本身的函数,因此可能找不到诸如综合错误和系统错误之类的错误。再次参照图1,自动生成的测试用例可以被用于单元测试。由符号执行器生成的测试用例可以首先被存储在测试db中。这时,用户和管理员可以通过赋给如上所述的适当名称来管理自动生成的测试用例。用户和管理员可以随时使用它们,并可以在需要时立即检查测试结果。如果将自动生成的测试用例应用于需要准确性的测试,则可以轻易地执行许多测试,并且测试覆盖率可以被最大化。最后,单元测试结果可以被自动聚合在测试数据库中并作为统计数据来累积,该统计数据可以以易于理解的方式向管理员实时提供信息。然后,可以将综合测试定义为通过按顺序连接单元模块或服务来执行测试的软件测试方法。综合测试针对单元测试程序,可以在验证测试(诸如引导试验或现场测试)之前由分析师或设计人员来执行。综合测试方法可以包括集成方案(bigbangscheme)、自上而下方案、自下而上方案和混合方案。集成方案是通过同时整合所有模块来测试开发模块的方案。集成方案具有缩短综合测试时间的优点,但是当单元程序未经过充分测试时,可能会花费更多时间和精力。自下而上方案是首先对最低单元进行整合和测试的方案。当与要被测试的上级单元相关的所有下级单元被测试时,可以通过反复诸如直接测试上级单元的过程来执行一直到顶部单元的测试。自上而下方案允许从顶级进行测试。然后,可以反复测试下级单元。混合方案可以是混合自下而上方案和自上而下方案的方案。在综合测试中,可能不会测试综合测试规范中未描述的条件。使用自动生成的测试用例,开发人员可以配置模块综合或服务综合测试。可以通过按顺序聚合模块来执行模块综合测试。换句话说,可以生成按顺序聚合模块的测试驱动程序。当测试模块中的顶级函数时,可以调用和执行下级函数。用户注册模块、用户列表查询模块、用户修改模块和用户删除模块可以根据场景来进行配置和测试。服务综合测试是按顺序聚合和测试服务的方案。假设根据如在模块综合测试中的场景来配置用户注册服务、用户列表查询服务、用户修改服务和用户删除服务,测试者可以选择在测试db中注册用户的测试用例。然后,为了检查用户是否被正常注册,可以选择用已注册的用户号来查询用户列表的测试用例。然后,可以选择用于修改已注册用户的信息的测试用例。在这里,可以指定相同的用户号,以便执行对相同用户号进行修改的测试。最后,可以选择用于测试用户删除的用户删除测试用例。类似地,可以指定相同的用户号以便测试删除。因此,可以组合单元测试用例以执行服务综合测试。由于构成场景的测试用例应该使用相同的用户号,因此可以提供在后面的测试用例中使用在用户注册测试用例中注册的用户号的方法。实现这一点的最简单方法之一是提供一种用于参考先前在测试用例中使用的输入值或实际输出值以进行准确度确定的方法。作为综合测试的结果,应该管理构成场景的各个测试用例的结果,以及整个场景的结果。此外,可能需要管理一个场景的测试结果、测试场景的历史以及场景的变化的历史。管理员可能对整个场景的成功感兴趣,而开发人员对找出该场景的故障出现在哪里以及故障的原因感兴趣。回归测试是一种软件测试技术,用于识别在软件改变之后,以前开发的软件是否仍能正常工作。软件的改变可能是由改进、修补和配置改变引起的。回归测试可能旨在发现由新错误或程序改变(统称为添加、删除和修改)引起的回归错误。作为回归测试方案,存在执行所有测试用例的方案、以及发现并测试受程序改变影响的程序的方案。执行所有测试用例的方案是理想的,但是当存在测试时间约束(诸如测试应该在8小时内完成)时可能难以使用该方案。回归分析被用于通过影响分析来找出程序改变的影响。分析结果被用于选择回归测试用例,并且可以使用回归分析的结果来执行回归测试。在回归测试中,通过找出受程序改变影响的程序的测试用例来执行测试可能是有利的。为了解释在函数(或方法)级别进行回归分析的方法,可以找出受程序改变影响的函数,并且可以重复这一过程,直到找出使用对应函数的所有父函数以及它们的所有父函数为止。一旦找出所有受影响的函数,就可以去除冗余函数。最后,可以顺序执行属于其余函数的测试用例。回归测试中使用的测试用例可以为单元测试用例或综合测试用例的形式。回归测试可以使用所有可能的测试用例,并且还指定要在回归测试中使用的测试用例以进行有效测试。回归测试的结果可以被存储在测试db中。此外,当发生与偿还系统有关的错误时,还能够防止改变的程序被加载到操作系统中。回归测试可以是应该在迭代增量式开发方法中执行的测试。在迭代增量式开发中,每天都将开发的程序提交给配置管理系统,并且自动构建系统从配置管理下载程序、进行构建、通过影响分析来找到受影响的函数,并执行对应的测试用例。可以重复这样的操作。作为影响分析的示例,假设首先从业务表中删除一个列。影响分析系统可以找到使用被删除的列的函数(在这种情况下,还找到包括该函数的程序)。可以重复这些操作,直到使用对应函数的所有父函数为止。可以去除找到的函数之中的冗余函数。使用在去除冗余函数之后的函数的列表,可以找到属于这些函数的测试用例。可以执行所有这些测试用例以完成回归测试。影响分析中最重要的因素之一可能是获得最小的受影响的测试用例集合。可以使用静态分析技术来实现这一目标。静态分析技术可以被用于跟踪对应的控制流以找到受影响的基础路径,找到与它们相关联的测试用例,并提取最小的测试用例集合。根据本发明的示例性实施例的测试用例生成装置可以包括执行至少一个指令的处理器和存储至少一个指令的存储器。在这里,处理器可以基于符号执行而被配置为:基于符号执行来确定包括结构化查询语言(sql)语句的源代码的至少一个程序路径,根据至少一个程序路径来执行符号执行,以及通过使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例。在这里,处理器可以被配置为:通过解析源代码来生成抽象语法树(ast);基于所生成的抽象语法树来生成控制流图(cfg);以及基于控制流图来确定至少一个程序路径。根据本发明的示例性实施例的使用测试用例的测试装置可以包括执行至少一个指令的处理器和存储至少一个指令的存储器。在这里,处理器可以基于符号执行而被配置为:基于符号执行来生成针对包括结构化查询语言(sql)语句的源代码的测试用例,以及通过将测试用例应用于与数据库交互工作的被测系统来执行测试。此外,测试用例可以包括以下值中的至少一个:被测系统的输入值、当在被测系统中处理输入值时被预测为输出值的预期输出值、针对数据库的设置值、以及当被测系统与应用了设置值的数据库交互工作时被预测为要存储在数据库中的预期结果值。在这里,处理器可以被配置为:确定源代码的至少一个程序路径,根据至少一个程序路径来执行符号执行,以及通过使用针对根据符号执行而生成的逻辑表达式的求解器来生成测试用例。在这里,处理器可以被配置为:通过解析源代码来生成抽象语法树(ast);基于所生成的抽象语法树来生成控制流图(cfg),以及基于控制流图来确定至少一个程序路径。在这里,当sql语句被包括在至少一个程序路径中时,处理器可以被配置为根据源代码的sql语句和宿主变量来映射数据库中所包括的表的列。在这里,处理器可以被配置为:解析sql语句以识别表,使用数据库的元数据来获取构成所识别的表的列,并将所获取的列映射到源代码的宿主变量。在这里,处理器可以被配置为以xml和json格式中的一个来存储所生成的测试用例。在这里,当被测系统是模块时,处理器可以被配置为:将设置值应用于数据库,利用输入值来配置被测系统的输入参数,利用被配置的输入参数来调用被测系统的函数,以及将作为调用函数的结果而获得的被测系统的输出值与预期输出值进行比较,并将存储在数据库中的结果值与预期结果值进行比较。在这里,当被测系统是中间件服务时,处理器可以被配置为:使用测试用例来生成输入文档,调用与被测系统交互工作的中间件的服务,并将输入文档发送到中间件;以及从中间件接收测试结果文档。上述测试用例生成装置或使用测试用例的测试装置可以是台式计算机、膝上型计算机、笔记本、智能手机、平板电脑、移动电话、智能手表、智能眼镜、电子书阅读器、便携式多媒体播放器(ppmp)、便携式游戏机、导航装置、数字相机、数字多媒体广播(dmb)播放器、数字音频录音机、数字视频录像机、数字视频播放器、个人数字助理(pda)、或具有通信能力的类似设备。本公开的实施例可以被实现为可由各种计算机执行并记录在计算机可读介质上的程序指令。计算机可读介质可以包括程序指令、数据文件、数据结构或其组合。记录在计算机可读介质上的程序指令可以是专门为本公开设计和配置的,或者可以是公知的并且可供计算机软件领域的技术人员使用。计算机可读介质的示例可以包括诸如rom、ram和快闪存储器的被特别地配置为存储和执行程序指令的硬件设备。程序指令的示例包括由例如编译器制作的机器代码以及使用解释器可由计算机执行的高级语言代码。以上的示例性硬件设备可以被配置为作为至少一个软件模块来操作,以便执行本公开的实施例,并且反之亦然。虽然已经详细描述了本公开的实施例及其优点,但是应当理解,在不脱离本公开的范围的情况下,可以在此进行各种改变、替换和更改。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1