核心概念
pytest 据说是最好的单元测试框架,其核心是fixture、可以编写第三方插件、自动寻找以test开头的测试用例。
Fixture:他就是一个高级装饰器,通过被@Fixture标记的的函数,直接可以通过使用被标记的函数名称,传到任意一个函数的参数列表里面,即可使用。还可以指定一个auto选项设置为true.所有函数都会被这个装饰器所装饰。
它的作用大多数就是切面编程,提供数据。和测试前,测试后环境的初始化和清理工作
它能自动查找测试用例,也是依据这样一套规则:
测试文件应该用 test_ 开头或者 _test 结尾
测试函数、测试方法应该以 test_ 开头
测试类应该以 Test 开头
这里挑重点的说:
-
fixture 函数会在测试函数之前运行,但是如果fixtrue 函数包含yield,那么代码
-
会在yield 处停止,转而运行测试函数。等测试函数执行完毕后,在回到fixtrue
-
继续执行yield 后面的代码。可以将yield 前当做setup,yield后,当做teardown
-
无论测试过程中发生了什么,yield后面的代码都会被执行。它的作用视为代码清理功能。
-
类似UnitTest 里面的setup 和teardown
如果整个测试用例里面需要共用一个fixture 函数,这个被标记的函数一定要写在conftest.py文件中,并且放在项目的根目录下面。这个名字
要跟我的一致,不能换!
1、运行过程
1.执行某一个py文件下用例
pytest 脚本名称.py
2.-k 按关键字匹配
pytest -k “MyClass and not method”
3、 运行.py模块里面的某个函数
pytest test_mod.py::test_func
4、 运行.py模块里面,测试类里面的某个方法
pytest test_mod.py::TestClass::test_method
5、从包里面运行
pytest —pyargs pkg.testing
6、遇到错误时候停止测试
pytest -x test_class.py
7、pytest -maxfail=num(当用例错误个数达到指定数量时,停止测试)
pytest —maxfail=1
8.标记表达式 (就是下面的冒烟测试)
pytest -m slow
2、冒烟测试(通过给测试方法标记上,在执行的时候,就可以过滤执行达到冒烟的效果)
@pytest.mark.get
@pytest.mark.smoke
pytest.main(['-v','-m=smoke and get' ,'test_api_exceptions.py'])
3、使用--setup-show 去看pytest Fixtrue的执行过程 (调试用的,看看走没走)
4、 控制台显示信息概要说明:SETUP TEARDOWN 后面跟着F (作用范围为方法级别)、跟着S(会话级别)
5、可以使用Fixture传递测试数据。
6、使用useFixTRUES 指定fixture
7、为常用的Fixtrue 添加autouse选项,在指定范围,都会进行注入,例如在指定范围测试这些函数的执行时间。
8、给Fixtrue(name=ztloo) 给fixtrue 重命名。
9、参数化@pytest.fixture(params=tasks_to_try)
tasks_to_try = (Task('sleep', done=True),
Task('wake', 'brian'),
Task('breathe', 'BRIAN', True),
Task('exercise', 'BrIaN', False))
@pytest.fixture(params=tasks_to_try)
def a_task(request):
"""Using no ids."""
return request.param
@pytest.mark.parametrize
10、内置Fixture
使用tmpdir 和 tmpdir_factory 来创建临时文件和目录,多个 测试用tmpdir_factory。
因为我们测试时候,希望使用的是临时数据库。
11、参数化断言
import pytest
from pytest import approx
testdata = [
# x, y, expected
(1.01, 2.01, 3.02),
(3, 4, 5),
(1.23, 3.21, 4.44),
(0.1, 0.2, 0.3),
(11, 12, 23)
]
@pytest.mark.parametrize("x,y,expected", testdata)
def test_a(x, y, expected):
"""Demo approx()."""
sum_ = x + y
assert sum_ == approx(expected)
12、寻找插件
13、编写自己的插件
使用第三方插件可以节省我们的时间,但是有些特殊情况。找不到完整我们业务要求的第三方插件,总不能哭鼻子找别人开发一款吧!
编写自己的插件,不哭鼻子,也不求人,他来了!
我们创建一个插件来更改测试状态的显示方式,同时会增加一些对应的输出内容。
我们会 将F的状态修改成msuic.
一般情况下,插件的代码可以直接写在conftest.py 里面。
def pytest_report_header():
"""Thank tester for running tests."""
return "Thanks for running the tests."
def pytest_report_teststatus(report):
"""Turn failures into opportunities."""
if report.when == 'call' and report.failed:
return (report.outcome, 'O', 'music')
学习总是要总结的不是 布灵布灵~