python3+requests+unittest接口自動化實例講解

前言html

這個季度初的時候,咱們公司管理層提出了全面提高部門技術水準的要求,而做爲項目開發流程中最重要的一環——測試,咱們也是有本身的技術追求的,因此爲了,由原來的業務功能測試轉變成自動化測試。以前大多都是手工進行,利用postman和fiddler進行抓包和截取數據,後來,通過你們的討論,決定基於python學習,開始搞接口自動化,通過你們的努力,這套自動化框架目前已經基本完成了,因而進行一些總結,便於之後回顧溫習,有許多不完善的地方,你們能夠留言一塊兒討論研究,共同進步。python

首先,咱們能夠捋一捋思路,想想接口測試的流程json


其次,選擇合適的框架bash

流程清晰以後,咱們須要選擇一個合適的框架,因而選擇了Python3+requests+unittest框架網絡

Requests模塊發送http的網絡請求,請求類型主要包含了post,get, PUT,DELETE,HEAD架構

python+unittest單元測試框架構成,和測試報告生成(HTMLTestRunner)框架

框架詳解不在此贅述,requests可參考 點擊前往函數

unittest參考 點擊前往post

基於以上,咱們來一步步搭建咱們的框架。在這個過程當中,咱們須要作到業務和數據的分離,這樣才能靈活,達到咱們寫框架的目的。接下來,咱們來進行結構的劃分。單元測試

咱們的結構是這樣的


data:存放自動化測試所用到的數據文檔

log:存放生成的日誌文件

base:存放公共的方法

report:存放生成的自動化測試報告

testcase:存放測試腳本

接下來,公共方法的開發

總體結構有了劃分,接下來就該一步步的填充整個框架了,咱們先來看看Base文件中的公共類或函數,這主要用於後續測試case的調用,全部公共的、一成不變的數據均可以放在這裏,維護也方便

配置文檔以下

[DATABASE]
data_address = ./data/
report_address = ./report/

[HTTP]
base_url = http://xxx.xx

複製代碼複製代碼

想知道怎樣從配置文檔中獲得或寫入相應的數據嗎?那繼續看吧

import os
import configparser

# 獲取當前py文件地址
proDir = os.path.split(os.path.realpath(__file__))[0]
# 組合config文件地址
configPath = os.path.join(proDir,"config.ini")

class ReadConfig:
    def __init__(self):
        #獲取當前路徑下的配置文件
        self.cf = configparser.ConfigParser()
        self.cf.read(configPath)

    def get_config(self,field,key):
        #獲取配置文件中的key值
        result = self.cf.get(field,key)
        return result

    def set_config(self,field,key,value):
        #向配置文件中寫入配置信息
        fb = open(configPath,'w')
        self.cf.set(field,key,value)
        self.cf.write(fb)

複製代碼複製代碼

那問題又來了,咱們的測試數據放在哪裏?怎麼取值?怎麼寫入?怎麼保存?。。。

別急,接着往下看

測試數據優先考慮放在excel或database中,此處以excel爲例作個簡單介紹

這裏須要用到兩個操做表格的庫,xlrd數據驅動的讀取,做用於excel文檔,但xlrd不能寫入數據,因此引入xlutils數據驅動的讀取和寫入

安裝方法能夠用pip3 install xlrd和pip3 install xlutils 來安裝。

import xlrd
import xlutils.copy
from Base.readConfig import ReadConfig
import time

class ReadExcel:

    def __init__(self,section,field,sheet):
        # 打開工做表,並定位到sheet
        data_address = ReadConfig().get_config(section,field)
        workbook = xlrd.open_workbook(data_address)
        self.table = workbook.sheets()[sheet]


    def get_rows(self):
        # 獲取excel行數
        rows = self.table.nrows
        return rows

    def get_cell(self,row,col):
        # 獲取單元格數據
        cell_data = self.table.cell(row,col).value
        return cell_data

    def get_col(self,col):
        # 獲取整列數據
        col_data = self.table.col_value(col)
        return col_data

class WriteExcel:
    def __init__(self,section,field,sheet):
        # 打開工做表
        self.address = ReadConfig().get_config(section,field)
        self.workbook = xlrd.open_workbook(self.address)
        self.wf = xlutils.copy.copy(self.workbook)
        self.ws = self.wf.get_sheet(sheet)

    def set_cell(self,row,col,value):
        #設置單元格數據
        self.ws.write(row,col,value)

    def save_excel(self,filename,format):
        #獲取當前時間
        self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
        #生成文件的文件名及格式
        self.report = filename + '_' +self.time + format
        #保存文件
        self.wf.save(self.report)


複製代碼複製代碼

而後,測試腳本的編輯

一切準備就緒,下面經過一個簡單的、完整的代碼進行演示公共函數的調用,框架的使用及報告的生成

import unittest
import requests
from Base.readConfig import ReadConfig
from Base.readExcel import ReadExcel
from Base.readExcel import WriteExcel
#實例化
readexcel = ReadExcel('DATABASE','data_address',0)
writeexcel = WriteExcel('DATABASE','data_address',0)

class testcase(unittest.TestCase):
    #初始化
    def setUp(self):
        #獲取url
        self.base_url = ReadConfig().get_config('HTTP', 'base_url')
        self.url = self.base_url + readexcel.get_cell(1,1)
        #獲取請求頭
        self.headers = readexcel.get_cell(1,4)

    def test_case(self):
        nok = 0
        ner = 0
        # 循環讀取excel中的測試數據,進行結果驗證,並生成excel形式的測試報告
        for i in range(3,readexcel.get_rows()):
            #發送網絡請求,獲得響應值
            response = requests.post(self.url, headers=self.headers,   data=readexcel.get_cell(i,4).encode('utf-8'))
            actualresult = response.json()
            #獲取excel中的預期結果
            expectresult = eval(readexcel.get_cell(i,6))
            # 獲取需驗證的數據
            key = eval(readexcel.get_cell(i, 5))
            keylen = len(key)
            j = 0
            for k in range(keylen):
                aresult = 'actualresult' + key[k]
                eresult = 'expectresult' + key[k]
                if eval(aresult) == eval(eresult):
                    #預期結果和實際結果一致
                    j = j + 1
            if j == keylen:
                #測試數據執行經過
                nok = nok + 1
                writeexcel.set_cell(i, 8, 'SUCCESS')
            else:
                # 測試數據執行失敗,並將實際結果寫入excel
                ner = ner + 1
                writeexcel.set_cell(i, 8, 'FAILURE')
                writeexcel.set_cell(i, 7, str(actualresult))
                print('第', i + 1, '行用例執行失敗:預期結果是', expectresult, '實際結果是', actualresult)
            # 保存測試報告
            writeexcel.save_excel('testreport', '.xls')
            print('測試數據中總共', nok, '條用例執行經過', ner, '條用例執行失敗')

    #釋放資源
    def tearDown(self):
        pass

if __name__ == '__main__':
    #構造測試集合
    suite = unittest.TestSuite()
    suite.addTest(testcase('test_case'))
    #建立html文件
    filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
    fb = open(filename,"wb")
    #執行測試並生成html測試報告
    runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '針對接口的描述信息',title = '某某的自動化測試報告')
    runner.run(suite)
    #關閉文件
    fb.close()

複製代碼複製代碼

最後,生成的html報告


以上是最近總結的部分紅果,但願對你們有幫助,後續會陸續更新,也請你們多多留言,互相交流互相成長

相關文章
相關標籤/搜索