使用Pytest进行单元测试 pytest方法
haoteby 2024-12-15 13:12 37 浏览
PyTest简介
`pytest` 是一个非常流行的 Python 测试框架,提供了简单易用的测试功能。以下是 `pytest` 的基本使用方法:
- 安装 `pytest`
pip install pytest
- 创建测试文件
`pytest` 会自动发现以 `test_` 开头或 `_test` 结尾的文件。你可以创建一个名为 `test_example.py` 的文件。
# test_example.py
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
- 运行测试
在命令行中,导航到包含测试文件的目录,然后运行以下命令:
pytest
`pytest` 会自动查找以 `test_` 开头的测试文件,并执行其中的测试函数。
- 查看测试结果
运行 `pytest` 后,你会看到测试的结果,包括通过的测试和失败的测试。如果测试失败,`pytest` 会提供详细的错误信息,帮助你调试。
- 测试夹具(Fixtures)
`pytest` 还支持测试夹具,用于设置测试环境。可以使用 `@pytest.fixture` 装饰器定义夹具。例如:
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3]
def test_sum(sample_data):
assert sum(sample_data) == 6
- 参数化测试
你可以使用 `@pytest.mark.parametrize` 来参数化测试函数。例如:
import pytest
@pytest.mark.parametrize("a, b, expected", [
(1, 2, 3),
(-1, 1, 0),
(0, 0, 0)
])
def test_add(a, b, expected):
assert add(a, b) == expected
- 运行特定测试
如果你只想运行特定的测试,可以使用以下命令:
pytest -k "test_add"
- 生成测试报告
你还可以生成测试报告,比如 HTML 格式的报告。首先安装 `pytest-html`:
pip install pytest-html
然后运行测试并生成报告:
pytest --html=report.html
`pytest` 是一个功能强大且灵活的测试框架,适合用于单元测试和集成测试。通过上述方法,你可以快速上手并编写测试用例。
实践
这里有一个基于Alchemy 访问MySQL的类,要对其中的方法进行测试,使用pytest输出测试报告。写了三个单元测试文件,应用了夹具和参数进行测试,最终的结果如下:
测试代码如下:
# hanzi_test.py
import os
import sys
# 添加当前文件所在目录到Python路径中
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
# 添加包的父目录到Python路径中
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
from interface.mysql.db_dictation.service.HanziService import HanziService
from interface.mysql.db_dictation.entity.Hanzi import Hanzi
def test_hanzi():
obj = HanziService()
res = obj.getByHanzi('好')
for itm in res:
assert itm.f_hanzi == '好'
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
def test_hanzi_pinyin():
obj = HanziService()
res = obj.getByHanziAndPinyin('好', 'hào')
assert res.f_hanzi == '好'
assert res.f_pinyin == 'hào'
itm = res
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
def test_pinyin():
obj = HanziService()
res = obj.getByPinyin('hào')
for itm in res:
assert itm.f_pinyin == 'hào'
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
# fixture_test.py
import os
import sys
# 添加当前文件所在目录到Python路径中
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
# 添加包的父目录到Python路径中
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
import pytest
@pytest.fixture
def getObj():
from interface.mysql.db_dictation.service.HanziService import HanziService
from interface.mysql.db_dictation.entity.Hanzi import Hanzi
return HanziService()
def test_fixture_hanzi(getObj):
res = getObj.getByHanzi('好')
for itm in res:
assert itm.f_hanzi == '好'
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
def test_fixture_hanzi_pinyin(getObj):
res = getObj.getByHanziAndPinyin('好', 'hào')
assert res.f_hanzi == '好'
assert res.f_pinyin == 'hào'
itm = res
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
def test_fixture_pinyin(getObj):
res = getObj.getByPinyin('hào')
for itm in res:
assert itm.f_pinyin == 'hào'
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
# parametrize_test.py
import os
import sys
# 添加当前文件所在目录到Python路径中
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
# 添加包的父目录到Python路径中
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
from interface.mysql.db_dictation.service.HanziService import HanziService
from interface.mysql.db_dictation.entity.Hanzi import Hanzi
import pytest
@pytest.mark.parametrize("hanzi, pinyin, expected", [
('好', 'hào','好'),
('耗', 'hào','耗'),
('浩', 'hào','浩'),
('颢', 'hào','颢'),
])
def test_parametrize_hanzi(hanzi,pinyin,expected):
obj = HanziService()
res = obj.getByHanzi(hanzi)
for itm in res:
assert itm.f_hanzi == expected
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
@pytest.mark.parametrize("hanzi, pinyin, expected", [
('好', 'hào','好'),
('耗', 'hào','耗'),
('浩', 'hào','浩'),
('颢', 'hào','颢'),
])
def test_parametrize_hanzi_pinyin(hanzi,pinyin,expected):
obj = HanziService()
res = obj.getByHanziAndPinyin(hanzi, pinyin)
assert res.f_hanzi == hanzi
assert res.f_pinyin == pinyin
itm = res
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
@pytest.mark.parametrize("hanzi, pinyin, expected", [
('好', 'hào','好'),
('耗', 'hào','耗'),
('浩', 'hào','浩'),
('颢', 'hào','颢'),
])
def test_parametrize_pinyin(hanzi,pinyin,expected):
obj = HanziService()
res = obj.getByPinyin(pinyin)
for itm in res:
assert itm.f_pinyin == pinyin
print(f"{itm.f_hanzi} {itm.f_pinyin} {itm.f_meaning} {itm.f_sound_url} {itm.f_writing_url}")
参考文章:
- Python技术架构 https://www.toutiao.com/article/7422119050685334054/
- PyTest : https://docs.pytest.org/en/stable/index.html
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...