接口和协议组成 Python + Excel + django 实现接口自动化测试并生成 HTML 报告

周小丽 · 2016年05月11日 · 最后由 KK 回复于 2019年01月31日 · 2772 次阅读

前段时间在 testhome 的 QQ 群中看到了 ‘BJ-行者’ 说的接口自动化测试,一时兴起,想着自己也写个,说干就干吧,具体思路如下:

  1. Excel 中接口数据的整理,根据开发出具的 Excel 接口文档设计接口用例
  2. Python 读取 Excel 中的接口数据,通过 httplib 发送接口协议
  3. 通过 django 的 web 框架将 python 中的参数传递到 HTML 报告中

接下来还是上代码说明测试思路:

一、Excel 中用例的设计

二、从 Excel 读取接口参数

for i in range(1,nrows):
      n = 0
      address = sheet.cell(i,1).value
      name = sheet.cell(i,2).value
      # 获取第i+1行,第2列的数据
      method =sheet.cell(i,3).value
      print 'address:'+address+' method:'+method
      data =sheet.cell(i,5).value
      for j in range(1,sub_nrows):
          sub_testId = sub_sheet.cell(j,0).value
          testId = 'Sheet2' + ':' + sub_testId
          sub_ncol = sub_sheet.row_values(j)
          # 获取第j+1行所有的数据
          sub_ncols = len(sub_ncol)
          # 计算当前行的列数
          for a in range(1,sub_ncols):
              if sub_ncol[a] == '':
                  sub_ncols = sub_ncols -1
                  # for循环,排除为空值的列
          if (data == testId):
              n = n+1
              m = j-n
              # 为了保证参数名称每次都一样,所有当j值加1后,然后通过n传参再减1,这样就保证当前用例的m值始终一致
              listA=[]
              # 初始化一A数组
              for k in range(1,sub_ncols):
                  parameter1 = sub_sheet.cell(j,k).value
                  # k为列值变量,从第4列开始计数,依次读取某一行的所有列的数据
                  parameter2 = sub_sheet.cell(m,k).value
                  if type(parameter1).__name__ == "unicode":
                      Parameter1 = parameter1.encode("utf-8")
                      # 字符类型转换,若当前为unicode类型,则转换为utf-8类型
                  if type(parameter1).__name__=="float":
                      Parameter1 = str(parameter1)
                     # print Parameter1
                  if type(parameter2).__name__ == "unicode":
                      Parameter2 = parameter2.encode("utf-8")
                    #  print Parameter2
                  parameter = "'" + Parameter2 + "'" + ":" + "'" + Parameter1 + "'" + ","
                  #print Parameter
                  listA.append(parameter)
                  # 将参数parameter添加到数组A中
              listB = '{' + ''.join(listA) + '}'
              listC = eval(listB)
              # 将数组A中所有的数据进行拼接,然后通过eval转成unicode类型

三、将获得的参数传递给服务器

params = urllib.urlencode(Parameter)
headers = {"Content-type": "application/x-www-form-urlencoded"}
httpClient = httplib.HTTPConnection("test.qshealthcare.com", 80, timeout=30)
httpClient.request(Method, Address, params, headers)
resp = httpClient.getresponse()
print resp.status
print resp.reason
result = resp.read()
print result
result = result.encode("utf-8")
my_data = json.loads(result)
if(my_data['message'] == u"success"):
    # 用于判断my_data输出中message的值是否为success,以此判断用例是否执行成功
    flag = True
else:
    flag = False
Flag.append(flag)

四:插播下 django web 框架的配置

  1. 下载 setup.py 的 django 包,通过 python setup.py install 进行安装,import Django 然后 Django.VERSION 查看是否安装成功
  2. 创建网站项目:python django-admin.py startproject mysite
  3. 启动 http 服务:python manage.py runserver

五:将返回结果通过 django 传递给 HTML

t = get_template('report.html')  #在settings.py中需要设置模板的路径
excel_data(xlsfile1)
html = t.render(Context({'datas':datas,'Case_time':time,'Case_Tnum':Tnum,'Case_Fnum':Fnum,'Case_num':num}))
return HttpResponse(html)

六:展现一下 HTML 报告的样式

共收到 17 条回复 时间 点赞

可以再加入自动发送邮件结果的功能。

#2 楼 @carl 这通过 jenkins 可以实现

#1 楼 @success 是 zan 吧?
哈,虽然有些地方还看得不是挺明白,不过我会收藏起来细细品味,在工作中理解的。谢谢分享!!

#4 楼 @y1i1n1 哈哈,是的

#3 楼 @xiaoli
你做过吗?可以内嵌 javascript 吗?最近在搞自动发邮件的功能,在 html 中使用 javascript 加载的 json 数据,这部分怎么在邮件中体现出来比较好。

报告样式还不够漂亮呀

有两个问题,如果要登录后拿到 sid 和 cookie 来做其他接口的参数的话,要怎么传,这个只能自己还,还有不是每个请求的 headers 都一样的,还是这个只能做 http 的测试,如果是 websocket 呢

—— 来自 TesterHome 官方 安卓客户端

#6 楼 @carl 没有哦

#7 楼 @huanzhijin 哈哈,哪天看见漂亮的 再改改,html 改样式还是比较方便的

如果是局域网内邮件推送可以用 smtplib 简单搭一个呗

#8 楼 @terrychow 呵呵,没考虑那么多哦,我们是 app 的产品,headers 都是一样的,模拟 app 给后台接口 post/get 数据

#11 楼 @andward 谢谢,有时间我试试,因为没用过 smtplib,接下来我想将 excel 用例的编写改成从 web 页面录入,减少格式错误

暂时看不明白,先 mark 一下~

这个可以有,非常👍

@xiaoli 使用 get_template 是不是需要我前提有个 Django 的环境

你这个报告是如何生成的?我目前从 excel 读取了所有案例,执行完,在报告里只显示一条的结果。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册