如何为基于属性的测试设计测试属性?以toHex函数为例
toHex 函数基于属性测试的核心属性设计方案
你不需要自己重写toHex的实现逻辑,也不需要引入第三方同功能库做断言,核心属性可以按照以下几类设计:
第一类:无外部依赖的自洽属性
这部分完全不需要引入其他转换逻辑,靠函数本身的输入输出关系就能验证:
- 输出格式合法性
任意输入生成的字符串,仅允许包含0-9、a-f(或A-F,需和函数约定的大小写规则对齐),不会出现其他字符。如果函数约定带0x前缀,可额外校验前缀固定出现在字符串开头。 - 输出长度匹配
输入为n字节的二进制数据时,输出字符串长度固定为2*n(如果有0x前缀则额外加2);空输入对应空输出(或仅含前缀)。 - 大小写一致性
输出字符串中的字母要么全部小写,要么全部大写,不会出现大小写混排的情况。 - 拼接一致性
对任意两个独立的二进制数据块a和b,toHex(a) + toHex(b)的结果和toHex(a + b)完全相等。这个属性可以有效发现分块转换时的边界错误,比如漏写、多写字节对应字符的问题。
第二类:基于标准库的可逆性属性
绝大多数编程语言的标准库都自带十六进制字符串转二进制数据的原生方法(如Python的bytes.fromhex、Java的HexFormat.parseHex、Go的hex.DecodeString等),基于这个可以设计最严格的校验属性:
- 往返转换一致性
对任意输入的二进制数据data,调用标准库的fromHex方法解析toHex(data)的返回值,得到的结果和原始输入data完全一致。
第三类:边界值专项属性
针对容易出问题的边界场景设计专属属性:
- 单字节覆盖性
对所有取值在0~255范围内的单字节输入,输出固定为2位字符,且对应数值的十六进制表示(不足两位补前导零)和输出完全匹配。由于单字节总共只有256种取值,可结合属性测试的随机生成做到全量覆盖。 - 特殊值匹配
输入为n字节全0x00的数组时,输出为n个00拼接的结果;输入为n字节全0xff的数组时,输出为n个ff(或FF)拼接的结果。
测试开展顺序
- 先跑通所有自洽属性校验,排除格式、长度、拼接类的基础错误
- 再用可逆性属性做全范围的随机校验,覆盖绝大多数逻辑错误
- 最后补充边界值属性的测试,覆盖极端场景的漏测问题
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

