巴黎的灯光下 发表于 2017-6-29 15:45:29

[分享] 自动化测试与持续集成方案--接口测试

有人在上一个帖子中问,为什么要把接口测试排在最前面。 原因很简单,接口是先行的,接口没做好,后面的编码工作受限,拿不到数据。

[*]传统接口测试
[*]接口自动化测试
[*]接口自动化的持续集成
[*]探讨
传统接口测试不知道别人家的接口测试是怎么做的。这边是用postman这个google插件。测试人员按照接口开发人员的wiki,设计测试用例,然后post/get一下。查看返回json的状态或者字段。

https://testerhome.com/photo/2015/64909f4175fc0347a8b240a3240fe4e1.png

弱点是不便于管理case和不方便统计结果,执行要一个一个手工去点,效率低下。接口测试自动化我用python写了个脚本,将case写在excel里,然后读取excel来实现这个过程,并自动判断和统计结果,生成报告。
case这么设计的。

https://testerhome.com/photo/2015/ae3efc360a33d0c4974cb0af205a0e68.png

脚本这么写的:#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__))
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


巴黎的灯光下 发表于 2017-6-29 15:46:25

代码太多了点,没写下。其实就是一个读excel,一个post,一个get的过程。
后面还有一个对json的解析过程。开始以为是一个字典就搞定了,后面发现有些{}里面嵌套了好几层。
最后用了个递归搞定。

    #! /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

    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
    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,' ')

最后是结果:

是用python写图表,生成pdf.

    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附件查看不方便。最后我写个脚本将其传到共享里面,或者写脚本用邮件发出来。后面写打包的时候会讲到的。
探讨

这些脚本,还有很多可以完善的地方。我也没有花太多的精力去完善,我的宗旨是花少的时间,搞出简单又好用的东西。
上次看到思寒的一篇文章,就是自动生成接口的测试用例,这样效率大大提高了。

悠悠小仙仙 发表于 2017-6-29 16:02:26

恩。很好的方式。
接口多的话,都可以套个框架巡检起来了,逻辑也可以做深一点。
可以试试requests这个库,比urllib好用太多;JSON response可以直接用JSON库转化成字典:)

巴黎的灯光下 发表于 2017-6-29 16:03:32

有空去瞅瞅。

无bug 发表于 2017-7-26 18:07:38

【上次看到思寒的一篇文章,就是自动生成接口的测试用例,这样效率大大提高了。】

求地址。。
页: [1]
查看完整版本: [分享] 自动化测试与持续集成方案--接口测试