【pytest】概述pytest——setup、teardown方法和conftest中的fixture用法,来执行测试用例的前置/后置条件语句操作

大家好,我是好学的小师弟。今天和大家分享下-在pytest中的前置/后置操作。

所谓的前置/后置操作,就是在测试用例执行前,你预先要执行的一些步骤;在测试用例执行完毕后,你要执行的一些数据清理/备份工作。

在pytest中已经给我们准备好了这两个函数,setup和teardown。用法如下:

"""
setup_module: 这是模块级别的setup,作用域是整个.py文件(整个模块),只在运行所有的测试用例前,有且执行一次
teardown_module:这是模块级别的teardown,作用域是整个.py文件(整个模块),只在运行完所有的测试用例后,有且执行一次


setup_function:这是函数级别的setup,作用域只针对函数,注意这里的函数指的是,不在类里面的函数方法。
如果函数在类里面,则function级别的setup,对他不起作用,因为不在它的作用域内。对于在类外的函数,
function级别的setup会在每条测试用例执行前,都执行一遍

teardown_function:这是函数级别的teardown_function,作用域只针对函数,注意这里的函数指的是,不在类里面的函数方法。
如果函数在类里面,则function级别的teardown,对他不起作用,因为不在它的作用域内。对于在类外的函数,
function级别的teardown会在每条测试用例执行完毕后,都执行一遍


setup_class:这是类级别的setup,作用域只在含有这个setup的那个类中,且只在类中的所有测试用例执行前,有且执行一遍
teardown_class:这是类级别的teardown,作用域只在含有这个teardown的那个类中,且只在类中的所有测试用例执行完毕后,有且执行一遍


setup_method:这是方法级别的setup,作用域只在含有这个setup的那个类中,且在当前类中的每条测试用例执行前,都会执行一遍这个setup
teardown_method:这是方法级别的teardown,作用域只在含有这个teardown的那个类中,且在当前类中的每条测试用例执行完毕后,都会执行一遍这个teardown
"""

测试代码:

import allure
import pytest

from control_login_csdn.login_csdn import login_csdn_python
from read_yaml.read_csdn_python_hotrank import Read_csdn







def setup_module():
    print('这是模块级别的setup,你会在执行所有的测试用例前,执行它。有且只会执行一次')


def teardown_module():
    print('这是模块级别的teardown,只会在所有测试用例执行完毕后,才执行一次')

'''
注意 function函数级别的 不能在class内部使用
'''

def setup_function():
    print('这是函数级别的setup,你在执行每条测试用例前,都会执行它。但是前提是,'
          '它只对不在类(class)里面的函数生效,如果你的test_函数写在类Test_里面去了,这个setup_function就不会生效,哪怕你把他写到class里面去也不会生效'
          '它只对类(class)外的函数生效')


def teardown_function():
    print('这是函数级别的teardown,每条测试用例执行完毕后,都会执行,但是前提是,它只对不在类(class)里面的函数生效,'
          '如果你的test_函数写在类Test_里面去了,这个teardown_function就不会生效,哪怕你把他写到class里面去也不会生效'
          '它只对类(class)外的函数生效')



'''
还有setup_class和teardown_class这两个类级别的他们要写到类里面去,有且只执行一次
setup_method和teardown_method是方法级别的,他们要写到类里面去,而且类里面所有测试用例,她都会执行

'''



class Test_csdn_login():

    @allure.feature('登录模块')
    @pytest.mark.parametrize('indata,outdata',
                             Read_csdn().read_csdn(filepath='./yaml_files/csdn_hot_rank_python.yaml'))
    @pytest.mark.xfail
    def test_login(self, indata, outdata):
        # 调用业务代码,获取响应,业务代码就是login_csdn.py这个文件中的函数
        print('这是执行登陆测试用例')
        res = login_csdn_python(indata)

        # 断言

        assert res['code'] == outdata['code']
        print('测试结束了')


    @pytest.mark.xfail
    def test_01(self):
        print('111')

    def setup_method(self):
        print('这是方法级别的setup,你会在类里面执行,且类里面的所有测试用例执行前都会执行这条语句')

    def teardown_method(self):
        print('这是方法级别的teardown,你会在类里面执行,且类里面的所有测试用例执行后都会执行这条语句')
    def setup_class(self):
        print('这是类级别的setup,你会在类里面执行所有的测试用例前,执行它。有且只会执行一次')

    def teardown_class(self):
        print('这是类级别的teardown,只会在类里面所有测试用例执行完毕后,才执行一次')



if __name__ == '__main__':
    # -s  打印输出
    pytest.main(['-sq', 'test_practise_setup_and_taerdown_DifferFrom_fixture.py', "--alluredir=./target/allure-results"])
   
'''
    F  用例失败
    E  error
    .  成功的
'''

结果图:

"""
============================= 2 xpassed in 0.84s ==============================

Process finished with exit code 0

这是模块级别的setup,你会在执行所有的测试用例前,执行它。有且只会执行一次
这是类级别的setup,你会在类里面执行所有的测试用例前,执行它。有且只会执行一次
这是方法级别的setup,你会在类里面执行,且类里面的所有测试用例执行前都会执行这条语句
XPASS [ 50%]这是执行登陆测试用例
测试结束了
这是方法级别的teardown,你会在类里面执行,且类里面的所有测试用例执行后都会执行这条语句
这是方法级别的setup,你会在类里面执行,且类里面的所有测试用例执行前都会执行这条语句
XPASS [100%]111
这是方法级别的teardown,你会在类里面执行,且类里面的所有测试用例执行后都会执行这条语句
这是类级别的teardown,只会在类里面所有测试用例执行完毕后,才执行一次
这是模块级别的teardown,只会在所有测试用例执行完毕后,才执行一次



"""

pytest中除了提供现成的setup方法和teardown方法,还提供了conftest文件结合fixture的方法来达到处理测试用例的前置条件和后置条件的操作。

conftest简介:

1.conftest是一个名字固定的.py文件,他就叫conftest。

2.conftest作用域:一般在工程 根目录 下设置的conftest.py文件起到全局作用。 在不同子目录下也可以放conftest.py的文件,作用范围只能在该目录及以下目录内

3.conftest.py文件的作用:所有同目录下的测试用例文件运行前都会执行conftest.py文件,它就相当于一个前置文件,将conftest的该特性和fixture方法结合起来使用,即可达到测试用例前置/后置条件语句操作
在根目录下新建一个conftest.py文件

 然后在conftest.py文件中,写入前置/后置条件语句,通过fixture来实现

import pytest
@pytest.fixture(scope='module', autouse=True)
def start_prepare():
    print('正在初始化数据,我现在就相当于setup操作')  # 这个就相当于setup
    yield
    print('测试结束,正在处理测试文件,我现在就相当于teardown')  # 这个就相当于teardown
 
"""
这边的scope指的就是你这个fixture语句的作用域

假设有三个测试用例文件
scope='session',在三个测试用例文件,一个都没有执行前执行一次,有且仅执行一次
你可以把session理解为早读课,三个测试用例文件,理解为早上的三节课。
scope='module',每一个测试文件执行前都要执行一遍fixture
scope='class',每一个测试文件中的测试类执行前都要执行一遍fixture
scope='function',所有文件的每条测试用例执行前都要执行一遍fixture


autouse=True
这个就是运行时,自动执行该条语句
不需要我们再去调用@pytest.mark.usefixtures("你的fixture的函数名")来执行fixture语句
这里我们调用的话,就是@pytest.mark.usefixtures("start_prepare")


"""

测试代码:

import pytest

@pytest.fixture(scope='module', autouse=True)
def start_prepare():
    print('正在初始化数据,我现在就相当于setup操作')  # 这个就相当于setup
    yield   
    print('测试结束,正在处理测试文件,我现在就相当于teardown')  # 这个就相当于teardown

注意:这个代码是写在conftest.py文件中的。conftest.py文件不需要导入,在执行pytest测试用例的时候,它会自动去找conftest.py文件

现在再运行,上面写的setup和teardown的代码,你会发现多出来两行字,就是conftest.py文件里的fixture这两行字。

效果图:

'''
============================= 2 xpassed in 1.01s ==============================

Process finished with exit code 0
正在初始化数据,我现在就相当于setup操作   #fixture语句
这是模块级别的setup,你会在执行所有的测试用例前,执行它。有且只会执行一次
这是类级别的setup,你会在类里面执行所有的测试用例前,执行它。有且只会执行一次
这是方法级别的setup,你会在类里面执行,且类里面的所有测试用例执行前都会执行这条语句
XPASS [ 50%]这是执行登陆测试用例
测试结束了
这是方法级别的teardown,你会在类里面执行,且类里面的所有测试用例执行后都会执行这条语句
这是方法级别的setup,你会在类里面执行,且类里面的所有测试用例执行前都会执行这条语句
XPASS [100%]111
这是方法级别的teardown,你会在类里面执行,且类里面的所有测试用例执行后都会执行这条语句
这是类级别的teardown,只会在类里面所有测试用例执行完毕后,才执行一次
这是模块级别的teardown,只会在所有测试用例执行完毕后,才执行一次
测试结束,正在处理测试文件,我现在就相当于teardown  #fixture语句

'''

新人创作不易,觉得不错的看官,点个赞吧,么么哒!!!

转载注明出处!

                                                              

 

你可能感兴趣的:(python,selenium,测试工具,jenkins,自动化)