十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

Pytest - 使用介绍 ...

上一篇 / 下一篇  2021-06-27 13:50:49 / 个人分类:python

文章来源
  • 文章来源:【转载】
1. 概述

pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:

    1、简单灵活,容易上手,文档丰富;
    2、支持参数化,可以细粒度地控制要测试的测试用例
    3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
    4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
    5、测试用例的skip和xfail处理;
    6、可以很好的和CI工具结合,例如jenkins

2. 使用介绍
2.1. 安装

pip install pytest
2.2. 示例代码
编写规则

编写pytest测试样例非常简单,只需要按照下面的规则:

    测试文件以test_开头(以_test结尾也可以)
    测试类以Test开头,并且不能带有 init 方法
    测试函数以test_开头
    断言使用基本的assert即可

pytest1.py
# -*- coding:utf-8 -*-
import pytest

@pytest.fixture(scope='function')
def setup_function(request):
    def teardown_function():
        print("teardown_function called.")
    request.addfinalizer(teardown_function)  # 此内嵌函数做teardown工作
    print('setup_function called.')

@pytest.fixture(scope='module')
def setup_module(request):
    def teardown_module():
        print("teardown_module called.")
    request.addfinalizer(teardown_module)
    print('setup_module called.')

@pytest.mark.website
def test_1(setup_function):
    print('Test_1 called.')

def test_2(setup_module):
    print('Test_2 called.')

def test_3(setup_module):
    print('Test_3 called.')
    assert 2==1+1              # 通过assert断言确认测试结果是否符合预期
fixture的scope参数

scope参数有四种,分别是'function','module','class','session',默认为function。

    function:每个test都运行,默认是function的scope
    class:每个class的所有test只运行一次
    module:每个module的所有test只运行一次
    session:每个session只运行一次

setup和teardown操作

    setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
    teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
    备注:也可以通过在fixture函数中通过yield实现setup和teardown功能

2.3. 测试结果
如何执行

    pytest # run all tests below current dir
    pytest test_mod.py # run tests in module file test_mod.py
    pytest somepath # run all tests below somepath like ./tests/
    pytest -k stringexpr # only run tests with names that match the
    # the "string expression", e.g. "MyClass and not method"
    # will select TestMyClass.test_something
    # but not TestMyClass.test_method_simple
    pytest test_mod.py::test_func # only run tests that match the "node ID",
    # e.g "test_mod.py::test_func" will be selected
    # only run test_func in test_mod.py

通过pytest.mark对test方法分类执行

通过@pytest.mark控制需要执行哪些feature的test,例如在执行test前增加修饰@pytest.mark.website

    通过 -m "website" 执行有website标记的test方法

$ pytest  -v -m "website" pytest1.py

============================================================================== 

c+VTIsV9k2R0

test session starts ===============================================================================51Testing软件测试网 Z{/Y[!@9x

platform. linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /home/kevin/soft/anaconda2/bin/python
cachedir: .cache
Using --randomly-seed=1522925202
rootdir: /home/kevin/learn/python-web/tox/case2, inifile:
plugins: randomly-1.0.0, mock-1.2, cov-2.0.0
collected 3 items

pytest1.py::test_1 PASSED

============================================================================= 
51Testing软件测试网&]!WL%x?

pytest-warning summary =============================================================================

(u(H~ ZY)uh(` uf-GP0WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.

=============================================================================== 

t$tBSS8B$un)?0

2 tests deselected ===============================================================================51Testing软件测试网:W&G7m4l ] J

=========================================================== 

KR:g$?`f5R G0

1 passed, 2 deselected, 1 pytest-warnings in 0.00 seconds ============================================================

9B'@LJ.[U0
    通过 -m "not website" 执行没有website标记的test方法

$ pytest  -v -m "not website" pytest1.py

============================================================================== 

Z DD5o"t+\ap4B0

test session starts ===============================================================================

N?A&HszD6_1_0platform. linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /home/kevin/soft/anaconda2/bin/python
cachedir: .cache
Using --randomly-seed=1522925192
rootdir: /home/kevin/learn/python-web/tox/case2, inifile:
plugins: randomly-1.0.0, mock-1.2, cov-2.0.0
collected 3 items

pytest1.py::test_3 PASSED
pytest1.py::test_2 PASSED

============================================================================= 
51Testing软件测试网R(b(NRv_9A;{h*E

pytest-warning summary =============================================================================51Testing软件测试网 |0W7N R/VP(b Ub Z?

WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.

=============================================================================== 

2k$Yi`R@0

TAG: pytest

 

评分:0

我来说两句

msnshow

msnshow

生活在互联网领域,从事WEB测试工作.

日历

« 2024-05-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 1695081
  • 日志数: 556
  • 图片数: 1
  • 文件数: 3
  • 书签数: 8
  • 建立时间: 2007-06-08
  • 更新时间: 2023-01-07

RSS订阅

Open Toolbar