軟體測試中通用資料生成方法

2021-04-29 20:06:44 字數 3851 閱讀 5443

軟體測試中非常重要的乙個工作就是生成和維護測試資料,而這個工作恰恰是繁瑣、重複而極易出錯的。無疑找到一種通用的資料生成方法是極具意義的。本文闡釋了如何使用指令碼語言 php,加上簡單的 ini 配置檔案來達到這個目的的。

測試資料的生成和維護在測試中是非常重要的一環。很多用例實際上就是在修改所測程式的輸入資料以確保程式的邏輯是按照自己的預期進行地。

比如我們測試乙個使用者登入系統,我們需要測試正常使用者名稱 + 正常密碼、正常使用者名稱 + 錯誤密碼、錯誤使用者名稱 + 錯誤密碼等基本的用例。在執行用例之前,就需要事先在資料庫中設定好相應的資料,比如有一條記錄為正常使用者名稱 + 正常密碼,然後我們在登陸介面輸入該使用者名稱和密碼,預期結果為正常登陸。

不同的程式有不同格式的輸入資料。但不管格式千變萬化,我們總可以把它們歸結為基於行和列的格式,就像資料庫中的表一樣。一行為一條記錄,每一條記錄都有相同的字段組成,每乙個欄位有自己的資料格式,欄位和字段之間可能有分隔符。

我們可以在執行每乙個用例時,手工修改資料,然後再執行用例。但這樣存在一些問題。

1. 重複,資料重用性差。當前用例所需的資料很有可能在下個用例中被破壞了。

2. 效率低,尤其是當資料格式比較複雜,而且又需要大量資料的時候。

3. 不靈活。但資料發生變動的時候,資料的維護成本會很高。

4. 容易出錯。

那有沒有一種方法來解決這個問題呢?答案是肯定的。下面我們一起來實現乙個簡單的工具來解決這個問題。

首先我們來列舉一下這個工具需要實現的基本功能:

1. 通用性:能夠描述各種不同格式的資料。

2. 擴充套件性:當需要新的資料格式時,可以任意擴充套件。

3. 易用性:配置檔案不易複雜。

4. 跨平台:我們需要一款可以在windows、linux、freebsd等系統下面執行的工具。

我們選擇的開發工具是 php,配置檔案採用了 ini 格式的檔案。

之所以選擇 php,是因為 php 是解釋性指令碼語言,其弱型別的特點以及強大的陣列、字串處理功能,十分適合我們這種應用場合。而且 php 有著良好的擴平台性,使用 php 開發的指令碼基本上不用修改就可以在各個平台下面執行。

之所以選擇 ini 格式的檔案來作為配置,是因為 ini 檔案相比較於 xml 而言比較簡單。而且程式處理起來也非常的方便。在 php 中使用 parse_ini_file 的內建函式就可以解析整個 ini 檔案。

配置語法

首先我們需要來定義一下我們的配置語法。前面講到,資料是由行和列組成,每一列中有若干字段,每乙個欄位有自己的資料型別,有自己的字首,欄位和字段之間還有分隔符。我們最終的配置語法格式如下:

清單一:example.ini

[field1]

datatype="list, range=[10-20]"

prefix="int_"

postfix="  "

[field2]

datatype="list, range=[a-z, a-z]"

prefix="char_"

postfix="  "

[field3]

prefix=""

datatype="list, range=[abc,123,xyz, 100-110]"

postfix="  "

[field4]

prefix=""

datatype="list, range=[100-200:2]"

postfix="  "

我們來解釋一下語法的格式:

1. 欄位名使用引起來。後面使用 key=value 的形式來定義這個欄位的屬性。

2. 欄位有三個基本的屬性:datatype 指定欄位的取值範圍,prefix 設定欄位的字首,postfix 則設定欄位的字尾。

3. datatype 中最基本的資料型別就是 list,乙個無所不包的列表。你所需要指定的就是這個欄位的取值範圍引數 range。

4. range 引數可以採用 1-10 這樣的區間表達,也可以用逗號「 , 」來連線多個區間或者元素。區間還可以指定遞增的步長。

上面的 example.ini 檔案中定義了四個字段,欄位和字段之間使用兩個空格分隔,第乙個欄位的取值範圍為 10-20,字首為 int_,第二個字段取值範圍是大小寫英文本母,字首為 char_,第三個字段取值範圍是混合的,第四個欄位則從 100 到 200,遞增步長為 2 。

清單二:生成的資料

int_10  char_a  abc  100

int_11  char_b  123  102

int_12  char_c  xyz  104

int_13  char_d  100  106

int_14  char_e  101  108

int_15  char_f  102  110

int_16  char_g  103  112

int_17  char_h  104  114

int_18  char_i  105  116

int_19  char_j  106  118

**實現:

第一步:解析 ini 檔案

error_reporting(0);

$inifile   = $argv[1];  // 第乙個引數為配置檔案。

$datacount = $argv[2];  // 第二個引數為要生成的記錄數。

$fields    = parse_ini_file($inifile, true);    // 將 ini 配置檔案轉換為乙個陣列。

第二步:生成每乙個欄位的取值列表

foreach($fields as $fieldname => $field)

else }

$field['list']       = $list;    // 將最終的 list 列表賦值給 field 。

$field['pointer']    = 0;      // 初始化這個列表的指標。

$fields[$fieldname] = $field;  // 寫回整個 fields 陣列。

}第三步:迴圈輸出資料

/* 迴圈輸出資料。 */

for($i = 0; $i < $datacount; $i ++)

echo "/n"; }

這樣我們用了不到 50 行的**就完成了乙個基本的資料生成工具。這其實已經可以滿足基本的資料生成任務了。但是還需要進一步進行完善。

需要進一步完善的地方

第一:資料的擴充套件性

雖然 list 型別已經足夠靈活,但有時候還無法滿足需要。比如乙個比較複雜的字段,由若干小字段組成。這時可以將這個復合欄位再通過乙個 ini 檔案來定義,這樣就有了無限可能。

比如,我們在 example.ini 檔案中增加乙個日期的字段,格式為 yyyy 年 mm 月 dd 日的格式

清單三:example.ini 中新增乙個字段

[field5]

prefix=""

datatype="custom"    " 定義這個欄位的資料型別為 custom   

datacfg="custom.ini"   "  定義這個欄位的配置檔案為 custom.ini

postfix=""

清單四:custom.ini

[field5.1]

prefix=""

datatype="list, range=[1980-1999]"

postfix=" 年 "

[field5.2]

prefix=""

datatype="list, range=[1-12]"

postfix=" 月 "

[field5.3]

造資料時的快速生成方法

最近z老師要求出題目,出題目可以分為以下幾步 1.寫體面 2.造資料 寫標程 3.檢測一下 寫個說明 這篇文章就造資料這個過程來謝謝我的感悟並分享一些技巧 那這道分塊題為例 分塊入門4 blocks 4.cpp 時間限制 1s 記憶體限制 256m description 給定乙個長為n的序列,要求...

LeetCode 測試用例生成方法與輔助函式等

完整 github位址 public class utilds public static class treenode 首先是工廠 public inte ce testhelpe ctory 前言 寫的挺隨意的,當初寫的時候都是趕著趕緊測試。只要實現了這個功能就好。不保證邊際用例和最高效率 但使...

vs2010中moc檔案生成方法

qt 程式在交由標準編譯器編譯之 前,先要使用 moc 分析 c 原始檔。如果它發現在乙個標頭檔案中包含了巨集 q object,則會生成另外乙個 c 原始檔。這個原始檔中包含了 q object 巨集的實現 這個 新的檔案名字將會是原檔名前面加上 moc 構成。這個新的檔案同樣將進入編譯系統,最終...