序言:
利用下班之后的空余时间和周六周天,通过看博客、搜资料终于把接口自动化测试框架搭建好了,使用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的时候长舒了一口气,接下来就是完善框架,并一个个覆盖所有的接口,包括单个接口的测试以及业务场景中多个接口组合的测试。