本篇接上一篇【python-pytest使用2-fixture】,在pytest中还有一种方式可以完成实现数据共享、测试用例的数据驱动等场景,这就是conftest.py,那么conftest怎么使用呢?

    1. conftest.py 说明

    conftest.py里可以实现数据的共享,包括参数、方法等,而在使用时不需要通过import来导入conftest,pytest会自动在用例py文件中识别同目录下的conftest.py里的通过@pytest.fixture装饰的方法。conftest使用时候需要配合fixture一块使用。

    2.要知道conftest的用法,首先先得从目录结构看起,如下目录结构:

pytest 发送测试报告邮件 pytest conftest_初始化

        说明:

        当根目录下的conftest.py中有fixture装饰器方法时,此装饰器将作用域整个项目;

        当testDir目录下有conftest.py时,只作用于当前目录,即test_demo.py模块中的所有测试用例。

        由目录可见:

        A.test_case1.py可以用conftest.py-1、conftest.py-3、conftest.py-1中的fixture装饰方法,但不能用conftest.py-2

        B.test_demo.py可以使用所有的conftest.py中fixture装饰方法

        C.根据A.B示例可知这种使用关系是树结构继承的子孙可以用父辈的方法,父辈不能用子孙的。

    3.Fixture和conftest的区别:

    fixture适用于在同一个py文件中多个用例执行时的使用;

    而conftest.py方式适用于多个py文件之间的数据共享。

    4.代码案例

        conftest.py文件:

import pytest
@pytest.fixture(scope="module",
                params=([{"id":10,"name":"mike"},
                        {"id":20,"name":"bill"}]),name="test1")  #
def funGlobal1(request):
    print('这里是funGlobal1-别名test1的初始化')
    id=request.param['id']
    name=request.param['name']
#     print("这里是funGlobal()")
    return id,name


@pytest.fixture(scope="session",
                params=([{"username":'admin',"pw":"111111"},
                         {"username":'root',"pw":"222222"},
                        {"username":'test',"pw":"333333"}]),name="login")  #
def funGlobal2(request):
    print('开始session全局初始化...')
    username=request.param['username']
    password=request.param['pw']
#     print("这里是funGlobal()")
    yield username,password
    print('最后的销毁,运行结束了')    @pytest.fixture(scope="function",                
                params=([{"id":10,"name":"globl3.1"}]),name="test2") 
    
def funGlobal3(request):
    print('这里是funGlobal3-别名test2的初始化')
    id=request.param['id']
    name=request.param['name']
#     print("这里是funGlobal()")
    def myteardown():
        print('这里是funGlobal3-别名test2的销毁操作')
    request.addfinalizer(myteardown)
    return id,name

        test_case.py文件:

import pytest,os
def testcase1(test1):
    print("\n这里是类外部方法testcase1,调用了funGlobal()====={}".format(test1))
def testcase2():
    print("这里是类外部方法testcase2\n")
class TestClass():
    def testcase3(self,login):
        print("这里是类内部方法testcase3----id:{}".format(login[0]))
        print("这里是类内部方法testcase3----name:{}".format(login[1]))        
    @pytest.mark.usefixtures("test2")
    def testcase4(self):
        #testcase4 用了usefixtures打标签装饰,则运行时,有几个参数,就运行几次
        print("这里是类内部方法testcase4")
if __name__=="__main__":
    pytest.main(["-s", __file__])

pytest 发送测试报告邮件 pytest conftest_初始化_02

    文中为自己学习时笔记记录,有不恰当之处,欢迎大家指正,进行修改。