1.初始化,清除(setup,teardown)
对自动化测试框架来说,初始化,清除功能非常重要!!!
1.模块级别的初始化和清除
该功能的作用:主要是用来为该模块
中所有的测试用例做公共的
初始化和清除。初始化、清除分别在整个模块的测试用例执行前后执行,并且只会执行1次
。
def setup_module():
print('\n *** start ***')
def teardown_module():
print('\n *** end***')
class Test_assert:
def test_id1(self):
print('\ncase1')
assert 1 == 1
class Test_assert2:
def test_id2(self):
print('\ncase2')
assert 2 == 2
*** start ***
test_5.py::Test_assert::test_id1
hello
PASSED [50%]
case1
test_5.py::Test_assert2::test_id2 PASSED [100%]
case2
*** end***
从运行结果可以看到:以上的打印start为初始化功能,打印end为清除功能。初始化、清除分别在整个模块的测试用例执行前后执行,并且只会执行1次
。
ps:在工作中一般登陆某个页面会作为初始化,登出和关闭页面会作为清除功能。
1.2类级别的初始化,清除
类级别
的初始化、清除分别在整个类的测试用例执行前后执行,并且只会执行1次
def setup_module():
print('\n *** start ***')
def teardown_module():
print('\n *** end***')
class Test_assert:
def setup_class(cls):
print('\n ***start-class***')
def teardown_class(cls):
print('\n ***end-class***')
def test_id1(self):
print('\ncase1')
assert 1 == 1
class Test_assert2:
def test_id2(self):
print('\ncase2')
assert 2 == 2
test_6.py::Test_assert::test_id1
*** start ***
***start-class***
PASSED [ 50%]
case1
***end-class***
test_6.py::Test_assert2::test_id2 PASSED [100%]
case2
*** end***
1.3方法级别的初始化,清除
方法级别的初始化、清除分别在类的每个测试方法执行前后执行,并且 每个用例分别执行1次
def setup_module():
print('\n *** start ***')
def teardown_module():
print('\n *** end***')
class Test_assert:
def setup_class(cls):
print('\n ***start-class***')
def teardown_class(cls):
print('\n ***end-class***')
def setup_method(self):
print('\n ***start-method***')
def teardown_method(self):
print('\n ***end-method***')
def test_id1(self):
print('\ncase1')
assert 1 == 1
class Test_assert2:
def test_id2(self):
print('\ncase2')
assert 2 == 2
test_7.py::Test_assert::test_id1
*** start ***
***start-class***
***start-method***
PASSED [ 50%]
case1
***end-method***
***end-class***
test_7.py::Test_assert2::test_id2 PASSED [100%]
case2
*** end***
从结果可看出,方法级别的初始化、清除在整个模块所有用例执行前后分别执行一次
1.4目录级别
目标级别的初始化清除,就是针对整个目录执行的初始化、清除。
一般在工作中我们会在需要初始化的目录下面创建 一个名为 conftest.py
的文件。该文件的内容就是做目标级别的初始化清除。
conftest代码如下:
import pytest
@pytest.fixture(scope='package', autouse=True)
def st_emptyEnv():
print('\nstart package')
yield
print('\nend package')
这样就会有目标级别的初始化清除,把test5运行一下查看效果
test_5.py::Test_assert::test_id1
start package
*** start ***
PASSED [ 50%]
case1
test_5.py::Test_assert2::test_id2 PASSED [100%]
case2
*** end***
end package
2.fixture装饰器
(setup/teardown)是unnitest的传统单元测试,pytest的fixture有显著改进。与setup和teardown相比,fixture使用起来更加灵活。
fixture的作用是:能够实现前置动作(相当于Setup)
使用方法:
pytest.fixture(scope='function', params=None, autouse=False, ids=None, name=None)
常用参数:
- scope: 被标记方法的作用域
"function"(测试函数级别): 默认值,表示每个测试方法都要执行一次
"class"(测试类级别): 作用于整个类, 表示每个类的所有测试方法只运行一次
"module"(测试模块级别): 作用于整个模块, 每个module的所有测试方法只运行一次.
"session"(多个文件级别): 作用于整个session, 每次session只运行一次. (慎用!!)
- params: list类型,默认None, 接收参数值,对于param里面的每个值,fixture都会去遍历执行一次.
- autouse: 是否自动运行,默认为false, 为true时此session中的所有测试函数都会调用fixture
举个栗子:
指定一个类test_id1方法之前运行一个sayhello
@pytest.fixture(scope="class")
import pytest
@pytest.fixture(scope="class")
def sayhello():
print("hello")
class Test_assert:
#在ID1这个方法中调用了sayhello,故运行时sayhello方法会运行在test_id1之前
def test_id1(self,sayhello):
print('\ncase1')
assert 1 == 1
class Test_assert2:
#在id2这个方法中未调用sayhello,故不会运行sayhello方法
def test_id2(self):
print('\ncase2')
assert 2 == 2
test_5.py::Test_assert::test_id1
hello
PASSED [ 50%]
case1
test_5.py::Test_assert2::test_id2 PASSED [100%]
case2
其他情况就不再举例。