接口测试 请问下,py 文件中的某个函数运行在 conftest.py 之前,该函数里面用了 conftest.py 赋值的变量,直接提示变量不存在

王加 · 2021年03月10日 · 最后由 王加 回复于 2021年03月11日 · 2075 次阅读

我现在有个需求:
A 接口返回多个歌单列表,B 接口根据歌单 id 可以查询该歌单的详情

做法:
将 A 接口中的歌单列表的所有 id 保存到 yaml 文件中,然后用 pytest.mark.parametrize 遍历传参。生成 yaml 文件的这个我写成了 py 文件的一个函数。

问题:
我用 pytest 的 pytestconfig.getoption 来获取 host 的域名,并保存到 os.environ['host'] 中调用。但是这个步骤的执行顺序在生成歌单 id 的 yaml 的步骤之后。导致我生成 yaml 文件的时候拿不到域名,请问要怎么解决这个问题。或者是不是有其他的较好的方法处理

这个是生成 yaml 文件的

这个是 baseResquest 中的

这个是 conftest.py 里的赋值的

谢谢各位

共收到 6 条回复 时间 点赞

这个是执行顺序的问题,用 fixture 传进去吧。

aabbcc 回复

意思是把生成 yaml 文件的步骤放到 fixture 里面单程前置处理么

1、base_request=BaseRequests() 放到方法的内部应该可以解现在的问题
2、另外建议对测试的架构重新设计下,测试类下怎么还有 self.get*** 方法。看上去有太多的封装了,requests,assert,真的有必要吗?用例里最好不要再有条件判断,拆成两条用例更好维护一些。
3、如果接口 A 可以看做 B 的前置条件,用 fixture 实现可能更好一点。
4、fixture 中接受到命令行参数 cmhost 后,如果只是测试用例用得上,可以把它 return 出去,就不用 BaseRequest 初始化时候处理这么麻烦了。
5、pathlib 可以很好地处理文件路径相关的问题

@pytest.fixture(scope='session', autouse=True)
def cmhost(pytestconfig):
    return pytestconfig.getoption('--cmhost')

def test_function(cmhost):
    url = cmhost + _url

要么 fixture,要么 pytest 全局变量 pytest.env = {'host': 'xxxxx'} 这里的 env 是自己可以定义的

MarvinWu 回复

感谢建议,架构这块已经打算重新设计了。关于第 4 点,fixture 中接受到命令参数后,将其 return 出去后,test 用例中怎么用呢,谢谢

感谢建议,我选择了 fixture

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册