在文章可能这就是我应用pytest搭建的第一个测试框架吧中,已经建立了一个小小的测试框架,但其中根url以及测试数据是直接在代码中写死的。如果想测试不同的数据,或者在不同的测试脚本中均可以调用框架的类,则需要进行读参(这会让这个框架看起来高级一些,而且更像一个框架,我可真是个虚荣的孩子)。
根url的读取
查资料发现有很多种方法,比如存储在环境变量、ini文件或者yaml文件,我目前的做法是把诸多根url均存储在一个yaml文件中。
#config.yaml
host:
test_01: https://www.****.com/test_01
test_02: https://www.****.com/test_02
对于原来写死根目录的类,需要改写成以参数的形式传入。
#bridge.py
from interface import demand
class params():
def __init__(self,api_root_url,**kwargs):
self.api_root_url=api_root_url
self.demand=demand(self.api_root_url,**kwargs)
改写完成后,下一步需要做到的是从config.yaml
中拿出对应的url并且传递给params()
类,在这里,新建立一个文件env.py
,目的是存储以及传递url。
#env.py
from birdge import params
class env:
def __init__(self,api_root_url,**kwargs):
self.transit = params(api_root_url["test01"],**kwargs)
为了能让env
类拿到url,在conftest.py
这个配置文件中建立一个会话级的配置,读取想要进行测试的根url,并存储在返回值当中。
#conftest.py
import pytest
import os
import yaml
from env.py import env
@pytest.fixture(scope="session")
def url(request):
config_path=os.path.join(request.config.rootdir,'config','config.yaml')
with open(config_path) as f:
data=yaml.safe_load(f)
api_root_url=data["host"]
return env(api_root_url)
在上方代码中,需要注意的是api_root_url=data["host"]
,获取yaml文件中host
下方的全部url,在env.py
文件中会获取具体的url值。
接下来则是改写测试脚本,引用fixture
拿到url发起请求,完成参数获取的过程。
#test_project.py
import pytest
#from birdge import params
#test_data=params().demand
def test_name(url):
name_res=url.transit.demand.name()
assert name_res.status_code==200
def test_age(url):
age_res=url.transit.demand.age("18")
assert age_res.status_code==201
参数化后,整个框架的调用过程如下所示,与此前相比主要变化的是前两个步骤。
框架执行流程
测试数据的获取
测试数据如果很少,其实可以直接在脚本中列举,但如果过多,则可以存储在excel中,然后通过读取,在其中随机或全部取值。
建立一个读取excel的文件。
#read_excel.py
import os
import xlrd
path=os.path.abspath(os.path.pardir)
class readExcel():
def get_xls(self,xls_name):
xls_path = os.path.join(path,"data",xls_name)
file = xlrd.open_workbook(xls_path)
sheet = file.sheet_by_index(0)
rows = sheet.nrows
cls = []
for i in range(rows):
if sheet.row_values(i)[0] != 'age':
cls.append(sheet.row_values(rowx=i, start_colx=0, end_colx=None))
return cls
然后,改写测试脚本,从excel
中录入age
接口的测试数据。
#test_project.py
import pytest
import random
from read_excel import readExcel
age=readExcel().get_xls('age.xls')
test_age_data=random.choice(age)
#from birdge import params
#test_data=params().demand
def test_name(url):
name_res=url.transit.demand.name()
assert name_res.status_code==200
def test_age(url):
age_res=url.transit.demand.age(test_age_data[0])
assert age_res.status_code==201
至此,参数化及测试数据的读取优化完成,还是有很多不完美的地方等待去完善,接下来尽量努力学习吧,也有可能是看缘分~
下面是搭建框架用到的一部分细节知识集结,有一步步用到自己之前学习到的东西,十分开心。
这两天的更新让自己这个小白非常满意,导致会频繁的打开看看阅读量或者有没有点赞呀涨粉呀,非常容易让自己心浮气躁了。但是有一个好处是,原来是为了记录学习日常来这里,现在变成了为了有更好的数据就要更新有用的东西然后促进自己去学习,也是一种进步。
不过还是不在意那些比较好,容易有些小失落,日子艰难,还是快乐比较重要~~
希望看到这里的你天天开心,天天向上哦~~
自我记录,有错误欢迎指正~
网友评论