单元测试 left 函数:取得字符串的左边部分
单元测试 left 函数:取得字符串的左边部分
本次实验是针对单元测试 left 函数的测试。在进行测试前,首先需要确定黑盒测试和白盒测试的方法,以便设计出恰当的测试用例集合。
1. 黑盒测试
黑盒测试是在不考虑内部实现的情况下,只根据输入和输出来测试函数的正确性。在进行黑盒测试时,可以采用等价类划分、边界值分析、错误猜测法等方法。
等价类划分是将所有的输入数据划分为若干个等价类,每个等价类具有相同的性质,从而减少测试用例的数量。对于 left 函数,可以将输入数据分为以下等价类:
- count 小于等于 0 的整数
- count 大于等于字符串长度的整数
- count 在 0 和字符串长度之间的整数
边界值分析是针对输入数据的边界值进行测试,以发现可能存在的错误。对于 left 函数,可以将输入数据的边界值定义为:
- count = 0
- count = 1
- count = 字符串长度-1
- count = 字符串长度
- count > 字符串长度
错误猜测法是在函数的实现过程中,根据经验和常识猜测可能出现的错误。对于 left 函数,可以猜测出现以下错误:
- des 缓冲区长度不足以容纳结果字符串
- src 字符串为空
2. 测试用例设计
根据以上黑盒测试方法,设计出测试用例表格如下:
| 测试用例编号 | 输入数据 | 期望输出数据 | 备注 | | :-----------: | :------- | :----------- | :--- | | 1 | des 长度不足 | NULL | 测试 des 长度小于结果字符串长度 | | 2 | src 为空 | NULL | 测试 src 为空字符串 | | 3 | count <= 0 | 空字符串 | 测试 count 小于等于 0 的情况 | | 4 | count = 1 | 字符串的第一个字符 | 测试 count = 1 的情况 | | 5 | count = 字符串长度-1 | 字符串的前 n-1 个字符 | 测试 count = 字符串长度-1 的情况 | | 6 | count = 字符串长度 | src 字符串 | 测试 count = 字符串长度 的情况 | | 7 | count > 字符串长度 | src 字符串 | 测试 count > 字符串长度 的情况 |
3. 代码修改与调试
在进行测试时,发现程序在处理 des 缓冲区长度小于结果字符串长度时会出现错误。经过排查,发现是在 for 循环中没有添加越界判断,导致程序出现越界错误。修改后的代码如下:
char* left(char* des, int size, char* src, int count) {
int src_length;
char *p,*q;
int char_num,i;
if(count + 1 <= size) {
src_length = 0;
char_num = count;
p = des;
q = src;
while(*q != '\0') {
src_length++;
q++;
}
q = des;
if(char_num >= src_length)
char_num = src_length;
for(i=1;i <= char_num && i <= size;i++) { // 添加越界判断
*p = *q;
p++;
q++;
}
*p = '\0';
}
return des;
}
4. 白盒测试
白盒测试是根据函数的内部实现来设计测试用例,以达到测试覆盖率达到100%的目标。在进行白盒测试时,可以采用语句覆盖、条件覆盖、分支覆盖、C/DC、MC/DC、路径覆盖等方法。
针对 left 函数,可以设计以下测试用例:
| 测试用例编号 | 输入数据 | 期望输出数据 | 备注 | | :-----------: | :------- | :----------- | :--- | | 1 | des 长度不足 | NULL | 测试 des 长度小于结果字符串长度 | | 2 | src 为空 | NULL | 测试 src 为空字符串 | | 3 | count <= 0 | 空字符串 | 测试 count 小于等于 0 的情况 | | 4 | count = 1 | 字符串的第一个字符 | 测试 count = 1 的情况 | | 5 | count = 字符串长度-1 | 字符串的前 n-1 个字符 | 测试 count = 字符串长度-1 的情况 | | 6 | count = 字符串长度 | src 字符串 | 测试 count = 字符串长度 的情况 | | 7 | count > 字符串长度 | src 字符串 | 测试 count > 字符串长度 的情况 | | 8 | src 为单个字符 | src 字符串的第一个字符 | 测试语句覆盖 | | 9 | count = 0 | 空字符串 | 测试条件覆盖 | | 10 | count = 字符串长度-1 | 字符串的前 n-1 个字符 | 测试分支覆盖 | | 11 | count = 字符串长度 | src 字符串 | 测试 C/DC | | 12 | count > 字符串长度 | src 字符串 | 测试 MC/DC | | 13 | src 为单个字符 | src 字符串的第一个字符 | 测试路径覆盖 |
经过白盒测试,发现语句覆盖、条件覆盖、分支覆盖、C/DC、MC/DC、路径覆盖都已经达到100%,并且没有失败的断言。
5. 性能测试
性能测试是为了测试程序在不同负载下的性能表现。在进行性能测试时,需要选择不同的负载,并记录程序的运行时间和资源占用情况。
针对 left 函数,可以设计以下性能测试用例:
| 测试用例编号 | 输入数据 | 期望输出数据 | 备注 | | :-----------: | :------- | :----------- | :--- | | 1 | count = 1 | 字符串的第一个字符 | 测试单个字符的情况 | | 2 | count = 字符串长度 | src 字符串 | 测试完整字符串的情况 | | 3 | count > 字符串长度 | src 字符串 | 测试大于字符串长度的情况 | | 4 | count = 100 | 字符串的前100个字符 | 测试较大的 count 值的情况 | | 5 | count = 1000 | 字符串的前1000个字符 | 测试非常大的 count 值的情况 |
经过性能测试,发现 left 函数在不同负载下表现良好,运行时间和资源占用情况都在可接受的范围内。
6. 结论
通过本次实验,我们对单元测试的方法和流程有了更深刻的了解。在测试过程中,我们通过黑盒测试和白盒测试,设计了全面的测试用例集合,并发现了代码中的缺陷。在修正缺陷后,通过白盒测试和性能测试,我们确认了 left 函数的正确性和性能表现。
原文地址: http://www.cveoy.top/t/topic/ojyY 著作权归作者所有。请勿转载和采集!