一、引言:
1)setup的作用:用来实现执行前的一些初始化操作(如:数据准备、连接设备、打开APP/浏览器、创建日志对象、创建数据库连接、创建接口的请求对象等操作);
2)teardown的作用:用来实现执行用例后的一些操作(如:数据清理、关闭APP/浏览器、销毁日志对象、关闭数据库连接等操作)。
二、分类:
函数级:setup_function/teardown_function 在每个函数形式的用例前/后,都会执行的代码
方法级:setup_method/teardown_method 在类中方法形式的用例前/后,都会执行的代码
类级:setup_class/teardown_class 用于类中,在一个类中只调用一次,类的前/后,都会执行的代码
模块级:setup_module/teardown_module 用于当前模块,当前模块执行前/后,都会执行的代码
用例级:setup/teardown
1)用例级: setup/teardown
在每个用例前/后,都会执行的代码
----------与方法级:setup_method/teardown_method,产生的效果一样
import pytest
class TestLogin:
def setup(self):
print("在每个用例执行前,执行一次")
# def setup_method(self):
# print("在每个用例执行前,执行一次")
def teardown(self):
print("在每个用例执行后,执行一次")
def test_tangseng(self):
print("测试登录成功-唐僧")
def test_sunwukong(self):
print("测试登录成功-孙悟空")
def test_zhubajie(self):
print("测试登录成功-猪八戒")
def test_shaheshang(self):
print("测试登录成功-沙和尚")
2)函数级和方法级:
其实函数和方法的区别,以前我经常分不清楚:
函数长这样:def test_001():
--不带self
--调用的方式:通过“函数名()”的方式进行调用
--分类:可以分为python的内置函数、匿名函数、递归函数、用户自定义函数
方法长这样:def test_001(self):
--带self
--调用的方式:通过“对象.方法名”的方式进行调用
--分类:普通方法、私有方法、属性方法、特殊方法(双下划线方法:__init__)、类方法、静态方法
--在类中的是方法
如果在类中,用函数级:setup_function/teardown_function,则执行案例时是不会被调用的。
如果在类中,用方法级:setup_method/teardown_method,则执行案例时会被调用。
三、封装
为了避免在每个py文件中,重复编写相同的代码(如setup和teardown进行初始化和结束的处理),让用例中的代码更加整洁清晰,我们可以将这些代码提取出来,放在公共文件夹中(比如:common文件夹)进行封装。
公共的工具包中代码如下:
class CommonUtil:
def setup_class(self):
print("在每个类执行前,执行一次")
def teardown_class(self):
print("在每个类执行后,执行一次")
def setup(self):
print("在每个用例执行前,执行一次")
def teardown(self):
print("在每个用例执行后,执行一次")
1、新建一个python文件夹:common
2、在该文件夹中,创建py文件:common_util,定义CommonUtil类,如上
3、在待使用的类中,去继承CommonUtil类即可:
import pytest
from common.common_util import CommonUtil
class TestLoginA(CommonUtil):
def test_tangseng(self):
print("0130类测试登录成功-唐僧")
def test_sunwukong(self):
print("0130测试登录成功-孙悟空")
def test_zhubajie(self):
print("0130测试登录成功-猪八戒")
def test_shaheshang(self):
print("0130测试登录成功-沙和尚")
运行结果图:
思考:
封装之后,每个用例执行前后,都会执行对应的setup和teardown;但实际应用过程中,可能只有部分用例需要用到前后置,应该怎么处理呢?
对应解决方法见:【pytest】之fixture()和conftest使用详解_福多多的福的博客-CSDN博客