python - 如何在计算 pytest *before* 固定装置之前跳过测试
问题描述
我有一个用 pytest 编写的相当大的测试套件,旨在对包括服务器端和客户端之间通信的应用程序执行系统测试。测试有一个巨大的固定装置,它被初始化以包含有关服务器的信息,然后用于创建客户端对象并运行测试。服务器端可能支持不同的特性集,并且它通过可能存在或不存在于由夹具初始化的服务器对象内的属性来反映。
现在,与这个问题非常相似,如果服务器对象中不存在所需的属性,我需要跳过某些测试。到目前为止,我们这样做的方式是在测试中添加一个装饰器,它检查属性并pytest.skip
在它们不存在时使用。
例子:
import functools
import pytest
def skip_if_not_feature(feature):
def _skip_if_not_feature(func):
@functools.wraps(func)
def wrapper(server, *args, **kwargs):
if not server.supports(feature):
pytest.skip("Server does not support {}".format(feature))
return func(server, *args, **kwargs)
return wrapper
return _skip_if_not_feature
@skip_if_not_feature("feature_A")
def test_feature_A(server, args...):
...
当其中一些测试有更多的夹具时,就会出现问题,其中一些设置相对耗时,并且由于 pytest 的工作方式,跳过它们的装饰器代码在夹具设置后运行,浪费了宝贵的时间。
例子:
@skip_if_not_feature("sync_db")
def test_sync_db(server, really_slow_db_fixture, args...):
...
我希望通过更快地跳过这些测试来优化测试套件以更快地运行。我只能想到两种方法:
- 重新编写装饰器以不使用服务器夹具,并使其在夹具之前运行。
- 运行决定跳过服务器夹具初始化和其余夹具初始化之间的测试的代码。
我很难弄清楚粗体部分是否可行,以及如果可以的话如何去做。对于类似的问题,我已经浏览了 pytest 文档和 google / stackoverflow 结果,但一无所获。
解决方案
您可以将带有功能名称的自定义标记添加到测试中,并在pytest_collection_modifyitems
需要时添加跳过标记。在这种情况下,将跳过测试而不先加载夹具。
conftest.py
def pytest_configure(config):
config.addinivalue_line(
"markers",
"feature: mark test with the needed feature"
)
def pytest_collection_modifyitems(config, items):
for item in items:
feature_mark = item.get_closest_marker("feature")
if feature_mark and feature_mark.args:
feature = feature_mark.args[0]
if not server.supports(feature):
item.add_marker("skip")
test_db.py
@pytest.mark.feature("sync_db")
def test_sync_db(server, really_slow_db_fixture, args...):
...
推荐阅读
- java - reactiveMongoTemplate.insert(t) 应该返回 ReactiveInsert
- google-cloud-platform - 如何在 https://identitytoolkit.googleapis.com/v1/accounts:signUp 的 POST 请求中发送附加属性
- javascript - 如何在 dart 中正确导入 js 库?颤振网络应用程序
- python-3.x - socket套接字消耗大量CPU
- database - VARBINARY 是在 Snowflake 中加入的好数据类型吗?
- ios - 呈现 UISearchController 后如何下移 UITableView?
- android - Android:如何以编程方式检查您的智能手机是否有单声道或立体声输出(1 或 2 个扬声器)
- node.js - Sequelize Pool to Postgres DB 同时在多个请求上失败
- postgresql - 在 Postgresql 中将相同的实体映射到不同的模式
- javascript - 如何在不使用异步等待的情况下使用 javascript 正确调用两个 REST API?