快乐学习
前程无忧、中华英才非你莫属!

pytest 测试入门

核心概念
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')
 
学习总是要总结的不是 布灵布灵~
打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » pytest 测试入门

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!