測試資料之自動生成
最近在學習排序演算法的時候,需要利用程式自動生成測試資料,程式碼和思路整理在這篇文章裡面。
文章圖片來源於 GitHub,網速不佳的朋友請點我看原文。
順便軟廣一下個人技術小站:https://godbmw.com。歡迎常來 ♪(∇*)
1. 設計思路
因為會被很多排序演算法呼叫,所以,資料自動生成程式碼應該放在.h
標頭檔案中。為了防止命名衝突,函式被封裝在“名稱空間”中(程式碼中名稱空間是: SortTestHelper
)。
而對於排序來說,自動生成資料的型別需要有以下幾種:
-
[a, b]
範圍內的n
個隨機資料,比如:1、2、100、-1... -
n
個近乎有序的資料,比如:1、2、3、7、5、6、4... -
n
個近乎相同的資料,比如:1、1、1、2、2、2、2、2...
除此之外,還需要陣列淺拷貝、列印的函式,以及驗證是否排序成功和測試排序時間的函式。
2. 用的知識點
-
srand(time(NULL))
與rand()
: 設立隨機種子,生成隨機數 -
clock()
: 用來演算法執行前後的計算時鐘週期差值,再除以CLOCKS_PER_SEC
即為執行秒數。 - 函數語言程式設計 : 使用函式指標,方便呼叫和測試排序函式
其中rand()
函式能生成 0 到MAX_INT
之間的隨機整數。如果想生成[0, n)
之間的整數,需要取餘操作:int x = rand() % n;
;如果想生成[left, right]
之間的整數,需要進行偏移:int x = rand() % (right - left + 1) + left;
3. 程式碼實現
//
// Created by GodBMW.com on 2018/9/11.
//
#ifndef BASESORT_SORTHELPER_H
#define BASESORT_SORTHELPER_H
#include <iostream>
#include <string>
#include <ctime>
#include <cassert>
using namespace std;
namespace SortTestHelper {
// 生成[left, right]範圍內n個隨機數
template <typename T>
T* generateRandomArray(int n, int left, int right) {
assert( left <= right );
T *arr = new T[n];
srand(time(NULL)); // set random seed
for(int i = 0; i < n; i++) {
arr[i] = rand() % (right - left + 1) + left;
}
return arr;
}
// 生成[0, n)範圍內n個近乎有序的隨機數
template <typename T>
T* generateNearlyOrderedArray(int n, int swap_times) {
T *arr = new T[n];
srand(time(NULL));
// 先生成長度為n的有序陣列
for(int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// 隨機選取其中2個資料,交換 swap_times 次
for(int i = 0; i < swap_times; i++) {
int pos_x = rand() % n;
int pos_y = rand() % n;
swap(arr[pos_x], arr[pos_y]);
}
return arr;
}
template <typename T>
T* copyArray(T arr[], int length) {
T* brr = new T[length]; // 注意檢查brr陣列大小
copy(arr, arr + length, brr);
return brr;
}
template <typename T>
void printArray(T arr[], int length) {
for(int i = 0; i < length; i++) {
cout<< arr[i] << " ";
}
cout<< endl;
return;
}
template <typename T>
bool isSorted(T arr[], int length) {
for(int i = 0; i < length-1; i++) {
if(arr[i] > arr[i + 1]) {
return false;
}
}
return true;
}
// 第三個引數是函式指標,傳入後,可以在本函式內執行被傳入的函式
template <typename T>
void testSort(T arr[], int length, void(*sort)(T[], int), string name) {
clock_t startTime = clock();
sort(arr, length);
clock_t endTime = clock();
assert(isSorted(arr, length));
cout << name << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " seconds" << endl;
// endTime - startTime: 時鐘週期
return;
}
}
#endif //BASESORT_SORTHELPER_H
我們沒有實現第二部分所說的 生成n
個近乎相同的資料,比如:1、1、1、2、2、2、2、2...。因為可以藉助 generateRandomArray
函式,比如:SortTestHelper::generateRandomArray(10000, 0, 10)
。生成[0,10]區間內 10000 個整數,那麼不就是近乎相同的嗎?
相關文章
- mysql 動態生成測試資料MySql
- 開源神器:自動生成隨機 mock 資料測試物件隨機Mock物件
- 自動化測試如何管理測試資料
- 自動化測試資料生成:Asp.Net Core單元測試利器AutoFixture詳解ASP.NET
- python介面自動化測試之介面資料依賴Python
- 基於儲存過程的百萬級測試資料自動生成儲存過程
- Mock生成測試資料Mock
- shell生成測試資料
- 自動的自動化:EvoSuite 自動生成JUnit的測試用例UI
- 測者的測試技術手冊:自動的自動化EvoSuite 自動生成JUnit的測試用例UI
- laravel seed生成測試資料Laravel
- lavavel 自動生成資料字典
- 測試開發之自動化篇-自動化測試框架設計框架
- 請問自動化測試應該測試非法資料嗎
- Jmeter 介面自動化連載 (13) - 自動生成測試報告JMeter測試報告
- 介面自動化測試-apiAutoTest 優化之資料依賴處理API優化
- Android 自動化測試之 MonkeyAndroid
- UI自動化測試之AirtestUIAI
- 介面自動化使用requests生成測試報告測試報告
- 求助帖:JMeter 介面自動化測試——資料驅動JMeter
- MySQL 資料庫生成 10000 條測試資料MySql資料庫
- Python自動化測試-使用Pandas來高效處理測試資料Python
- AutoRunner 功能自動化測試專案實訓之自動化測試原理(一)
- Wings-讓單元測試智慧全自動生成
- 基於LangChain手工測試用例轉App自動化測試生成工具LangChainAPP
- 基於LangChain手工測試用例轉Web自動化測試生成工具LangChainWeb
- 基於LangChain手工測試用例轉介面自動化測試生成工具LangChain
- 自動化測試系列 —— UI自動化測試UI
- 如何優雅地生成測試資料
- Python factory_boy 生成測試資料Python
- 功能測試之存量資料新與增資料測試
- 如何利用showdoc自動生成資料字典
- mysql資料庫語句自動生成MySql資料庫
- Python自動化測試之獲取配置檔案資訊Python
- 前端自動化測試之葵花寶典前端
- 大資料包表如何進行自動化測試大資料
- 大資料測試之ETL大資料
- Mysql生成100w條測試資料MySql