为什么要自定义传值
我们有多个测试环境,我们叫他们dev1,dev2,devN,我们的自动化测试切换环境是在代码的properties文件里面修改参数来确定在哪个环境上跑case。 老板觉得这样太不方便了,有天他拍拍大腿说,擦,我们为啥不直接由 pytest的方式来传变量进去,这样就不用sb兮兮的自己在代码里面来回切换。 于是有了下面的一系列研究。。。。
如何实现
先来看看这几段代码
第一段是测试用例
#test_xxx.py
import pytest
import os
import sys
from atframework import *
class TestBoCheck:
webflow = FlowsAPI()
resourcemaps = ResourceMaps()
utils = Utils()
def setup_class(self):
logger.info(
"[AtLog] ----- START of Test suit test_bo_search_player ----- ")
def teardown_class(self):
self.webflow.close_browser()
logger.info(
"[AtLog] ----- END of Test suit test_bo_search_player ----- ")
def test_bo_check(self, setup_opts):
self.utils.set_setup_opts(setup_opts)
...
第二段是设置的conftest文件。
#conftest.py
import pytest
def pytest_addoption(parser):
parser.addoption(
"--browser", action="store", default="", help="option: chrome, safari, firefox"
)
parser.addoption(
"--site", action="store", default="", help="option: dev, stage, local"
)
@pytest.fixture(scope='session')
def setup_opts(request):
browser = request.config.getoption("--browser")
site = request.config.getoption("--site")
setup = [str(browser), str(site)]
yield setup
- 我们通过 conftest 加入了两个参数变量 "--browser", "--site",然后通过这个方法得到值
request.config.getoption("--browser") - 然后把方法 setup_opts 传入测试用例
test_bo_check(self, setup_opts):最后达到传值的目的。
这里的 @pytest.fixture(scope='session') 的范围可以是 session, module, class, fuction,(由大到小) 这个conftest的位置可以直接放在根目录,就会管到所有的case了。(他会去递归搜索文件夹下的case) case正常名字应该是 test_xxx 或者 xxx_test,否则找不到。
遇到的坑,以及换种方式实现
- 不能传值到 setup_class(self)
def setup_class(self):
pass
- 因为只能传值到具体case,就导致了初始化测试环境的时候有点恼火。
class TestBoCheck:
#这里我们就需要去初始化一些测试环境,但是传值只能在测试用例里面,有点囧
webflow = FlowsAPI()
resourcemaps = ResourceMaps()
utils = Utils()
def setup_class(self):
pass
def teardown_class(self):
pass
#传值在这里
def test_bo_check(self, setup_opts):
self.utils.set_setup_opts(setup_opts)
另一种实现方式
最后没有用pytest来实现,我们自己写了一个单独的python文件fire.py,通过
python fire.py --pram=setting来实现, 如:python fire.py --env=dev1 --bouser=username --bopsd=123456