作者:Gakki
01 Pytest 用例规则
Pytest 可以在不同的函数、包中发现用例,发现的规则如下:
- 文件名以 test_ 开头的 py 文件
- 以 test_ 开头的函数
- 以 Test 开头的类
- 以 test_ 开头的方法
- 注:所有的包必须要有 init.py 文件
02 Pytest 运行方式
-
单独执行某一个 py 文件里所有的用例:
pytest test_login.py
-
执行目录下所有的用例:
pytest testcase/
-
单独执行某个用例
以函数形式的用例
pytest test_login.py::test_login
以类形式的用例
pytest test_login.py::TestClass::test_login
03 setup 和 teardown 函数
- setup和teardown主要分为:模块级,类级,功能级,函数级。
- 存在于测试类内部
函数级别:运行于测试方法的始末,即:运行一次测试函数会运行一次 setup 和 teardown
类级别:运行于测试类的始末,即:在一个测试内只运行一次 setup_class 和 teardown_class ,不关心测试类内有多少个测试函数。
04 装饰器之 Fixture
Fixture 装饰器的用途:
- 做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用Fixture来实现。
- 测试用例的前置条件可以使用Fixture实现,比直接使用Pytest框架的setup()和teardown()函数更加灵活。
- Fixture是Pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制。
- Fixture可以实现Unittest不能实现的功能,比如:Unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是Fixture却可以解决这个问题。
Fixture 参数说明:
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
入参说明:
- scope:表示被 @pytest.fixture() 装饰器所标识方法的作用域。作用域有四个级别,函数 function(默认) ,类 class ,模块 module ,包 package/session 。说明:function 作用域包含函数和方法。
- params:一个可选的参数列表,用于做 Fixture 的参数化。可将数据提供给其他的 Fixture ,或者所有测试使用它 。
- autouse:autouse=Ture 则开启自动使用 Fixture 功能,也是调用 Fixture 函数一种方法。Fixture 装饰器会自动执行作用域范围内的所有用例的前后置。autouse 默认值为 Flase 。
- ids:一个字符串 id 的列表,即当使用params参数化时,给每一个值设置一个变量名。如果没有提供 ID , params 将自动生成 ID 。
- name:表示给被 @pytest.fixture() 装饰器修饰的方法取一个别名,调用时可以使用别名调用。默认为装饰器所装饰的函数名称。
注:Fixture装饰器既可以实现部分用例的前后置,也可以是现实全部用例的前后置。
import pytest
# 1.py
@pytest.fixture(scope='module', autouse=True)
def test1():
print('\n开始执行module')
@pytest.fixture(scope='class', autouse=True)
def test2():
print('\n开始执行class')
@pytest.fixture(scope='function', autouse=True)
def test3():
print('\n开始执行function')
def test_a():
print('---用例a执行---')
def test_d():
print('---用例d执行---')
class TestCase:
def test_b(self):
print('---用例b执行---')
def test_c(self):
print('---用例c执行---')
if __name__ == '__main__':
pytest.main(['-s', '1.py'])
输出结果:
collected 4 items
1.py
开始执行module
开始执行class
开始执行function
---用例a执行---
.
开始执行class
开始执行function
---用例d执行---
.
开始执行class
开始执行function
---用例b执行---
.
开始执行function
---用例c执行---
.
============================== 4 passed in 0.04s ==============================
05 跳过(Skip)及预期失败(xFail)
根据特定条件,不执行标识的测试函数。
- 方法:
skipif(condition, reason=None)
- 参数:
- condition:跳过的条件,必传参数
- reason:标注原因,必传参数
- 使用方法:
@pytest.mark.skipif(condition, reason="xxx")
跳过执行测试函数
-
pytest.mark.skip(reason=" ")
可传入一个非必须参数reason表示原因
自定义@pytest.mark.skip()标签
- skip_test = pytest.mark.skip() 或 myskip = pytest.mark.skipif(condition=...)
- 装饰时用该变量代替标签即可:@skip_test
标记为预期失败函数
- 方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
- 常用参数:
- condition:预期失败的条件,必传参数
- reason:失败的原因,必传参数
- 使用方法:
- @pytest.mark.xfail(condition, reason="xx")
使用xfail标记指示你希望测试失败。运行用例的时候,在失败时不会报告回溯。相反,终端报告会将其列在“预期失败”(XFAIL)或“意外传递”(XPASS)部分中。
06 装饰器之 mark
函数数据参数化,方便测试函数对测试数据的获取。
- 方法:
- parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
- 常用参数:
- argnames:参数名
- argvalues:参数对应值,类型必须为list
当参数为一个时格式:[value]
当参数个数大于一个时,格式为:[(param_value1,param_value2.....), (param_value1,param_value2.....)]
- 使用方法:
- @pytest.mark.parametrize(argnames,argvalues),参数值为N个,测试方法就会运行N次
07 pytest 参数
- -K EXPRESSION:执行某个关键字的用例,用例要匹配给出的表达式;使用python的语法,匹配的范围是文件名、类名、函数名为变量,用and来区分。
- --maxfail=num:当错误个数到达给定数时,退出测试,这里就不列举实例了,结果与-x类似。
- -m MARKEXPR:只能运行有相应标识的测试用例,使用这个参数,测试用例要使用@pytest.mark.marker修饰。
- -v:详细结果
- -q:极简结果显示,简化控制台的输出
- -s:输入我们用例中的调式信息,比如print的打印信息等
- -V:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等
- --junit-xml=path:输出xml文件格式,在与jenkins做集成时使用
- --result-log=path:将最后的结果保存到本地文件中
网友评论