有人在上一個帖子中問,爲何要把接口測試排在最前面。 緣由很簡單,接口是先行的,接口沒作好,後面的編碼工做受限,拿不到數據。python
不知作別人家的接口測試是怎麼作的。這邊是用postman這個google插件。測試人員按照接口開發人員的wiki,設計測試用例,而後post/get一下。查看返回json的狀態或者字段。
json
我用python寫了個腳本,將case寫在excel裏,而後讀取excel來實現這個過程,並自動判斷和統計結果,生成報告。
case這麼設計的。
app
#encoding:utf-8 import ConfigParser import os import xlrd import re import httplib import urllib from urlparse import urlparse import json import time import unittest import pdf currentdir=os.path.split(os.path.realpath(__file__))[0] class test_class(): def getexcel(self): casefile=currentdir + '/case.xls' if ((os.path.exists(casefile))==False): print "當前路徑下沒有case.xls,請檢查!" data=xlrd.open_workbook(casefile) table = data.sheet_by_name('login') nrows = table.nrows #行數 ncols = table.ncols #列數 #colnames = table.row_values(1) #某一行數據 for rownum in range(1,nrows): for col in range (3, ncols): value=table.cell(rownum,col).value if (col==3): method=value if (col==4): url=value return table,nrows,ncols def getexceldetail(self,table,row,ncols): #rownum = table.row_values(row) #某一行數據 for col in range (0, ncols): value=table.cell(row,col).value if (col==0): caseid=value print caseid if (col==3): method=value print method if (col==4): url=value return method,url,caseid def httpget(self,url): httpClient = None conn = urlparse(url) url=url.encode('utf-8') try: httpClient = httplib.HTTPConnection(conn.netloc, timeout=10) httpClient.request('GET', url) # response是HTTPResponse對象 response = httpClient.getresponse() print response d0=response.read() d0=d0.decode('unicode_escape') except Exception, e: print e finally: if httpClient: httpClient.close() return response.status,d0 def httppost(self,url): httpClient = None conn = urlparse(url) url=url.encode('utf-8') try: header = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} httpClient = httplib.HTTPConnection(conn.netloc, timeout=30) httpClient.request("POST", url) response1 = httpClient.getresponse() d1=response1.read() d1=d1.decode('unicode_escape') except Exception, e: print e finally: if httpClient: httpClient.close() return response1.status,d1
代碼太多了點,沒寫下。其實就是一個讀excel,一個post,一個get的過程。
後面還有一個對json的解析過程。開始覺得是一個字典就搞定了,後面發現有些{}裏面嵌套了好幾層。
最後用了個遞歸搞定。ide
#! /usr/bin/env python #coding=utf-8 import urllib2 import json class readjson(): def read(self,obj,key): collect = list() for k in obj: v = obj[k] if isinstance(v,str) or isinstance(v,unicode): if key== ' ': collect.append({k:v}) else: collect.append({str(key)+"."+k:v}) elif isinstance(v,int): if key== ' ': collect.append({k:v}) else: collect.append({str(key)+"."+k:v}) elif isinstance(v,bool): if key== ' ': collect.append({k:v}) else: collect.append({str(key)+"."+k:v}) elif isinstance(v,dict): collect.extend(read(v,k)) elif isinstance(v,list): collect.extend(readList(v,key)) return collect def readList(self,obj,key): collect = list() for index,item in enumerate(obj): for k in item: v = item[k] if isinstance(v,str) or isinstance(v,unicode): collect.append({key+"["+str(index)+"]"+"."+k:v}) elif isinstance(v,int): collect.append({key+"["+str(index)+"]"+"."+k:v}) elif isinstance(v,bool): collect.append({key+"["+str(index)+"]"+"."+k:v}) elif isinstance(v,dict): collect.extend(read(v,key+"["+str(index)+"]")) elif isinstance(v,list): collect.extend(readList(v,key+"["+str(index)+"]")) return collect #ojt=test_data1 #print read(ojt,' ')
from reportlab.graphics.shapes import Drawing from reportlab.graphics.charts.barcharts import VerticalBarChart from urllib import urlopen from reportlab.graphics.shapes import * from reportlab.graphics.charts.lineplots import LinePlot from reportlab.graphics.charts.textlabels import Label from reportlab.graphics import renderPDF class pdfreport(): def createpdf(self,datas): drawing = Drawing(400, 200) #data = [(13, 5, 20),(14, 6, 21)] data=datas bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 50 bc.valueAxis.valueStep = 10 bc.categoryAxis.labels.boxAnchor ='ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99'] #bc.categoryAxis.categoryNames =ytype drawing.add(bc) drawing.add(String(250,150,"ss", fontSize=14,fillColor=colors.red)) #drawing.add(String(250,150,des, fontSize=14,fillColor=colors.red)) renderPDF.drawToFile(drawing,'report1.pdf','API') #renderPDF.drawToFile(drawing,'APIReport.pdf','API') datas=[(0,20),(0,25)] f=pdfreport() f.createpdf(datas)
配置到jenkins上也很簡單,這裏就不過多描述。如今問題是,生成的報告是pdf。Jenkins裏面不太好展示出來。弄成zip附件查看不方便。最後我寫個腳本將其傳到共享裏面,或者寫腳本用郵件發出來。後面寫打包的時候會講到的。學習
這些腳本,還有不少能夠完善的地方。我也沒有花太多的精力去完善,個人宗旨是花少的時間,搞出簡單又好用的東西。
上次看到思寒的一篇文章,就是自動生成接口的測試用例,這樣效率大大提升了。
思寒:接口測試中數值 diff
遺憾的是,我沒有徹底搞明白他具體怎麼作的,還要向思寒學習。測試