搭建Python接口自动化测试框架

序言:
利用下班之后的空余时间和周六周天,通过看博客、搜资料终于把接口自动化测试框架搭建好了,使用python+requests+pytest+yaml+allure实现了接口自动化测试,并进行调试,成功调通公司的项目接口,我是学习并借鉴下面的博主写的博客才成功搭建起来,感谢!

https://www.cnblogs.com/wintest/p/13423231.html

学习和借鉴

  • 我之前说过,学习新的知识我认为是从模仿开始的,就像我们小的时候,学会说话、学会走路都是模仿爸爸妈妈以及周围身边的人才逐渐学过,然后才能更加深入的去理解、去学习,当然要抱有一颗感恩之心,再次感谢各位博主们!(好了,说多了就成煽情了,入正题!)
  • 模仿其实也不简单,其中会遇到很多很多的坑,不要以为照搬过来就好了,你会发现很可能会各种报错、各种跑不通,与其说照搬过来的是代码,倒不如说是搬过来的是思路、是方法!

目录结构

在这里插入图片描述

  • api包:封装了所有的http接口,通过调用python方法来调用http接口;
  • common包:公共工具类,比如常用的日志、数据库连接、读取文件数据、MD5加密、日期等;
  • config包:存放配置文件,比如MySQL的配置、MD5盐值、测试环境url等等;
  • core包:对requests的请求方法、返回结果进行了二次封装,使得常见的http请求方式更加灵活,更加适用于业务场景;
  • data包:使用yaml文件对测试数据进行集中管理;
  • log包:存放调用logger对象产生的日志记录;
  • operation包:关键字封装,很多测试需要多个接口组合进行,相当于把已经封装了http接口的python方法再次进行封装;
  • testcases包:存放测试用例,可分为单个接口测试用例和组合接口测试用例;
  • pytest.ini文件:pytest的配置文件;
  • requirements.txt文件:相关的依赖包文件;

搭建完成后遇到的各种的“坑”

  • 公司开放平台集成管理,客户要想申请接入,需要进行申请得到token值和secret值,然后从请求头header加入x-qys-open-accesstoken、x-qys-open-timestamp、x-qys-open-signature来判断用户是否有权限进行接口调用,accesstoken就是申请得到的token值,timestamp时间戳,而x-qys-open-signature是对token+secret+timestamp得到的字符串再进行MD5加密后得到的签名,验证通过才可以进行接口调用。流程图如下:
    在这里插入图片描述
  • Python获取时间戳
import time

t = time.time()
print (t)                       #原始时间数据
print (int(t))                  #秒级时间戳
print (int(round(t * 1000)))    #毫秒级时间戳
print (int(round(t * 1000000))) #微秒级时间戳
1499825149.257892    #原始时间数据
1499825149           #秒级时间戳,10位
1499825149257        #毫秒级时间戳,13位
1499825149257892     #微秒级时间戳,16位

一开始我使用的的datetime包来获取时间戳

import datetime

timestamp = datetime.datetime.now()
2020-09-07 21:23:00.621722 #输出时间戳

返回的response响应时间戳超时TIMESTAMP TIMEOUT,我发现now()返回的时间戳是已经格式化的,然后我就改用了time()但是必须得精确到毫秒级时间戳,反则还会显示超时。

timestamp = str(int(round(time.time() * 1000)))
  • Python自带的json序列化工具不能序列化datetime类型数据问题
import datetime

timestamp = datetime.datetime.now()

2020-09-07 21:23:00.621722 #输出时间戳
TypeError: Object of type 'datetime' is not JSON serializable #datetime格式json会报错

解决方案:重新默认的json.JSONEncoder方法

class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        else:
            return json.JSONEncoder.default(self, obj)
            
json.dumps(dic, cls=DateEncoder) #使用时只需要加上cls=DateEncoder  
  • 从YAML文件读取对象参数
#可以按照字典形式,比如传递user对象,user对象有contact和contactType两个属性
['2740500553789000000', '', '', 'SIGN', user: {contact: '11111111111', contactType: 'MOBILE'}, 'https://www.baidu.com', True, 0, 'SUCCESS']

#还可以采用层级缩进的形式
user:
  contact: 11111111111
  contactType: email
  • assert断言
 #一般assert断言返回的状态码、断言预期结果、断言response的code、断言预期的msg
 assert result.response.status_code == 200
 assert result.success == except_result, result.error
 assert result.response.json().get('code') == except_code
 assert except_msg in result.msg

总结

搭建起接口测试的框架之后我调试了很多次才跑通公司的接口,其中遇到了很多坑,功夫不负有心人,让我一个个的解决了,当我看到测试用例pass的时候长舒了一口气,接下来就是完善框架,并一个个覆盖所有的接口,包括单个接口的测试以及业务场景中多个接口组合的测试。在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值