利用Python如何實現數據驅動的接口自動化測試

前言python

你們在接口測試的過程當中,不少時候會用到對CSV的讀取操做,本文主要說明Python3對CSV的寫入和讀取。下面話很少說了,來一塊兒看看詳細的介紹吧。json

一、需求app

某API,GET方法,token,mobile,email三個參數函數

  • token爲必填項
  • mobile,email 必填其中1項
  • mobile爲手機號,email爲email格式

二、方案post

針對上面的API,在作接口測試時,須要的測試用例動輒會多達10+, 這個時候採用數據驅動的方式將共性的內容寫入配置文件或許會更合適。學習

這裏考慮把API、參數、以及預期結果預行在格式化的CSV裏保存,利用csv組件從CSV裏讀取URL、參數以及預期結果,Requests組件發起請求,將響應結果與預期結果進行比對,最後把比對結果寫到結果CSV。測試

流程以下圖 url

 

三、實現spa

一、在上代碼以前,先安裝好以下幾個組件:.net

  • csv  讀寫CSV文件
  • json
  • requests  發起請求,獲取響應結果
  • unittest    測試用例調度

二、data.csv(本示例選取部分用例)

 

三、reader_CSV函數代碼示例

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import csv
import json
import requests
import time
import unittest
def readCSV( self ,filename):
  '''
  :param filename: 須要讀取的數據文件
  :return: [{data1},{data2}...]
  '''
  datas = []
  try :
  #以DictReader的方式讀取數據文件,方便與json互作轉換
  with open (filename, 'r' ) as csvfile :
  #從文件裏讀取到的數據轉換成字典列表的格式
  reader = csv.DictReader(csvfile)
  for row in reader:
  data = {}
  data[ 'id' ] = row[ 'id' ]
  data[ 'url' ] = row[ 'url' ]
  data[ 'token' ] = str (row[ 'token' ])
  data[ 'mobile' ] = row[ 'mobile' ]
  data[ 'email' ] = row[ 'email' ]
  data[ 'expect' ] = json.dumps(row[ 'expect' ]) \
  if isinstance (row[ 'expect' ], dict ) \
  else row[ 'expect' ] #若是expect讀取出來的不是json則取其原值,不然轉爲json格式保存到result裏
  datas.append(data)
  return datas
  #若是文件找不到,返回空的datas
  except FileNotFoundError:
  print ( "文件不存在" ,filename)
  return datas

四、request_URL函數示例(包含GET請求和POST請求2個方法)

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_request( self ,url,params):
  '''
  通用的調用GET接口方法
  :param url:string 接口路徑
  :param params:{"":"","":""} 須要傳入的參數
  :return: response響應體
  '''
  print ( "調用API..." )
  r = requests.get(url,params = params)
  print (r.text)
  return r
def post_request( self ,url,params):
  '''
  通用的調用POST接口方法
  :param url: string 接口路徑
  :param params: {"":"","":""} 須要傳入的參數
  :return:response響應體
  '''
  print ( "調用API..." )
  r = requests.post(url,params = json.dumps(params)) #post的方法必須用json.dumps()轉化成json格式
  print (r.text)
  return r

五、assert_Result函數示例

1
2
3
4
5
6
7
8
9
def assertResult( self ,except_value,real_value):
  '''
  校驗樣本字符串中是否包含指定字符串
  :param except_value: string 指定字符串
  :param real_value: string 樣本字符串
  :return: Boolean 樣本中包含指定字符串返回True,不然返回False
  '''
  ifsuccess = except_value in str (real_value)
  return ifsuccess

六、write_CSV函數示例

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def writeCSV( self ,filename,results):
  '''
  寫入csv文件指定內容
  :param filename: string 須要寫入的文件名稱
  :param results: [{data1},{data2},...] 寫入的內容
  :return: 無
  '''
  print ( "寫文件:" ,filename)
  #以DictWriter的方式寫文件
  with open (filename, 'w+' ) as csvfile:
  headers = "id,url,token,mobile,email,expect,real_value,assert_value" .split( "," )
  writer = csv.DictWriter(csvfile,fieldnames = headers)
  #寫表頭
  writer.writeheader()
  #寫數據
  if results.__len__() > 0 :
  for result in results:
  writer.writerow(result)
  csvfile.close()

七、test_interface1函數示例

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def test_interface1( self ):
 
  #指定讀取的數據文件名稱
  data_file = "../data/data.csv"
 
  #指定最終結果生成的數據文件名稱
  result_file = "../data/result_{}.csv" . format ( str (time.time()).split( "." )[ 0 ])
 
  #讀取指定文件的數據
  datas = self .readCSV(data_file)
 
  #數據文件有內容則調用接口,不然直接測試結束
  if datas.__len__() > 0 :
  results = []
 
  #獲取數據文件裏的每一行
  for testcase in datas :
  result = {}
  result[ "id" ] = testcase[ "id" ]
  result[ "url" ] = testcase[ "url" ]
  result[ "token" ] = testcase[ "token" ]
  result[ "mobile" ] = testcase[ "mobile" ]
  result[ "email" ] = testcase[ "email" ]
  result[ "expect" ] = testcase[ "expect" ]
 
  #組裝參數
  params = {
  "token" :result[ "token" ],
  "mobile" :result[ "mobile" ],
  "email" :result[ "email" ]
  }
 
  #調用API接口,獲取響應結果
  real_value = self .get_request(result[ "url" ],params)
 
  #調用assert方法,檢查預期結果是否在響應結果中存在
  assert_value = self .assertResult(result[ "expect" ],real_value.text)
  result[ "real_value" ] = real_value.text
  result[ "assert_value" ] = assert_value
  #獲取每一行裏的全部字段以及實際結果和驗證結果
  results.append(result)
  #執行完全部記錄後,將全部結果寫入result.csv
  self .writeCSV(result_file,results) #寫入csv文件
  print ( "測試結束" )

八、result_1523956055.csv(本示例中的測試結果請忽略)

 

 

總結

python封裝了不少方法,對於測試來講開發速度相對較快,接口自動化測試若是採用CSV管理的數據驅動方式,使用csv+requests是測試開發不容錯過的利器之一。

好了,以上就是這篇文章的所有內容了,但願本文的內容對你們的學習或者工做具備必定的參考學習價值,若是有疑問你們能夠留言交流,謝謝你們對腳本之家的支持。

 

轉載地址:https://www.jb51.net/article/139908.htm

相關文章
相關標籤/搜索