大家好,我是好学的小师弟。今天和大家分享下-在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语句
'''
新人创作不易,觉得不错的看官,点个赞吧,么么哒!!!
转载注明出处!