python 单元测试

pytest 框架

1. 概述

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

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

2. 使用介绍

2.1. 安装

pip install pytest

2.2. 示例代码:test_main.py

import pytest


def get_result(str_to_result):
    if '+' in str_to_result:
        res = str_to_result.split('+')
        return int(res[0]) + int(res[1])
    if '-' in str_to_result:
        res = str_to_result.split('-')
        return int(res[0]) - int(res[1])
    if '*' in str_to_result:
        res = str_to_result.split('*')
        return int(res[0]) * int(res[1])
    if '/' in str_to_result:
        res = str_to_result.split('/')
        return int(res[0]) / int(res[1])
@pytest.mark.increase
def test_get_result():
data1 = '100+5'
assert get_result(data1) == 105


@pytest.mark.reduce
def test_get_result1():
data2 = '100-5'
assert get_result(data2) == 95


@pytest.mark.increase
def test_get_result2():
data3 = '100*5'
assert get_result(data3) == 500


@pytest.mark.reduce
def test_get_result3():
data4 = '100/5'
assert get_result(data4) == 20.0
 

编写规则

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

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的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
  • 这个i行对用测试文件的测试用例
  • pytest test_maintest_main.py
  • 只测试对应路径下面的测试文件
    pytest + 文件路径
  • 只测试某测试文件下某一测试函数
    pytest test_main.py::test_get_result

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

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

  • 通过 -m "increase" 执行有increase标记的test方法
  • 通过 -m "not increase" 执行没有increase标记的test方法

Console参数介绍

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



posted @ 2021-06-15 15:46  独丨恋  阅读(538)  评论(0编辑  收藏  举报