这次的内容会比较轻松,一段代码写好了,如何保证它是正确的?
比如就写好了一个二分查找吧,确定它正确?手动的话,估计是个正常人10次就哭了。所以如果能自动执行的话,那就很开心了。
为了做到自动化测试,我们需要用到下面语句:
assert(i >= 0):在i大于或者等于0的时候正常执行,否则报错。
下面给出了一个编写自动化代码测试的姿势:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cassert>
using namespace std;
vector<int> nums; //存储要搜索数组的vector
int target = 123; //要搜索的目标
// 如果不正常的话反回-1
int BinarySearch(vector<int> &arr, int target);
int main(){
freopen("in.txt", "r", stdin);
for (int i = 0; i < 800; ++i){
cout << "n = " << i << endl;
nums.clear();
for (int j = 0; j <= i; ++j){
nums.push_back(j * 10);
}
for (int j = 0; j < i; ++j){
assert(BinarySearch(nums, 10 * j) == j);//如果找到的话,检查位置是否正确
assert(BinarySearch(nums, 10 * j - 1) == -1);//查找不存在元素,检查是否返回-1。
}
}
return 0;
}
int BinarySearch(vector<int> &arr, int target){
if (arr.size() == 0){
return -1;
}
int left = 0, right = arr.size() - 1;
while (left <= right){
int mid = (left + right) / 2;
if (arr[mid] == target){
return mid;
}else if (arr[mid] < target){
left = mid + 1;
}else if (arr[mid] > target){
right = mid - 1;
}else{
return -1;
}
}
return -1;
}
可以看到,我们自动化地进行了800次测试,每次生成i个数,每次数组里生成下标*10的数字,那么20就在下标2的位置,0就在0的位置。
这样通过下面两句代码反复测试查找的位置和不存在的元素结果是否正确。
assert(BinarySearch(nums, 10 * j) == j);//如果找到的话,检查位置是否正确
assert(BinarySearch(nums, 10 * j - 1) == -1);//查找不存在元素,检查是否返回-1。