conftest.py文件(存放公用fixture)
一、conftest.py基础认识
1.什么是
可以理解成一个专门存放fixture的配置文件
2.实际用途
多个测试用例文件(test_*.py)的所有用例都需要用到一个前置/后置操作,如登陆退出,浏览器的打开和关闭,那就不能把登录功能写到某个用例文件中去了
模块自己的fixture写入自己的py文件中即可,对于一些全局的fixture,用各种级别的conftest.py来存放管理
3.存放位置
- 放到工程的根目录下,就可以全局调用
- 也可以放到某个package包下,只对该package内(包括子包内)所有测试用例有效(有__init__.py的文件夹才是包,不可以放在文件夹中)
4.注意事项
- pytest会默认读取conftest.py里面的所有fixture
- conftest.py 文件名称是固定的,不能改动
- 不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
- 测试用例文件中不需要手动import conftest.py,pytest会按fixture查找顺序自动查找到conftest:当前测试类 > 模块(.py文件)> 当前包中conftest.py > 父包中conftest.py > 根目录中conftest.py
二、实际项目举例
1.项目根目录
项目启动入口,会运行项目下所有测试用例:
import pytest if __name__ == '__main__': pytest.main(["-v", "-s", "-rA", "../conftest/"])
最顶层的conftest.py,一般写全局的fixture,在Web UI自动化中,可能会初始化driver:
import pytest @pytest.fixture(scope="session") def login(): print("====总conftest文件 登录功能,返回账号,token===") name = "testyy" token = "npoi213bn4" yield name, token print("====总conftest文件 退出登录!!!====") @pytest.fixture(autouse=True) def get_info(login): name, token = login print(f"==总conftest文件 每个用例都默认自动调用的fixture:打印用户token: {token} ==")
根目录下的第一条测试用例:
def test_get_info(login): name, token = login print("***项目最基础用例:获取用户个人信息***") print(f"用户名:{name}, token:{token}")
2.51job包
该包内的conftest.py,配置一些针对51job这个网站的测试用例独有的fixture,譬如:打开51job网站
import pytest @pytest.fixture(scope="module") def open_51(login): name, token = login print(f"51job的conftest 用户 {name} 打开51job网站==")
某个功能模块下的测试用例:
def test_case2_01(open_51): print("51job,列出所有职位用例") def test_case2_02(open_51): print("51job,找出所有python岗位")
3.toutiao文件夹
没有__init__.py,只是个普通文件夹,不是包,文件夹不可以有conftest.py文件
def test_case2_01(open_51): print("51job,列出所有职位用例") def test_case2_02(open_51): print("51job,找出所有python岗位")
4.weibo包
配置一些针对weibo这个网站的测试用例独有的fixture,譬如:打开weibo网站:
import pytest @pytest.fixture(scope="function") def open_weibo(login): name, token = login print(f"weibo的conftest 用户 {name} 返回微博首页 &&&")
某个功能模块下的测试用例:
class TestWeibo: def test_case1_01(self, open_weibo): print("查看微博热搜") def test_case1_02(self, open_weibo): print("查看微博范冰冰")
5.运行run.py,执行该项目所有用例