1. 程式人生 > >《程式設計珠璣》程式碼之路8:自動化測試

《程式設計珠璣》程式碼之路8:自動化測試

這次的內容會比較輕鬆,一段程式碼寫好了,如何保證它是正確的?

比如就寫好了一個二分查詢吧,確定它正確?手動的話,估計是個正常人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。