菜单
本页目录

之前已经讲过fixture的用法参考之前文档 ,conftest.py文件则是一个专门用来管理夹具函数的文件。

使用目的

在测试中,我们需要对所有用例做前置处理的时候。就需要把这部分的初始化步骤抽出来,方便统一管理。比如,我们在UI测试的时候,都需要先初始化Selenium Driver。再比如,我们的测试脚本都需要先登录进去后再进行业务操作。那就完全可以使用conftest.py,完成对前置步骤的抽离。 conftest.py 的目的就是为了单独管理一些全局的 fixture

注意要点

  • conftest.py的命名是固定的,不能改
  • conftest.py 不需要导入,脚本运行时候会自动识别
  • conftest.py文件可以写多个fixture
  • conftest.py 只对同一个 package 下的所有测试用例生效
  • 不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py

使用案例

目录结构如下:

image-ncnu.png

最外层/MyPytest/conftest.py的配置如下:

import pytest


@pytest.fixture(scope='class')
def initSeleniumDriver():
    print("初始化SeleniumDriver成功")
    print("已经打开Chrome浏览器")
    yield
    print("关闭浏览器")


@pytest.fixture(scope='function')
def loginAndLogout(initSeleniumDriver):

    userName = 'admin'
    userPassword = '123456'
    print(f"login:用户admin 执行登录操作")
    token = '1234v242fsqq'

    yield userName, token

    print(f"logout:用户{userName}执行退出登录操作\n")

run.py文件代码,执行入口:

import pytest

if __name__ == '__main__':
    pytest.main(["-s", "./"])

/Moudle1/Test_Contest_01.py的代码:

import pytest


class Test_Contest_01:
    def test_case_01(self, loginAndLogout):
        username, token = loginAndLogout
        print(f"正在执行test_case_01, 账号:{username},token:{token}")

    def test_case_02(self, loginAndLogout):
        username, token = loginAndLogout
        print(f"正在执行test_case_02, 账号:{username},token:{token}")


if __name__ == '__main__':
    pytest.main(['Test_Contest_01.py', '-s'])

/Moudle2/Test_Contest_02.py的代码:

import pytest


class Test_Contest_02:
    def test_case_03(self, loginAndLogout):
        username, token = loginAndLogout
        print(f"正在执行test_case_03, 账号:{username},token:{token}")

    def test_case_04(self, loginAndLogout):
        username, token = loginAndLogout
        print(f"正在执行test_case_04, 账号:{username},token:{token}")


if __name__ == '__main__':
    pytest.main(['Test_Contest_01.py', '-s'])

/Moudle2/conftest.py的代码:

import pytest


# 定义的夹具函数, 实现 用例执行前登录,用例执行后登出的效果
@pytest.fixture(scope='function')
def loginAndLogout(initSeleniumDriver):
    userName = 'module2专用测试用户'
    userPassword = '123456'
    print(f"login:用户{userName} 执行登录操作")
    token = 'wewe3t242fsrqqwe'

    yield userName, token

    print(f"logout:用户{userName}执行退出登录操作\n")

执行结果:

collected 4 items                                                              

Moudle1\Test_Contest_01.py 初始化SeleniumDriver成功
已经打开Chrome浏览器
login:用户admin 执行登录操作
正在执行test_case_01, 账号:admin,token:1234v242fsqq
.logout:用户admin执行退出登录操作

login:用户admin 执行登录操作
正在执行test_case_02, 账号:admin,token:1234v242fsqq
.logout:用户admin执行退出登录操作

关闭浏览器

Moudle2\Test_Contest_02.py 初始化SeleniumDriver成功
已经打开Chrome浏览器
login:用户module2专用测试用户 执行登录操作
正在执行test_case_03, 账号:module2专用测试用户,token:wewe3t242fsrqqwe
.logout:用户module2专用测试用户执行退出登录操作

login:用户module2专用测试用户 执行登录操作
正在执行test_case_04, 账号:module2专用测试用户,token:wewe3t242fsrqqwe
.logout:用户module2专用测试用户执行退出登录操作

关闭浏览器


============================== 4 passed in 0.09s ==============================

执行上述代码发现:conftest.py可以有多个,但是会以测试代码层级最近的为准