介绍setup和teardown之前,先来介绍一个测试场景,比如我们要测试淘宝的购物车的添加功能,那我们是不是需要先登录,然后再到购物车模块去操作,最后是退出账号,那么像这种测试一个模块前后需要做的准备工作和收尾的工作,可以通过写代码实现,但是pytest帮我们封装好了方法teardown和setup,有不同的场景下对应的不同的方法。
根据用例运行级别可以分为以下几种
模块级(setup_module/teardown_module)开始于模块始末,全局的
函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
方法级(setup_method/teardown_method)开始于方法始末(在类中)
类里面的(setup/teardown)运行在调用方法的前后
举例说明:
一、函数级别的。
import pytest
count = 1
def setup_function():
print("函数测试开始了.....")
def teardown_function():
print("函数测试结束了.....")
def add(x, y):
if type(x) is int or type(y) is int:
return x+y
else:
raise TypeError
# @pytest.mark.ToDo3
def test_case1():
print("正常值。。。")
assert add(1,2) == 3
# @pytest.mark.toDo2
# @pytest.mark.skipif(count <= 1, reason = "count值太小")
def test_case2():
print("异常值")
with pytest.raises(TypeError):
assert add(1,"2") != 3
if __name__ == '__main__':
pytest.main(['-sq', 'test_10_21.py'])
运行结果,可以看到:每个测试函数执行前和执行后都会去执行一遍。
C:\Python36\python.exe D:/自动化B/python_test/test_10_21.py
函数测试开始了.....
正常值。。。
.函数测试结束了.....
函数测试开始了.....
异常值
.函数测试结束了.....
sss
2 passed, 3 skipped in 0.04s
Process finished with exit code 0
二、模块级别的。
将上面的那两行代码改成下面两行:
def setup_module():
print("模块测试开始了.....")
def teardown_module():
print("模块测试结束了.....")
运行结果:
函数测试开始了.....
正常值。。。
.异常值
.sss函数测试结束了.....
2 passed, 3 skipped in 0.06s
可以看到,在整个模块运行前和运行结束后分别执行了一次。
三、类和方法(这里需要注意一下,这个是放在类中的。)
import pytest
count = 1
def setup_module():
print("模块测试开始了.....")
def teardown_module():
print("模块测试结束了.....")
def add(x, y):
if type(x) is int or type(y) is int:
return x+y
else:
raise TypeError
# @pytest.mark.ToDo3
def test_case1():
print("正常值。。。")
assert add(1,2) == 3
# @pytest.mark.toDo2
# @pytest.mark.skipif(count <= 1, reason = "count值太小")
def test_case2():
print("异常值")
with pytest.raises(TypeError):
assert add(1,"2") != 3
# @pytest.mark.skip(reason = "我不想被执行")
class TestCase(object):
def setup_class(self):
print("类测试开始了.....")
def teardown_class(self):
print("类测试结束了.....")
def setup_method(self):
print("方法测试开始了.....")
def teardown_method(self):
print("方法测试结束了.....")
def setup(self):
print("方法调用测试开始了.....")
def teardown(self):
print("方法调用测试结束了.....")
def test_CASE3(self):
print("特殊字符:")
with pytest.raises(TypeError):
assert add("$", "****") != 3
@pytest.mark.skip()
def test_error():
print("这是一个错误结果的用例测试")
assert 1 == 2
@pytest.mark.skip()
def test_CASE4():
print("特殊字符:")
with pytest.raises(TypeError):
assert add("][]", ">?>") != 3
if __name__ == '__main__':
pytest.main(['-sv', 'test_10_21.py'])
运行结果:
模块测试开始了.....
正常值。。。
.异常值
.类测试开始了.....
方法测试开始了.....
方法调用测试开始了.....
特殊字符:
.方法调用测试结束了.....
方法测试结束了.....
类测试结束了.....
ss模块测试结束了.....
3 passed, 2 skipped in 0.07s