测试框架pytest学习与实践

pytest是一个专业的测试框架,可以帮助我们对python项目进行测试,提高测试的效率。

pytest官网手册:pytest: helps you write better programs — pytest documentation

中文手册:Pytest 教程

入门学习

安装pytest

pip install pytest

写例子test_sample.py

def inc(x):return x + 1def test_answer():assert inc(3) == 5def test_answer2():assert inc(3) == 4

注意里面的测试函数都是test_开头,按照pytest的规范,需要以“test”4个字母开头的函数才会被测试。

执行测试

pytest test_sample.py

显示:

==================================== FAILURES =====================================
___________________________________ test_answer ___________________________________def test_answer():
>       assert inc(3) == 5
E       assert 4 == 5
E        +  where 4 = inc(3)test_sample.py:9: AssertionError
============================= short test summary info =============================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================== 1 failed, 1 passed in 0.20s ===========================

可以看到,两个测试函数,assert inc(3) == 5的这个没有测试通过。

pytest提高篇

多文件测试

当前目录和子目录的所有类似test_*.py*_test.py 的文件,都会自动参与测试。

比如我们在当前目录下,再写一个文件test_sysexit.py:

# content of test_sysexit.py
import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()

然后在当前目录直接执行pytest命令,则会自动测试test_sample.py test_sysexit.py这两个文件,并给出测试结果:

collected 3 items                                                                 test_sample.py F.                                                           [ 66%]
test_sysexit.py .                                                           [100%]==================================== FAILURES =====================================
___________________________________ test_answer ___________________________________def test_answer():
>       assert inc(3) == 5
E       assert 4 == 5
E        +  where 4 = inc(3)test_sample.py:9: AssertionError
============================= short test summary info =============================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================== 1 failed, 2 passed in 0.46s ===========================

使用“raises helper”来引起异常

前面的例子中,如果f()函数没有抛出SystemExit异常,那么这个测试将会失败。如果抛出SystemExit异常,那么这个测试通过。

功能测试需求唯一的目录

为功能测试请求唯一目录

# content of test_tmp_path.py
def test_needsfiles(tmp_path):print(tmp_path)assert 0

输出信息如下:

/tmp/pytest-of-skywalk/pytest-2/test_needsfiles0
============================= short test summary info =============================
FAILED test_tmp.py::test_needsfiles - assert 0
1 failed in 0.17s

可以看到创建了一个临时文件目录:/tmp/pytest-of-skywalk/pytest-2/test_needsfiles0

在kotti项目里集成测试

先安装好需要的库

pip install pytest-flake8 pytest-cov

执行测试

~/github/Kotti]$ pytest

有很多报错,主要是 Unittest-style tests are deprecated as of Kotti 0.7.因此需要按照Kotti的文档和pytest的最佳实践,将unittest风格的测试迁移到pytest风格。

将unittest风格的测试迁移到pytes

这恐怕是一个比较大的工程了,但是肯定要先迁移过去,因为现在的测试已经不能用了。先订好这个目标。

在Kotti目录执行 pytest ./kotti/tests/test_app.py ,输出:

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

-------- coverage: platform freebsd13, python 3.10.13-final-0 --------
Name                                Stmts   Miss  Cover   Missing
-----------------------------------------------------------------
kotti/__init__.py                     109     39    64%   1-30, 40-46, 50, 59-163, 167, 171, 186, 198, 249, 258
kotti/events.py                       209     51    76%   100-101, 105, 110-114, 117, 120, 123-125, 128, 270-278, 320, 332-340, 350-352, 356-366, 397, 412, 415, 423-424, 440, 444, 451, 458, 464, 510-511, 515-518, 522-524
kotti/fanstatic.py                     46      3    93%   66, 69, 90
kotti/filedepot.py                    284    142    50%   99-106, 114-127, 134, 140, 146, 152, 169-174, 182, 191, 210-211, 220-222, 242-245, 269-281, 313-327, 335-337, 346-348, 352, 356-358, 363-394, 455-492, 498-509, 513, 522, 528-538, 566, 587-619, 638-640
kotti/interfaces.py                     8      0   100%
kotti/message.py                       54     35    35%   22-23, 28-32, 59-68, 94-108, 117-128
kotti/migrate.py                      123     55    55%   66, 121-122, 140-164, 168-169, 173-190, 194-259
kotti/populate.py                      33      0   100%

kotti/workflow.py                      51     11    78%   24-32, 71-94
-----------------------------------------------------------------
TOTAL                                3975   1893    52%

============================= short test summary info =============================
FAILED kotti/tests/test_app.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options'
==================== 1 failed, 16 passed, 1 warning in 14.36s =====================

说实话不太明白这个输出的意思,也就是只有一个测试文件是失败的,16个都是通过的。没看到说哪个文件失败啊? 还是说这个文件里面一共17个函数,失败了一个,通过了16个?

为什么用python -Wd setup.py test -q测试pytest显示: Ran 0 tests in 0.000s

看到有文章说要加入main函数

但是加入之后还是ran 0

最后在ubuntu下重新下载了kotti源码,进行了一系列修改后,使用pytest进行测试,总算跑起来了,跑的结果是:

TOTAL                                3975    335    92%

但是还有一些报错,如:FAILED kotti/tests/test_httpexceptions.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options',另外能看到tests目录里面的文件都没有执行测试,这也不太正常。

又安装了flake8-pytest ,现在最后的输出是:

FAILED kotti/views/edit/upload.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options'
============= 75 failed, 379 passed, 7 warnings in 186.68s (0:03:06) ==============

一系列修改是这些

 1756  vi /home/linuxskywalk/github/Kotti/kotti/tests/conftest.py1757  pip install -e . 1761  pip install pytest-flake8 pytest-cov1760  pytest kotti/tests

调试

直接运行pytest kotti/tests 目录报错

(py310) [skywalk@x250 ~/github/Kotti/kotti]$ pytest tests
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --flake8 --cov=kotti --cov-report=term-missing
  inifile: /usr/home/skywalk/github/Kotti/pytest.ini
  rootdir: /usr/home/skywalk/github/Kotti

安装缺少的库

pip install pytest-flake8 pytest-cov

运行kotti测试报错

FAILED kotti/tests/test_app.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options'

不知道该怎么办.....

报错Unittest-style tests are deprecated as of Kotti 0.7.

/usr/local/lib/python3.10/unittest/loader.py:122: DeprecationWarning: _init_testing_db: Unittest-style tests are deprecated as of Kotti 0.7. Please use pytest function arguments instead. obj = getattr(module, name)

这个报错信息实际上是一个DeprecationWarning,而不是一个错误(error)。它告诉你关于Kotti框架中某个功能或方法的弃用警告。具体来说,_init_testing_db这个可能是用于初始化测试数据库的函数或方法,在Kotti 0.7版本及以后的版本中已经被弃用了。

警告信息中建议,你应该使用pytest的函数参数来替代旧的unittest风格的测试。这意味着如果你正在编写或维护针对Kotti的测试,你需要将你的测试从unittest风格迁移到pytest风格。

在pytest中,你通常会使用装饰器(如@pytest.mark.parametrize)和函数参数来组织和管理你的测试,而不是继承unittest的TestCase类并编写setUp、tearDown等方法。

例如,假设你有一个旧的unittest风格的测试:

 

python

import unittest
from kotti import _init_testing_db
class MyTest(unittest.TestCase):
def setUp(self):
_init_testing_db()
def test_something(self):
# 测试代码

你应该将其转换为pytest风格的测试,可能看起来像这样:

 

python

import pytest
from kotti import create_app
@pytest.fixture
def app_with_testing_db():
# 这里是初始化测试数据库的代码
app = create_app(testing=True)
with app.app_context():
# 这里是初始化数据库的代码
# ...
yield app
# 这里是清理数据库的代码(如果需要)
# ...
def test_something(app_with_testing_db):
# 测试代码,使用传入的app_with_testing_db作为应用上下文

在上面的pytest示例中,我们使用了@pytest.fixture装饰器来定义一个测试夹具(fixture),这个夹具会在每个测试函数执行之前创建并初始化测试环境(包括数据库)。test_something函数接受这个夹具作为参数,从而可以在测试函数内部使用已经设置好的测试环境。

请注意,上述代码只是示例,你需要根据你的具体情况和Kotti的API来调整代码。

要修复这个警告,你需要检查你的测试代码,并按照Kotti的文档和pytest的最佳实践,将unittest风格的测试迁移到pytest风格。这通常涉及到重构测试类和测试方法,以使用pytest的装饰器和夹具。

使用pytest的时候,输出一个F后面跟很多绿色的点,是什么意思?

在使用pytest进行测试时,输出中的“F”代表一个失败的测试(Failed),而绿色的点(.)代表一个通过的测试(Passed)

输出中的“F”后面跟着很多绿色的点,意味着在测试套件中,有一个测试失败了,而其他的测试都通过了。应该查看失败的测试详情,了解为什么测试会失败,并据此修复代码或测试。 

原来是flake8那里测试没通过,具体见这里:pytest的时候输出一个F后面跟很多绿色的点解读-CSDN博客

kotti/alembic/versions/9398ccf41c2_add_content_state_fo.py::flake-8::FLAKE8 FAILED
kotti/tests/__init__.py::flake-8::FLAKE8 FAILED
kotti/tests/conftest.py::flake-8::FLAKE8 FAILED
kotti/tests/test_app.py::flake-8::FLAKE8 FAILED
kotti/tests/test_app.py::testing_db_url PASSED
kotti/tests/test_app.py::TestApp::test_override_settings PASSED
kotti/tests/test_app.py::TestApp::test_auth_policies_no_override PASSED
kotti/tests/test_app.py::TestApp::test_auth_policies_override PASSED
kotti/tests/test_app.py::TestApp::test_asset_overrides PASSED
kotti/tests/test_app.py::TestApp::test_pyramid_includes_overrides_base_includes PASSED

pytest输出是什么意思? Stmts Miss Cover Missing

这些统计数据更可能是由 pytest 结合代码覆盖率工具(如 coverage)生成的。这些统计数据提供了关于测试套件覆盖了多少源代码行的信息。 

  • Stmts: 表示总的源代码行数(statements)。
  • Miss: 表示没有被测试覆盖的源代码行数。
  • Cover: 表示代码覆盖率,通常以百分比表示。
  • Missing: 列出了没有被测试覆盖的具体源代码行或代码块。

提示@pytest.yield_fixture is deprecated.

/home/linuxskywalk/github/Kotti/kotti/tests/__init__.py:71: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.

顺手改了init文件:

/home/linuxskywalk/github/Kotti/kotti/tests/__init__.py

搞定

pyramid使用pytest报错:

pytest
ImportError while loading conftest '/home/linuxskywalk/github/Kotti/kotti/tests/conftest.py'.
_pytest.pathlib.ImportPathMismatchError: ('kotti.tests.conftest', '/home/linuxskywalk/py310/lib/python3.10/site-packages/kotti/tests/conftest.py', PosixPath('/home/linuxskywalk/github/Kotti/kotti/tests/conftest.py'))

执行pip install -e .之后,报错变成:

报错:ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]


ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --flake8 --cov=kotti --cov-report=term-missing
  inifile: /home/linuxskywalk/github/Kotti/pytest.ini
  rootdir: /home/linuxskywalk/github/Kotti

使用这条命令试试:pip install pytest-flake8 pytest-cov

好了,报错没有了,可以pytest执行下去了

执行结果显示:

TOTAL                                3975    335    92%

但是还有很多错误,如下:

报错 AttributeError: 'Application' object has no attribute 'parse_preliminary_options'

FAILED kotti/__init__.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options'

安装flake8-pytest试试

pip install flake8-pytest

还是不行,照旧。不过输出好看一点了:

FAILED kotti/views/edit/upload.py::flake-8::FLAKE8 - AttributeError: 'Application' object has no attribute 'parse_preliminary_options'
============= 75 failed, 379 passed, 7 warnings in 186.68s (0:03:06) ==============

pytest最开始是ran 0 ?

加了这句:

if __name__ == '__main__':
    unittest.main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/795091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm基础三——类加载器

类加载器 在Java中,类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类文件(.class文件)加载到JVM中,使得程序能够使用这些类。类加载器在Java中具有重要的作用&…

6 种事件驱动的架构模式

事件驱动架构(Event-Driven Architecture)是一种基于事件和事件处理的软件架构,它的核心思想是将系统的行为和逻辑抽象成一系列事件,这些事件在系统中按照一定的规则和顺序产生和传播,并被相应的处理器处理。事件驱动架构具有高度的灵活性、可…

【数据结构】考研真题攻克与重点知识点剖析 - 第 3 篇:栈、队列和数组

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用,相较于BPMNJS相对容易一些,更加灵活一些,但是扩展代码可能写得更多一些。 示例展示 使用方式 这个的使用方式就简单很多了,利用cdn把js下载下来,引入到HTML文…

c语言之向main函数传递参数

在c语言中&#xff0c;main函数也是可以传递传递参数的&#xff0c;业内向main函数传递参数的格式是 main(int argc,char *argv[]) 向main函数传递参数不是通过代码传递的&#xff0c;一般是通过dos命令传递 举个例子 #include<stdio.h> void main(int argc,char *ar…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境&#xff1a;conda activate env_name 接着使用&#xff1a;conda env list查看目标env的位置 如D:\anacon…

2023.4.7 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、过去方案和Motivation 4、Segment Anything模型 5、创新点 6、实验过程 7、实验结果 1、评价绩效 2、检测评价 3、跟踪评价 8、 结论 总结 引言 本周阅读了一篇关于高效的任意分割模型的文献&#xff0c;用于自…

JVM基础:类的生命周期详解

JDK版本&#xff1a;jdk8 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 一. 生命周期概述二. 加载阶段(Loading)2.1 加载步骤2.2 查看内存中的对象 三. 连接阶段(Linking)3.1 连接之验证3.2 连接之准备3.3 连接阶段之解析 四. 初始化阶段(Initialization)4.1 单个类的…

Arcgis Pro地理配准

目录 一、目的 二、配准 1、找到配准工具 2、添加控制点 3、选择控制点 4、添加更多控制点 5、配准完成、保存 三、附录 1、查看控制点或删除控制点 2、效果不好怎么办 一、目的 下面我们将两张地图进行配准&#xff0c;其中一张有地理位置&#xff0c;而另外一张没…

数据库的透视

在力扣做到这个题的时候&#xff0c;了解到了透视的概念&#xff0c;下面记录一下我对透视的理解&#xff0c;以及透视需要解决的一个很关键的问题。 一、题目描述 这个题要求重新格式化当前的表 表 Department&#xff1a; ------------------------ | Column Name | Typ…

前端面试高频: 理解 React/Vue 中 Key 的作用

一: 引言 在 React 或 Vue 项目中&#xff0c;我们经常在列表组件中使用key属性。key是给每一个vnode的唯一id&#xff0c;它在列表渲染和虚拟 DOM 操作中扮演着重要的角色。 当我们在渲染一个包含多个相同子组件的列表时&#xff0c;如果没有使用 key&#xff0c;React 或 Vue…

666666666666666666

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Linux (Ubuntu)- mysql8 部署

目录 1.基本部署 2.修改密码 3.开启root可远程连接配置 1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: …

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

Windows Edge 兼容性问题修复

修复Windows Edge兼容性问题的方法 如果你在使用Windows Edge浏览器时遇到了兼容性问题&#xff0c;可以尝试以下几种方法来解决&#xff1a; 方法一&#xff1a;更改注册表 使用WinR组合键打开运行对话框。在运行对话框中输入regedit并按回车键&#xff0c;打开注册表编辑器…

RK3568测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时&#xff0c;关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

在Ubuntu 14.04上如何备份和恢复Redis数据

简介 Redis 是一个内存中的键值缓存和存储&#xff08;也可以是数据库&#xff09;&#xff0c;同时也可以持久化&#xff08;永久保存&#xff09;到磁盘上。在本文中&#xff0c;您将了解如何在 Ubuntu 14.04 服务器上备份 Redis 数据库。 默认情况下&#xff0c;Redis 数据…

Day45 动态规划 part07

Day45 动态规划 part07 57. 爬楼梯&#xff08;卡码网&#xff09; 我的思路&#xff1a; 和昨天的组合总和题几乎一模一样的代码 解答&#xff1a; import java.util.*;public class Main {public static void main (String[] args) {Scanner myScanner new Scanner(Syst…