python接口自动化-有token的接口项目使用unittest框架设计
获取token
在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了。
一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部调用这个参数,那么如何实现呢?
虽然python里面有个全局变量global,但这个只是针对于在同一个.py里才有效,跨脚本就不起作用了。
解决思路
- 1.首先把公共数据单独抽出来,用一个文件去管理,如yaml文件
- 2.写一个读yaml文件的get_token()函数放到a.py,去读取需要的数据
- 3.其它脚本全部调用a.py里面的get_token()函数,然后传参
- 4.token动态获取可以写个登录函数放到run.py,获取到之后把token值写入到yaml文件,这样保证每次token都是最新的
- 5.run.py里面在运行所有用例之前先登录一次并写入token到yaml,然后执行所有用例,出报告结果
设计结构如下

yaml配置
1.公共参数我们可以写入到一个单独的配置文件里,这里配置文件我用的yaml来管理数据

读取token
1.写个读取yaml文件里面的token值的函数,放到re_token.py,代码如下:
# coding:utf-8
import yaml
import os
# 作者:上海-悠悠 QQ交流群:588402570
cur = os.path.dirname(os.path.realpath(__file__))
def get_token(yamlName="token.yaml"):
'''
从token.yaml读取token值
:param yamlName: 配置文件名称
:return: token值
'''
p = os.path.join(cur, yamlName)
f = open(p)
a = f.read()
t = yaml.load(a)
f.close()
return t["token"]
if __name__ =="__main__":
print(get_token())
测试用例token参数关联
1.经常用人问token如何参数关联,问这种问题的,基本上没认真学过python,估计平常写的代码都是东拼西凑到处复制过来的。
2.token的参数关联用一个中间变量【token】去接收上一步【get_token()函数)】获取的token值就行了,再传入到需要的地方,so easy!
3.以下代码是test_01和test_02里面写入的演示案例
# coding:utf-8
import unittest
from common.re_token import get_token
# 作者:上海-悠悠 QQ交流群:588402570
class Test_01(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.token = get_token()
print("获取到当前用例token值:%s" % cls.token)
def test_01(self):
'''测试用例1'''
body1 = {
"a": "111111",
"b": "111111",
"token": self.token # 参数关联
}
print("用例1body:%s" % body1)
def test_02(self):
'''测试用例2'''
body1 = {
"a": "222222",
"b": "2222222",
"token": self.token # 参数关联
}
print("用例2body:%s" % body1)
if __name__ == "__main__":
unittest.main()
4.执行结果:
..
获取到当前用例token值:yoyoketang
用例1body:{'token': 'yoyoketang', 'a': '111111', 'b': '111111'}
用例2body:{'token': 'yoyoketang', 'a': '222222', 'b': '2222222'}
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
执行策略
1.单个脚本运行没问题了,那么如果一次性执行多个用例脚本,都调用同一个token值呢?run.py脚本参考如下
# coding=utf-8
import unittest
import os
import yaml
from common import HTMLTestRunner_cn
from ruamel import yaml
curpath = os.path.dirname(os.path.realpath(__file__))
# 作者:上海-悠悠 QQ交流群:588402570
def login(user="yoyo", psw="123456"):
'''
先执行登录,传账号和密码两个参数
:return: 返回token值
'''
print("登录的账号名称:%s" % user)
p = psw
print("输入的密码:**********")
token = "xxxxxxxxx" # 登录后获取到的token值
return token
def write_yaml(value):
'''
把获取到的token值写入到yaml文件
:param value:
:return:
'''
ypath = os.path.join(curpath, "common", "token.yaml")
print(ypath)
# 需写入的内容
t = {"token": value}
# 写入到yaml文件
with open(ypath, "w", encoding="utf-8") as f:
yaml.dump(t, f, Dumper=yaml.RoundTripDumper)
def all_case(rule="test*.py"):
'''加载所有的测试用例'''
case_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "case")
# 定义discover方法的参数
discover = unittest.defaultTestLoader.discover(case_path,
pattern=rule,
top_level_dir=None)
return discover
def run_case(all_case, reportName="report"):
'''
执行所有的用例, 并把结果写入HTML测试报告
'''
curpath = os.path.dirname(os.path.realpath(__file__))
report_path = os.path.join(curpath, reportName) # 用例文件夹
# 如果不存在这个report文件夹,就自动创建一个
if not os.path.exists(report_path):os.mkdir(report_path)
report_abspath = os.path.join(report_path, "result.html")
print("report path:%s"%report_abspath)
fp = open(report_abspath, "wb")
runner = HTMLTestRunner_cn.HTMLTestRunner( stream=fp,
verbosity=2,
title=u'自动化测试报告,测试结果如下:',
description=u'用例执行情况:')
# 调用add_case函数返回值
runner.run(all_case)
fp.close()
if __name__ == "__main__":
token = login("admin", "111111") # 1.登录
write_yaml(token) # 2.写入yaml
allcases = all_case() # 3.加载用例
run_case(allcases)
2.执行完之后再report文件下生产一个测试报告
python接口自动化-有token的接口项目使用unittest框架设计的更多相关文章
- python接口自动化24-有token的接口项目使用unittest框架设计
获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...
- python+pytest接口自动化(13)-token关联登录
在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示 ...
- Python接口自动化(二)接口开发
django 配置开发环境 相关命令 python manage.py runserver 127.0.0.1:8000在指定的地址和端口启动服务 python manage.py startapp ...
- python接口自动化(五)--接口测试用例和接口测试报告模板(详解)
简介 当今社会在测试领域,接口测试已经越来越多的被提及,被重视,而且现在好多招聘信息要对接口测试提出要求.区别于传统意义上的系统级别测试,很多测试人员在接触到接口测试的时候,也许对测试执行还可以比较顺 ...
- Python接口自动化(一)接口基础
HTTP接口熟悉 常见接口介绍 接口工具的使用 fiddler如何mock数据 常见接口基础面试 如何理解接口?前后端解耦,前端和后端数据对接桥梁 接口测试和功能测试区别在哪?接口测试是功能测试的一种 ...
- java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...
- Python接口自动化基础---token鉴权
有些登录使用cookie,有些登录需要token验证,token传参一般有两种形式,一种是在请求头中,一种是使用URL传参 这里举例说明一下请求头中的token方式: #登录 param1={'use ...
- python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化
# coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...
- python接口自动化中,注册接口随机生成手机号码
如大家所知在注册接口中,手机号参数需要的是未注册的手机号,而在测试用例中,你写入的手机号不一定是未注册的.所以这时需要对注册接口中传入的手机号做处理.下面我就分享一个课程里面学到的一个处理手机号的py ...
随机推荐
- codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)
题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...
- Netbeans自定义折叠代码
只需要在模块开始注释以//<editor-fold>开始, 在模块结束行以 //</editor-fold>结束即可 Can I Create Custom Code Fold ...
- RHEL 6.5----heartbeat
主机名 IP 所需软件 master 192.168.30.130 heartbeat.httpd node-1 192.168.30.131 nfs node-2 192.168.30.1 ...
- solr查询优化【转】filtercache
solr查询优化(实践了一下效果比较明显) 什么是filtercache? solr应用中为了提高查询速度有可以利用几种cache来优化查询速度,分别是fieldValueCache,queryRes ...
- ios学习笔记 UITableView(纯代码) (一)
参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考 https: ...
- 洛谷P2764 最小路径覆盖问题(二分图)
题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 # ...
- Java多态学习笔记
面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...
- vmware让虚拟机内外网络可互访
以下方法可使主机可以ping通虚拟机,虚拟机也可以ping通主机 首先对虚拟机设置 然后设置虚拟机,假设主机的ip是10.0.0.9,那虚拟机的ip应如下设置: 其中ip地址任意设置一个,但要求跟主机 ...
- docker最新版本以及docker-compose安装脚本
docker最新版本以及docker-compose编排工具安装脚本 git clone https://github.com/luckman666/shell_scripts.git cd shel ...
- IOS之pageControl
用户点击页面控件,会触发UIControlEventValueChanged事件,并启动设置为控件动作的任何方法.可以通过调用currentPage查询控件的新值,并通过调整numberOfPages ...