在做接口自动化的时候,经常会遇到多个用例需要用同一个参数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
importyamlimportos#作者:上海-悠悠 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
importyamlimportos#作者:上海-悠悠 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())
4.执行结果:
..
获取到当前用例token值:yoyoketang
用例1body:{'token': 'yoyoketang', 'a': '111111', 'b': '111111'}
用例2body:{'token': 'yoyoketang', 'a': '222222', 'b': '2222222'}----------------------------------------------------------------------Ran2 tests in0.000s
OK
执行策略
1.单个脚本运行没问题了,那么如果一次性执行多个用例脚本,都调用同一个token值呢?run.py脚本参考如下
#coding=utf-8
importunittestimportosimportyamlfrom common importHTMLTestRunner_cnfrom ruamel importyaml
curpath= os.path.dirname(os.path.realpath(__file__))#作者:上海-悠悠 QQ交流群:588402570
def login(user="yoyo", psw="123456"):'''先执行登录,传账号和密码两个参数
:return: 返回token值'''
print("登录的账号名称:%s" %user)
p=pswprint("输入的密码:**********")
token= "xxxxxxxxx" #登录后获取到的token值
returntokendefwrite_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)returndiscoverdef run_case(all_case, reportName="report"):'''执行所有的用例, 并把结果写入HTML测试报告'''curpath= os.path.dirname(os.path.realpath(__file__))
report_path= os.path.join(curpath, reportName) #用例文件夹
#如果不存在这个report文件夹,就自动创建一个
if notos.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文件下生产一个测试报告