单元测试 findr 函数:要求选择合适的黑盒测试方法设计测试用例套集;利用 VU 进行执行 单元测试。如果发现有软件缺陷,利用调试画板调试,确定错误具体位置,修改代码排 除缺陷,在作业中要标明代码中错误的具体位置以及如何改;打开边界测试开关,做进一 步测试;完成白盒测试,使得语句覆盖、条件覆盖、分支覆盖、C/DC、MC/DC、路径覆 盖均达到 100%并且无失败断言,打开性能测试开关完成性能测试。
时间: 2023-12-10 22:37:06 浏览: 169
单元测试中测试用例的设计方法
由于没有提供 findr 函数的具体实现,因此我将以一个示例函数为例进行测试和调试。
示例函数如下:
```python
def findr(lst, val):
"""
查找列表 lst 中最后一个等于 val 的元素的下标。
如果列表中不存在等于 val 的元素,则返回 -1。
"""
n = len(lst)
for i in range(n - 1, -1, -1):
if lst[i] == val:
return i
return -1
```
下面是对该函数进行的黑盒测试和白盒测试。
## 黑盒测试
### 等价类划分
根据函数的输入和输出,可以将输入空间划分为以下等价类:
- 空列表
- 列表中不存在等于 val 的元素
- 列表中存在等于 val 的元素,但只出现一次
- 列表中存在等于 val 的元素,且出现多次
针对每个等价类,设计一个测试用例:
| 输入 | 预期输出 |
| ---- | -------- |
| [] | -1 |
| [1, 2, 3], 4 | -1 |
| [1, 2, 3], 2 | 1 |
| [1, 2, 2, 3], 2 | 2 |
### 边界值分析
对于输入空间中的每个变量,找到其取值范围的边界,在这些边界值处进行测试。
- 空列表
- 只有一个元素的列表,该元素等于 val 或不等于 val
- 有多个元素的列表,第一个元素等于 val 或不等于 val,最后一个元素等于 val 或不等于 val
针对每个边界值,设计一个测试用例:
| 输入 | 预期输出 |
| ---- | -------- |
| [], 1 | -1 |
| [1], 1 | 0 |
| [2], 1 | -1 |
| [1, 2], 2 | 1 |
| [1, 2], 1 | 0 |
| [2, 1], 1 | 1 |
| [1, 2, 3], 3 | 2 |
| [1, 2, 3], 1 | 0 |
| [3, 2, 1], 1 | 2 |
| [1, 2, 2, 3], 2 | 2 |
## 白盒测试
### 语句覆盖
执行每一条语句至少一次,使得语句覆盖率达到 100%。
```python
def test_findr_statement_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### 条件覆盖
使得每个条件都至少被执行一次,使得条件覆盖率达到 100%。
```python
def test_findr_condition_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### 分支覆盖
使得每个分支都至少被执行一次,使得分支覆盖率达到 100%。
```python
def test_findr_branch_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### C/DC
使得每个条件的每个判定结果都至少被执行一次,使得条件/决策覆盖率达到 100%。
```python
def test_findr_cdc_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### MC/DC
使得每个条件的每个判定结果都至少被执行一次,并且每个条件的每个判定结果与其他条件的判定结果组合都至少被执行一次,使得条件/决策-修改条件覆盖率达到 100%。
```python
def test_findr_mcdc_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### 路径覆盖
使得每个可能的程序执行路径都至少被执行一次,使得路径覆盖率达到 100%。
```python
def test_findr_path_coverage():
assert findr([], 1) == -1
assert findr([1], 1) == 0
assert findr([2], 1) == -1
assert findr([1, 2], 2) == 1
assert findr([1, 2], 1) == 0
assert findr([2, 1], 1) == 1
assert findr([1, 2, 3], 3) == 2
assert findr([1, 2, 3], 1) == 0
assert findr([3, 2, 1], 1) == 2
assert findr([1, 2, 2, 3], 2) == 2
assert findr([1, 2, 2, 3], 4) == -1
```
### 调试和性能测试
在进行上述测试时,如果发现有软件缺陷,可以利用调试器确定错误具体位置,并修改代码排除缺陷。同时,在完成白盒测试后,可以进行性能测试,以确定函数的性能指标,比如时间复杂度和空间复杂度。
阅读全文