【使用Pytest重构项目】Pytest简介与基本使用

前言

一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210419。

6、使用pytest重构项目

  • pytest框架介绍
  • pytest标记
  • pytest参数处理
  • pytest Fixtrue
  • pytest allure生成测试报告
  • 使用pytest重构项目

Pytest简介与使用

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 安装

Windos:pip install pytest

Mac :sudo pip3 install pytest

2.2  编写规则

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

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的assert即可
  • 运行:pytest.main(['test_01.py'])

示例代码1:test_01.py

"""
Pytest编写规则:
    测试文件以test_开头(以_test结尾也可以)
    测试类以Test开头,并且不能带有 init 方法
    测试函数以test_开头
    断言使用基本的assert即可
    运行:pytest.main(['test_01.py'])
"""
import pytest

class TestLoginCase(object):

     # def __init__(self):  # 不能用init方法定义

    def test001(self):
        print("test001")

        assert 1==1

    def test002(self):
        print("test002")

        # assert 1==2  #断言失败
        assert 1==1    # 断言成功

if __name__ == '__main__':
    pytest.main(['test_01.py'])

    # pytest.main(['-s','-v','test_01.py'])  # 加上参数-s:显示print()函数输出的结果;加上-v:显示每条测试案例的执行结果

运行test_01.py如下:

Console参数介绍

  • -v 用于显示每个测试函数的执行结果
  • -q 只显示整体测试结果
  • -s 用于显示测试函数中print()函数输出
  • -x, --exitfirst, exit instantly on first error or failed test
  • -h 帮助

执行测试

  • pycharm配置:默认运行的框架。Tools->Python Integrated tools->Default test runner
  • mian方法:pytest.main(['-s','-v','test_01.py'])
  • 命令行:pytest -s -v test_01.py

示例代码2(参考别人的):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
============================================================================== test session starts ===============================================================================
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

============================================================================= pytest-warning summary =============================================================================
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.
=============================================================================== 2 tests deselected ===============================================================================
=========================================================== 1 passed, 2 deselected, 1 pytest-warnings in 0.00 seconds ============================================================
  • 通过 -m "not website" 执行没有website标记的test方法
$ pytest  -v -m "not website" pytest1.py
============================================================================== test session starts ===============================================================================
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=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

============================================================================= pytest-warning summary =============================================================================
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.
=============================================================================== 1 tests deselected ===============================================================================
=========================================================== 2 passed, 1 deselected, 1 pytest-warnings in 0.00 seconds ============================================================

Case 1

$ pytest -v pytest1.py
============================================================================== test session starts ===============================================================================
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=1522920341
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
pytest1.py::test_3 PASSED
pytest1.py::test_2 PASSED

============================================================================= pytest-warning summary =============================================================================
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.
================================================================== 3 passed, 1 pytest-warnings in 0.01 seconds ===================================================================

Case 2

$ pytest -s pytest1.py
============================================================================== test session starts ===============================================================================
platform linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1
Using --randomly-seed=1522920508
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 setup_function called.
Test_1 called.
.teardown_function called.
setup_module called.
Test_2 called.
.Test_3 called.
.teardown_module called.


============================================================================= pytest-warning summary =============================================================================
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.
================================================================== 3 passed, 1 pytest-warnings in 0.01 seconds ===================================================================

3.  扩展插件

3.1 测试报告

安装与样例

pip install pytest-cov # 计算pytest覆盖率,支持输出多种格式的测试报告
pytest --cov-report=html --cov=./ test_code_target_dir

Console参数介绍

  • --cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
  • --cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
  • --cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
  • --no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
  • --cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败

Console Result

---------------------------------------------------------------- coverage: platform linux2, python 2.7.14-final-0 ----------------------------------------------------------------
Name         Stmts   Miss  Cover
--------------------------------
pytest1.py      18      0   100%

Html Result

image.png

3.2 测试顺序随机

pip install pytest-randomly

3.3 分布式测试

pip install pytest-xdist

3.4 出错立即返回

pip install pytest-instafail

“永不放弃,总有希望在前面等待!”送给自己,也送给正在阅读文章的博友们~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyCharm 是一款由 JetBrains 开发的 Python 集成开发环境(IDE)。它提供了许多强大的功能,使得 Python 开发变得更加高效和方便。在使用 PyCharm 之前,你可以阅读一下以下的 README 文件,了解更多关于 PyCharm 的信息和使用说明。 # PyCharm PyCharm 是一款功能强大的 Python 集成开发环境(IDE),由 JetBrains 公司开发和维护。它提供了许多有用的功能和工具,使得 Python 开发变得更加高效和愉快。 ## 主要特点 - 代码编辑器:具有智能代码补全、语法高亮、代码导航等功能,支持多种代码风格和主题。 - 调试器:强大的调试功能,可以逐行执行代码并查看变量值和堆栈跟踪。 - 项目管理:可以轻松创建、打开和管理 Python 项目,支持版本控制工具(如 Git)。 - 代码重构:提供了多种重构工具,可以帮助你重命名变量、提取方法、优化导入等。 - 单元测试:集成了常见的测试框架,如 unittest、pytest 和 doctest,方便编写和运行单元测试。 - 支持框架:对流行的 Python 框架(如 Django、Flask、Pyramid)提供了良好的支持。 - 插件系统:可以通过安装插件来扩展 PyCharm 的功能,满足个性化需求。 ## 安装和使用 1. 下载 PyCharm 安装包并进行安装。 2. 打开 PyCharm,并创建或打开一个 Python 项目。 3. 在编辑器中编写代码,使用各种功能和工具进行开发和调试。 4. 运行代码,查看运行结果和调试信息。 5. 根据需要进行代码重构、单元测试等操作。 6. 完成开发后,可以将项目打包、部署或分享给他人。 ## 更多资源 - 官方网站:https://www.jetbrains.com/pycharm/ - 官方文档:https://www.jetbrains.com/pycharm/documentation/ - 社区论坛:https://intellij-support.jetbrains.com/hc/en-us/community/topics/200366979-PyCharm-Community-Edition- - 插件市场:https://plugins.jetbrains.com/pycharm 请注意,这只是一个简单的 README 文件,如果你想深入了解 PyCharm 的功能和使用方法,请参阅官方文档或访问社区论坛获取更多帮助。祝你在使用 PyCharm 进行 Python 开发时取得成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小慌慌

感谢博友的鼓励,快乐分享~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值