- 有一个你想测试的方法a
- 实现一个绝对正确但是复杂度不好的方法b
- 实现一个随机样本产生器
- 实现比对的方法
- 把方法a和方法b比对很多次来验证方法a是否正确
- 如果有一个样本使得比对出错,打印样本分析是那个方法出错。
- 当样本很多时比对测试依然正确,可以确定方法a已经正确。
下面这个例子就是对归并排序的对数器的使用的测试。
void merge(vector<int> &arr, int l, int m, int r)
{
int i = 0;
int p1 = l;
int p2 = m + 1;
vector<int> help;
help.resize(r - l + 1);
while (p1 <= m && p2 <= r)
{
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m)
{
help[i++] = arr[p1++];
}
while (p2 <= r)
{
help[i++] = arr[p2++];
}
for (int j = 0; j < help.size(); ++j)
{
arr[l++] = help[j];
}
}
void mergesort(vector<int> &arr, int l, int r)
{
if (arr.size() < 2)
return;
if (l == r)
{
return;
}
int m = (l + r) / 2;
mergesort(arr, l, m);
mergesort(arr, m + 1, r);
merge(arr, l, m, r);
}
void comparator(vector<int>& arr)//绝对正确的排序方法
{
sort(arr.begin(), arr.end());
}
vector<int> generateRandomArray(int maxSize, int maxValue)//获取一个随机数组
{
vector<int> arr;
maxSize = (rand() % maxSize + 1);//获取一个小于等于maxSize大于0的随机值
arr.resize(maxSize);
for (int i = 0; i < maxSize; ++i)
{
arr[i] = (rand() % maxValue + 1);
}
return arr;
}
bool isEqual(vector<int>& arr1, vector<int> &arr2)
{
return arr1 == arr2;
}
void printArray(vector<int> &arr)
{
for (int val : arr)
{
cout << val << " ";
}
cout << endl;
}
int main()
{
int testTime = 5000;
int maxSize = 100;
int maxValue = 100;
bool succeed = true;
for (int i = 0; i < testTime; i++)
{
vector<int> arr1 = generateRandomArray(maxSize, maxValue);
vector<int> arr2 = arr1;
mergesort(arr1, 0, arr1.size() - 1);
comparator(arr2);
if (!isEqual(arr1, arr2))
{
succeed = false;
break;
}
}
if (succeed)
{
cout << "您的测试代码全都通过" << endl;
}
else
{
cout << "有测试用例出错" << endl;
}
}