1. 程式人生 > >python介面自動化實戰(框架)

python介面自動化實戰(框架)

     python介面測試的原理,就不解釋了,百度一大堆。

    先看目錄,可能這個框架比較簡單,但是麻雀雖小五臟俱全。

各個資料夾下的檔案如下:

一.理清思路

    我這個自動化框架要實現什麼

    1.從excel裡面提取測試用例

    2.測試報告的輸出,並且測試報告得包括執行的測試用例的數量、成功的數量、失敗的數量以及哪條成功了,失敗的是哪一個,失敗的原因是什麼;測試結果的總體情況通過圖表來表示。

    3.測試報告用什麼形式輸出,excel,還是html,還是其他的,這裡我選擇了excel

    4.配置檔案需要配置什麼東西

    5.哪些東西可以放入公共函式直接呼叫。

好的這些思路理清楚之後就可以動手了。

二.首先是配置檔案和excel測試用例的設計

    資料與程式碼分離,也就是資料性的需要作為配置檔案可以隨時修改。如:介面url,網站登入許可權驗證資訊,資料庫資訊。全部存入config資料夾下

下面是具體的配置檔案資訊:

API_url.txt

inserthouse=http://IP:port/scp-mdmapp/house/insertHouse
deletehouse=http://IP:port/scp-mdmapp/house/deleteHouse
batchdeletehouse=http://IP:port/scp-mdmapp/house/batchdeleteHouse
gethouse=http://IP:port/scp-mdmapp/house/getHouse
updatehouse=http://IP:port/scp-mdmapp/house/updateHouse

Authorization.txt

joxNTIxMTg3MTA3fQ.JyeCMMsM0tOr7exORUNpkZ-FtprjpNBhMtFjUAdnYDnhRfaR6qi3fqVkybyb245zONiTxLOw8jBR60oNUVEbKx9_cut6uDIZMUFYOx6hyyBkY9IXJlutYdo4sSMAKF_MjKsZY7bZNXLHzN0juiezn6iN0hbnbhS-Kv2LYLLZLTs

我的測試用例的設計如下:

notes是測試用例摘要。


三.公共函式存在common資料夾下

get_authorization.py

#從配置檔案獲取訪問許可權資訊
def get_Authorization():
	fp = open('D:\person\learn\py\HDapi\config\Authorization.txt')
	info = fp.read()
	fp.close()
	return info

public.py

import os,xlrd,xlwt,time

#通過配置檔案裡的介面名稱來獲取介面url的函式
def get_url(api_name):
	fp = open('D:\person\learn\py\HDapi\config\API_url.txt')
#按行讀取介面url配置檔案
	api_infos = fp.readlines()
	fp.close()
#通過for迴圈來遍歷配置檔案裡的每一個url,並且返回傳入的介面名稱相應的url
	for api in api_infos:
#去除因為讀取產生的換行空格等
		api_f = api.strip(' \r\n\t')
		api_c = api_f.split('=')
		if api_name == api_c[0]:
			return api_c[1]

#通過傳入用例名稱的檔案和excel頁面來讀取測試用例
def get_case(filename,sheetnum):
	case_dir='D:\\person\\learn\\py\\HDapi\\testcase_excel' + '\\' + filename + '.xlsx'

	datas = xlrd.open_workbook(case_dir)
	table = datas.sheets()[sheetnum]
	nor = table.nrows
	nol = table.ncols
	return nor,table

#通過xlwt庫來設計測試報告並寫入excel裡面
def write_report():
	workbook = xlwt.Workbook(encoding='utf-8')
#在excel測試報告表格中建立名叫housemanage的頁面
	worksheet = workbook.add_sheet('housemanage')
#設定字型格式為居中對齊
	alignment = xlwt.Alignment()
	alignment.horz = alignment.HORZ_CENTER
	alignment.vert = alignment.VERT_CENTER
	style = xlwt.XFStyle()
	style.alignment = alignment
	
#具體的合併哪些單元格並且寫入相應的資訊
	worksheet.write_merge(0,0,0,7,'測試報告(housemanage)',style)
	worksheet.write_merge(1,10,0,0,'house_manage',style)
	worksheet.write_merge(1,2,1,1,'insethouse',style)
	worksheet.write_merge(3,4,1,1,'updatehouse',style)
	worksheet.write_merge(5,6,1,1,'deletehouse',style)
	worksheet.write_merge(7,8,1,1,'gethouse',style)
	worksheet.write_merge(9,10,1,1,'updatehouse',style)
	worksheet.write_merge(1,2,11,11,'total_result',style)
	worksheet.write(1,2,'notes')
	worksheet.write(2,2,'detail')
	worksheet.write(3,2,'notes')
	worksheet.write(4,2,'detail')
	worksheet.write(5,2,'notes')
	worksheet.write(6,2,'detail')
	worksheet.write(7,2,'notes')
	worksheet.write(8,2,'detail')
	worksheet.write(9,2,'notes')
	worksheet.write(10,2,'detail')
	worksheet.write(1,12,'pass')
	worksheet.write(1,13,'faild')
#最後返回worksheet,workbook兩個引數,因為在測試測試用例和執行檔案中需要用到的兩個引數
	return worksheet,workbook

四.測試用例的編寫

test_inserthouse.py

import requests,unittest,os,time,json
from common import public,get_authorization


#房屋新增用例,通過傳入public裡wirte_sheet函式返回的引數wooksheet,將用例的執行結果寫入到測試報告中
def test_inserthouses(worksheet,workbook):
	url = public.get_url('inserthouse')
	nor,table = public.get_case('house',0)
	Authorization = get_authorization.get_Authorization()
	a = 2
	xu = 0
	yu = 0
#用for迴圈來實現遍歷一個excel頁面的所有測試用例
	for i in range(1,nor):
#獲取excel表格裡面需要給介面傳入的引數
		houseNum = table.cell_value(i,0)
		orgUuid = table.cell_value(i,1)
		floor = table.cell_value(i,2)
		houseUseFor = table.cell_value(i,3)
		residentNum = table.cell_value(i,4)
		emergencyPhone = table.cell_value(i,5)
		expect_code = table.cell_value(i,6)
		expect_message = table.cell_value(i,7)
		notes = table.cell_value(i,8)
		payment = table.cell_value(i,11)
#介面body需要傳入的引數
		data = {
		'houseNum':houseNum,
		'houseUseFor':houseUseFor,
		'orgUuid':orgUuid,
		'residentNum':residentNum,
		'floor':floor,
		'emergencyPhone':emergencyPhone,
		'payment':payment
		}

#請求頭,網站加了登陸驗證之後需要在請求頭傳入Authorization引數
		headers={
		'Accept':'application/json',
		'Content-Type':'application/json',
		'Authorization':Authorization
		}
		a+=1
		worksheet.write(1,a,notes)

		data = json.dumps(data)

		r = requests.post(url,data=data,headers=headers)
#將字串格式轉換為字典
		b = eval(r.text)
		m = b.get('code')
		n = b.get('message')
		k = b.get('data')
#判斷介面測試通過與否
		if m==expect_code and n==expect_message:
			worksheet.write(2,a,'pass')
			xu += 1
		else:
			worksheet.write(2,a,'faild:%s'%k)
			yu += 1
#測試用例執行完後,返回用例成功與失敗的數量
	return xu,yu
#	now = time.strftime('%Y-%m-%d %H_%M_%S')
#	report_dir = 'D:\\person\\learn\\py\\HDapi\\report\\'
#	filename =report_dir + now + 'apiresult.xlsx'
#	workbook.save(filename)

test_updatehouse.py

import requests,unittest,os,time,json
from common import public,get_authorization

#房屋編輯測試用例
def test_updatehouses(worksheet,workbook):
	nor,table = public.get_case('house',4)
	Authorization = get_authorization.get_Authorization()
	url = public.get_url('updatehouse')
	a = 2
	x = 0
	y = 0
	for i in range(1,nor):
		houseNum = table.cell_value(i,0)
		orgUuid = table.cell_value(i,1)
		uuid = table.cell_value(i,2)
		houseUseFor = table.cell_value(i,3)
		residentNum = table.cell_value(i,4)
		emergencyPhone = table.cell_value(i,5)
		expect_code = table.cell_value(i,6)
		expect_message = table.cell_value(i,7)
		notes = table.cell_value(i,8)
		floor = table.cell_value(i,9)
		payment = table.cell_value(i,11)

		data = {
		'houseNum':houseNum,
		'houseUseFor':houseUseFor,
		'orgUuid':orgUuid,
		'floor':floor,
		'residentNum':residentNum,
		'uuid':uuid,
		'emergencyPhone':emergencyPhone,
		'payment':payment
		}

		headers={
		'Accept':'application/json',
		'Content-Type':'application/json',
		'Authorization':Authorization
		}

		a+=1
		worksheet.write(3,a,notes)

		data = json.dumps(data)

		r = requests.post(url,data=data,headers=headers)
		b = eval(r.text)
		m = b.get('code')
		n = b.get('message')
		k = b.get('data')
		if m==expect_code and n==expect_message:
			worksheet.write(4,a,'pass')
			x += 1
		else:
			worksheet.write(4,a,'faild:%s'%k)
			y += 1
	return x,y

五.通過對公共函式、測試用例的設計聯合的思考應該在執行檔案裡面做什麼,實現什麼。

本來我想將執行檔案單獨放置於HDapi-auto-test的根檔案下的,可是將測試通過與不通過的數量寫入到測試報告裡面,就必須要呼叫公共函式的方法,由於放置在根資料夾下與公共函式隔了一個資料夾無法呼叫(委屈 本鳥不會呼叫),所以不得不將執行檔案放置於測試用例資料夾下了,好在檔名還是比較好區分也比較好尋找,另外我還想加上自動傳送郵件的功能,這裡不寫了,其實發送郵件很簡單隨便找幾個例子就OK了,ps:程式碼比較low,都沒有封裝,直接暴力簡單執行。程式碼如下:

# utf-8
from common import public
import test_inserthouse,test_updatehouse
import time
from pychartdir import *
#從公共函式呼叫excel的寫入方法
worksheet,workbook = public.write_report()

#測試用例的執行,並且返回x:成功的數量,y:失敗的數量
xu,yu = test_inserthouse.test_inserthouses(worksheet,workbook)
x,y = test_updatehouse.test_updatehouses(worksheet,workbook)
#得到成功與失敗的總數量
xr = x+xu
yr = y+yu
#將成功與失敗的數量寫入的excel的固定表格中
worksheet.write(2,12,xr)
worksheet.write(2,13,yr)
#獲取當前的時間並以制定的格式返回
now = time.strftime('%Y-%m-%d %H_%M_%S')
#測試報告輸出的地址
report_dir = 'D:\\person\\learn\\py\\HDapi\\report\\'
#拼接出測試報告名
filename =report_dir + now + 'apiresult.xlsx'
workbook.save(filename)

#通過pychart庫實現圖形處理,生成測試報告總覽圖----具體的引數設計可以參考pychart庫的文件
data = [yr, xr]
labels = ["faild", "pass"]
c = PieChart(280, 240)
c.setPieSize(140, 130, 80)
c.addTitle("api_result")
c.set3D()
c.setData(data, labels)
c.setExplode(0)
c.makeChart(report_dir+now+"apiresult.png")

六.奉上測試報告輸出

本來想將生成的圖片放進excel測試報告裡面的,奈何能力有限,沒辦法將圖片放進去,智慧單獨存為一個png檔案了

圖表總覽:


excel測試報告情況: