5.3.1 背景介绍
字符串类型是许多编程语言中的基本数据类型,特别是在Web程序和数据库软件中有很广泛的应用。由于程序中包含各种类型的约束,测试用例自动生成工具需要能够对不同类型的约束进行求解。常见的用例自动生成工具能够支持的约束类型包括数值类型、布尔类型、数组类型等,但是由于字符串和字符串函数的操作十分复杂,若不对字符串类型进行特殊处理的话很难生成准确的字符串测试用例。
字符串是有限长度的字符序列,一个字符串的长度是其中包含的字符数量,字符串中的每一个字符成员都有其所在的位置。程序中的字符串对象常常通过字符串函数进行操作,字符串函数操作通常可以描述为数学上的操作,因此可以抽象为一个字符串语言中的函数或者谓词[24]。常用的字符串函数被封装为标准的库函数随着编程语言发布,本书作者对实际工程中出现的字符串函数做了调研,统计了大约90万行代码中标准字符串函数库的字符串函数的出现情况,统计数据如表5-4所示,出现频率较高的7个字符串函数占了所有字符串函数出现总数的80%以上,我们重点关注这些出现频率很高的字符串函数。
表5-4 实际工程中字符串函数的分布情况
(https://www.daowen.com)
字符串函数的语义十分丰富,因此无法直接求解字符串函数的约束。由于字符串类型可以表示为字符数组,因此利用字符串函数对于字符串的操作可以等价为对字符数组成员的基本操作的组合。字符串函数的语义包括操作类型和操作范围,操作类型包括修改和查询,操作范围是被操作的字符数组成员的位置。根据对字符数组成员操作范围的不同,本书对字符串函数进行了分类,如表5-5所示。
表5-5 字符串函数的分类

字符串测试用例自动生成存在两方面困难:字符串函数是通过编程语言实现的,意味着字符串函数可能是任何语义,需要在约束提取过程中不丢失约束;被测程序中可能同时包含字符串约束以及其他类型的约束,要求约束求解器能够求解混合类型的约束。因此,字符串测试用例自动生成的关键是能够准确提取各种字符串函数的约束,以及能够求解混合的约束。