Pytest测试框架基本使用方法详解

作者:-零 时间:2022-06-23 20:49:04 

pytest介绍

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

1、简单灵活,容易上手,文档丰富;

2、支持参数化,可以细粒度地控制要测试的测试用例;

3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);

4、pytest具有很多第三方插件,并且可以自定义扩展

  • 如pytest-selenium(集成selenium)、

  • pytest-html(完美html测试报告生成)、

  • pytest-rerunfailures(失败case重复执行)、

  • pytest-xdist(多CPU分发)、

  • pytest--ordering(控制测试运行的顺序)

5、测试用例的skip和xfail处理;

6、可以很好的和CI工具结合,例如jenkins

编写规则:

  • 测试文件以test_开头(以_test结尾也可以)

  • 测试类以Test开头,并且不能带有 init 方法

  • 测试函数以test_开头

断言使用基本的assert即可

快速示例

test_pyexample.py


import pytest

class TestClass:
   def test_one(self):
     x = "this"
     assert 'h' in x

def test_two(self):
     x = "hello"
     assert hasattr(x, 'check')

def test_three(self):
     a = "hello"
     b = "hello world"
     assert a in b

通过命令行运行:

1、cd 到代码所在的目录,执行命令:py.test test_pyexample.py

2、安装pytest-sugar插件可以看到进度条

Pycharm配置运行:

1.file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test


import pytest

class TestClass:
   def test_one(self):
     x = "this"
     assert 'h' in x

def test_two(self):
     x = "hello"
     assert hasattr(x, 'check')

def test_three(self):
     a = "hello"
     b = "hello world"
     assert a in b

if __name__ == "__main__":
 pytest.main('-q test_class.py')

Console常用参数介绍:

  • -v 用于显示每个测试函数的执行结果

  • -q 只显示整体测试结果

  • -s 用于显示测试函数中print()函数输出

  • -x, --exitfirst, exit instantly on first error or failed test

  • -m 只运行带有装饰器配置的测试用例

  • -h 帮助



py.test # run all tests below current dir
py.test test_mod.py # run tests in module file test_mod.py
py.test somepath # run all tests below somepath like ./tests/
py.test -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
py.test 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参数化

使用装饰器:@pytest.mark.parametrize()

单个参数:


import pytest
import random
@pytest.mark.parametrize('x',[(1),(2),(6)])
def test_add(x):
 print(x)
 assert x==random.randrange(1,7)

多个参数:


import pytest
@pytest.mark.parametrize('x,y',[
 (1+2,3),
 (2-0,1),
 (6*2,12),
 (10*2,3),
 ("test","test"),
])
def test_add(x,y):  #必须与上面保持一致,只能用x,y不能用其他字母
 assert x==y

控制测试运行顺序

安装pytest-ordering

pip install pytest-ordering

借助于装饰器@pytest.mark.run(order=1)控制测试运行的顺序


import pytest
import time
value=0
@pytest.mark.run(order=2) #后执行order=2
def test_add2():
 print("I am 2")
 time.sleep(2)
 assert value==10
@pytest.mark.run(order=1)  #先执行order=1
def test_add():
 print("I am add")
 global value
 value=10
 assert value==10

运行后生成测试报告(htmlReport)

安装pytest-html:

pip install -U pytest-html

如何使用:

py.test test_pyexample.py --html=report.html

更详细的测试报告

安装 pytest-cov:

pip install pytest-cov

如何使用


py.test --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,则认为失败

多进程运行

安装pytest-xdist:

pip install -U pytest-xdist

如何使用:

py.test test_pyexample.py -n NUM

其中NUM填写并发的进程数。

重新运行失败的用例

安装pytest- rerunfailures:


import random
def add(x,y):
 return x+y
def test_add():
 random_value=random.randint(2,7)
 print('random_value:'+str(random_value))
 assert add(1,3)==random_value

如何使用:

命令:pytest --reruns 重试次数

比如:pytest --reruns 3表示:运行失败的用例可以重新运行3次

命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)

比如:pytest --reruns 3 --reruns-delay 5表示:(译:瑞软四、地类)运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟

另外也可以通过装饰器的方式配置:

@pytest.mark.flaky(reruns=3, reruns_delay=5)

来源:https://www.cnblogs.com/-wenli/p/13953634.html

标签:Pytest,测试,框架
0
投稿

猜你喜欢

  • vue中如何引入html静态页面

    2023-07-02 17:03:34
  • Vue3.0中的monorepo管理模式的实现

    2024-04-28 09:24:51
  • Python如何执行系统命令

    2021-09-25 05:49:02
  • 离线状态下在jupyter notebook中使用plotly实例

    2022-04-19 18:05:59
  • vue中使用jwt-decode解析token的方法

    2023-07-02 17:03:24
  • 海量数据库的查询优化及分页算法方案集合2/2

    2024-01-22 22:09:38
  • Python中有趣在__call__函数

    2022-04-04 14:06:22
  • 用javascript给表格加滚动条

    2008-10-15 10:03:00
  • go sync.Once实现高效单例模式详解

    2024-02-05 05:49:37
  • Go语言基础函数基本用法及示例详解

    2024-05-09 14:57:15
  • python实现五子棋小程序

    2023-12-04 20:49:37
  • 如何把数组转换成字符串?

    2009-11-06 13:49:00
  • gulp-htmlmin压缩html的gulp插件实例代码

    2023-08-06 01:20:18
  • python学习实操案例(三)

    2023-01-16 15:13:12
  • 基于Django框架的rest_framework的身份验证和权限解析

    2021-02-21 23:42:58
  • PyTorch搭建一维线性回归模型(二)

    2023-02-16 19:27:15
  • node.js操作mysql(增删改查)

    2024-01-26 00:02:50
  • Python使用numpy产生正态分布随机数的向量或矩阵操作示例

    2022-12-28 05:44:11
  • Thinking XML: 创建 XML 的好建议

    2008-05-29 11:25:00
  • Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例

    2023-04-20 15:10:44
  • asp之家 网络编程 m.aspxhome.com