pytest
setup,teardown方法,用于测试前准备或测试后清理工作;
fixture():
是pytest用于将测试前后准备,清理工作的代码分离出核心测试逻辑的一种机制,从功能上看,fixture与setup/teardown相似;
fixture中有一个参数scope,通过该参数确定fixture的作用域,scope包含以下参数(默认为function):
(1).function 函数或方法级别被调用(作用域为函数级别,类似于setup、teardown.)
(2).class 类级别调用一次(测试类级别)
(3).module 模块级别调用一次(测试模块“.py”级别)
(4).session 多个文件调用一次。比如一个目录下包含多个模块,模块中都使用了该fixture方法,使用pytest 目录名,运行该目录下所有模块,该fixture只调用一次(多个文件级别)
使用场景:
(1).同一模块下, 一个用例需要登录, 一个用例无需登录,此时使用setup, teardown 的, 这是可以考虑使用fixture()
@pytest.fixture()
def login():
"登录的方法"
class Test_fixture:
def need_login(self, login):
# 需要登录
def not_need_login(self):
# 无需登录
(2).用例运行前打开浏览器,运行后关闭浏览器
配合 yield 使用, 在yield之前的代码运行 打开浏览器,在yield之后的代码运行 关闭浏览器;
@pytest.fixture(scope='module')
def open():
# 打开浏览器
yield
# 关闭浏览器
class Test_fixture:
def login_web(self, open)
(3).自动导入conftest.py中的函数。conftest.py用于存放所有被fixture装饰的前置函数,conftest.py用于存放所有被fixture装饰的前置函数
conftest所在目录的上一级目录的文件无法访问到conftest中定义的函数,同级或者下级目录的文件可以访问到conftest中定义的函数
conftest.py这个文件名是固定的,不可以更改;
conftest.py与运行用例在同一个包下,并且该包中有__init__.py文件;
使用的时候不需要导入conftest.py,会自动寻找;
(4).pytestmark = pytest.mark.usefixtures(“open”)
定义模块下所有用例的前置函数都为open
(5).@pytest.fixture(autouse=“true”)
让模块中的每个用例自动添加login为前置函数,无需将login作为参数传递给每个用例方法
(6).两个用例,登录不同的账号
raises()
在断言一些代码块或者函数时会引发意料之中的异常或者其他失败的异常,导致程序无法运行时,使用 raises 捕获匹配到的异常,可以继续让代码正常运行;
使用:
(1).预期内异常;
(2).如果我们不知道预期异常的是什么,我们可以使用 match 和 raise 进行自定义异常;
main():
提供了丰富的参数运行测试用例
(1).不带任何参数,默认运行的是当前目录及子目录的所有文件夹的测试用例;
(2).可以指定参数和路径;
(1)-s:关闭捕捉,输出打印信息;
(2)-v:用于增加测试用例的冗长;
(3)-k:运行包含某个字符串的测试用例;如:pytest -k add XX.py 表示运行XX.py中包含add的测试用例;
(4)q:减少测试的运行冗长;
(5)-x:出现一条测试用例失败就退出测试;在调试阶段非常有用,当测试用例失败时,应该先调试通过,而不是继续执行测试用例;
(3).指定某个测试类或测试方法,用“::”隔开;
命令格式:pytest 文件名.py::测试方法
(4).指定某个测试类下的测试方法;
命令格式:pytest 文件名.py::测试类::测试方法
(5).指定运行某个目录下的某个用例,其中路径为当前执行文件的相对路径;
(6).执行运行某个目录下的全部用例,写到文件夹名字即可,不需要写到py文件;
skip():
在执行测试用例时,有些用例可能不需要执行,这时可以用skip来跳过用例
使用方法:
(1).使用装饰器标记跳过测试用例;
@pytest.mark.skip(reason='此用例不用执行')
def test_skip():
assert 1 == 1
(2).在测试执行或setup期间,通过调用pytest.skip(reason)函数强制跳过该用例;
def test_function():
if not valid_config():
pytest.skip("不支持该配置")
(3).在模块级别跳过整个模块:pytest.skip(reason,allow_module_level=True)
if not sys.platform.startswith(“win”):
pytest.skip(“跳过只支持Windows平台的用例”,allow_module_level=True)
skipif()
指定条件下跳过测试用例,skipif 必须制定reason 否则会报错
使用方法:
(1).满足指定条件时则跳过用例的执行
@pytest.mark.skipif(sys.version_info < (3, 9), reason="需要Python3.9版本以上")
(2).定义一个变量,根据变量返回为True或False来判断是否跳过用例
minversion = pytest.mark.skipif(sys.version_info < (3, 9), reason="需要Python3.9版本以上")
@minversion
def test_002():
assert 1 == 1
fail()
执行测试输出给定的消息并将结果显示为失败
pytest.fail(msg,bool)
第二个参数默认为True
warns()
使用 pytest.warns 可以检查代码是否发出特定的警告信息,使用方法与 raises 类似
approx()
在一定误差范围内断言两个数字(或两组数字)相等
使用:
代码输出: print(0.1 + 0.2 == 0.3)
直观认为输出结果应该为: True
实际输出结果为: False
使用 print(0.1 + 0.2 == pytest.approx(0.3))
输出理想结果
默认情况下,approx将1e-6其预期值的相对容差 (即百万分之一)内的数字视为相等
approx(expected, rel, abs)
rel: 相对误差
abs: 绝对误差
importorskip()
导入并返回请求的 module 信息;如果导入的 module 不存在,则跳过当前测试;
参数:
modname: 需要被导入的模块名称;
minversion: 表示需要导入的最小的版本号,如果该版本不达标,将会打印出报错信息;
reason: 只有当模块没有被导入时,给定该参数将会显示出给定的消息内容
使用:
(1).导入成功: 返回模块名称以及相对路径
sele = pytest.importorskip(“selenium”)
(2).设置最小版本
sele = pytest.importorskip(“selenium”, minversion=“3.150”)
(3).指定返回消息
sele = pytest.importorskip(“selenium-python”, reason=“当前模块导入失败”)
xfail()
根据给定的原因下标记执行的测试和设置函数为失败
该函数只能在 执行测试期间,也就是(setup、call、teardown)中使用。 note 中也提示为了更好的使用,建议使用 mark 方式 – @pytest.mark.xfail
exit()
退出测试进程