介面測試時依賴前置資料的問題解決了...

guolong123 發表於 2020-09-22

相信做過介面自動化測試的同學都有遇到過這樣的問題,就是測試的介面依賴於某些資料的存在才能正常執行。而這些前置資料的維護是非常麻煩的,我想到的大概有三種處理方式:

  1. 維護好測試環境中的資料,在執行測試前,保證介面依賴的資料在資料庫中都存在即可。
  2. 呼叫前置用例(方法)來實時造資料,比如登入時,先呼叫註冊介面來生成一個賬號。
  3. 直接往資料庫裡面插,登入時往使用者表插一條資料就好了。

這三種方式各有各的好,也有不好:

方法1:

優點:
1. 簡單,測試用例只關注測試用例本身,不用管前置資料的問題;
缺點:
1. 資料維護是個問題,比較難維護。資料的增刪改都有可能造成用例不通過。
2. 用例維護問題,因為用例依賴的資料是固定現成的,在資料變化後用例程式碼都需要變

方法2:

優點: 資料真實,業務完整
缺點: 場景複雜時前置用例可能非常多,一個場景出問題可能導致後續用例都失敗(比如登入失敗了,那幾乎全部都會失敗)

方法3:

優點:簡單,直接,要什麼就插什麼
缺點:業務複雜時可能一個業務場景要在N張表中插入資料,得一個個處理。工作量大。比如:插入一個使用者資料,一般使用者資料會包括使用者賬號表,使用者角色表、使用者屬性表...

第四種方法

還是基於在資料庫中直接生成資料的這種方式,好在是可以通過配置檔案來描述資料庫表之間的關聯關係;支援批量插入多條有業務關聯的資料;使用者只需要在配置檔案中描述表欄位的生成規則以及表之間的關聯關係即可。
配置檔案模板可通過內建工具一鍵生成,生成後只需要完善欄位生成規則;
配置檔案示例如下:

package:
- datetime # 匯入額外的包,在jinja2模板中使用(下面有用到datetime包,所以要先匯入)
env:
id:
engine: faker.uuid
rule: null
time_format:
engine: faker.eq
rule:
value: "%Y-%m-%d %H:%M:%S"
tables:
- columns:
- column: id
comment: 資料主鍵id
engine: faker.eq
rule:
value: '{{ env.id }}' # 通過引用環境變數中的值
- column: name
comment: 姓名
engine: faker.name
rule: null
- column: idcard
comment: 身份證號
engine: faker.ssn
rule: null
- column: age
comment: 年齡
engine: faker.eq
rule:
value: '{{ datetime.datetime.now().year - int(stu.idcard[6:10]) }}' # 通過jinja2模板直接計算
- column: sex
comment: 性別
engine: faker.eq
rule:
value: '{{ "man" if int(stu.idcard[-2]) % 2==1 else "female" }}' # 通過jinja2模板直接計算
comment: ''
table: stu
- columns:
- column: id
comment: 資料主鍵id
engine: faker.uuid
rule: null
- column: stu_id
comment: 資料主鍵id
engine: faker.eq
rule:
value: '{{ stu.id }}' # 通過其他表中的值
- column: course_name
comment: 課程名稱
engine: faker.choice # 通過內建方法從列表中隨機取一個值
rule:
value: [數學,語文,英語,化學,地理]
- column: course_time
comment: 上課時間
engine: faker.now # 通過內建方法獲取當前時間,並按照指定格式返回
rule:
format: "{{ env.time_format }}"
comment: '課程資訊 '
table: course

具體安裝使用方法參考:dbfaker