- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 a_file
中有一些数据,我需要用它来参数化我的 fixture 。因此,我编写了一个辅助函数,它返回用文件中的数据填充的 a_list
。现在我可以通过 @pytest.fixture(params=a_list)
轻松地参数化我的 fixture 。看起来很简单,对吧?
这里的问题是 a_file
是由另一个 fixture 生成的,似乎 pytest 在 fixture 实际创建文件之前调用了依赖于该文件的 helper。由于该行为,引发了 FileNotFoundError
。
我的代码是这样的:
def helper_returning_list_from_a_file():
with open("a_file") as a_file:
a_list = a_file.readlines()
return a_list
@pytest.fixture(scope="session")
def create_file_fixture(depends_on_other_fixtures):
# create "a_file" here
@pytest.fixture(params=helper_returning_list_from_a_file())
def a_fixture_which_is_parametrized_with_data_from_a_file(request):
return request.param
def test_which_uses(a_fixture_which_is_parametrized_with_data_from_a_file):
assert False
补充:create_file_fixture
需要是一个fixture,不能转化为普通函数,因为它依赖于其他fixture。
显而易见的解决方案是确保在需要文件的辅助函数执行之前创建文件。
所以我
将 create_file_fixture
的依赖项添加到应该像这样参数化的 fixture :
@pytest.fixture(params=helper_returning_list_from_a_file())
def a_fixture_which_is_parametrized_with_data_from_a_file(create_file_fixture, request):
return request.param
将 autouse
标志添加到创建文件的 fixture,如下所示:
@pytest.fixture(scope="session", autouse=True)
def create_file_fixture:
# create "a_file" here
但 pytest 仍然首先调用辅助函数,这会导致与上述相同的错误。
如何确保首先执行 create_file_fixture
?
我认为一个可能的解决方案是将辅助函数也转换为固定装置。所以我可以很容易地在那里添加依赖项,它会指示 pytest 应该按照哪个顺序执行固定装置。这看起来像这样:
@pytest.fixture()
def fixture_returning_list_from_a_file(create_file_fixture):
with open("a_file") as a_file:
a_list = a_file.readlines()
return a_list
这将解决我的文件不存在的问题,但这对我也不起作用,因为它会导致我在此处描述的另一个问题:parametrizing a test with a list returned from a fixture .
最佳答案
错误不是由 pytest
本身引起的。这是因为当模块被 Python 解释器加载时,名义上是在它到达 pytest 之前,你的辅助函数被调用。
不幸的是,您不能从一个 fixture 中产生多个值,也不能对惰性生成器进行参数化。原因是必须在运行任何固定装置或测试之前计算完整的图形,这意味着预先知道所有参数,如 this failed feature request 中所述。 . @Hoefling's comment建议一种解决此问题的方法。我会建议一种可能不那么 pytest-thonic,但应该仍然有效的方法。
为确保您的文件是预先创建的并且整个列表可用于参数化,请不要将其设为 fixture :只需将其作为模块加载代码的一部分运行并将列表设为模块属性即可。这不会阻止您在其他地方使用它。如果多个测试模块使用同一个列表,您可以将它放入一个单独的非测试模块中,然后将其导入到需要它的测试中。
def create_file_function():
# create "a_file" here
return 'a_file'
def helper_returning_list_from_a_file():
with open(create_file_function()) as a_file:
a_list = a_file.readlines()
return a_list
a_list = helper_returning_list_from_a_file()
@pytest.fixture(params=a_list)
def a_fixture_which_is_parametrized_with_data_from_a_file(request):
return request.param
def test_which_uses(a_fixture_which_is_parametrized_with_data_from_a_file):
assert False
我认为让 create_file_function
返回文件名更优雅/可配置。
给定的 a_file
看起来像:
ABC
DEF
pytest -v
的输出如下所示:
============================= test session starts ==============================
platform linux -- Python 3.6.4, pytest-3.4.2, py-1.5.2, pluggy-0.6.0 -- /...
cachedir: .pytest_cache
rootdir: /..., inifile:
plugins: remotedata-0.2.0, pep8-1.0.6, openfiles-0.2.0, doctestplus-0.1.2, arraydiff-0.2
collected 2 items
52765085.py::test_which_uses[ABC\n] PASSED [ 50%]
52765085.py::test_which_uses[DEF] PASSED [100%]
=========================== 2 passed in 0.01 seconds ===========================
关于python - Pytest:如何确保首先调用某个固定装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52765085/
我一直致力于将两个遗留数据库中的一些 57k 多条记录精炼和重构为一个与 Django 兼容的实体。现在,当我完成后,我将其转储为固定装置,并尝试将其加载到生产环境中。 我的问题是该进程不久后就被“杀
我有一个包含 3 个模型的应用程序,它们以父子方式相互引用: class A(Model): # ... class B(Model): a = ForeignKey(A) #
我在我的 Django 应用程序中使用夹具,但只有两个应用程序正在加载它们的夹具。 当我使用 --verbosity=2 手动运行 loaddata 时,我可以看到它只在两个应用程序中查找,尽管我在其
我正在寻找一个快速的 BigFloat 单元,它可以处理加法、减法、乘法和除法(对数可以,但不是必需的),并且精度至少为 100 位小数。我试过this单位,但它比标准扩展操作慢大约 1,000 倍。
我有一个 Django 应用程序。我有包含测试数据的 .json 固定文件,以及使用数据确认应用程序正常工作的单元测试。我还使用 South 来迁移我的数据库。 在进行了几次数据库迁移后,我的固定装置
我创建了一些模型,我想为其提供初始数据。问题是模型有好几个,我想整理一下数据。 目前,我有一个包含数据的大 JSON 文件:initial_data.json。我以为我可以使用一些注释,但是 JSON
我的项目中有以下文件树: ... tests/ __init__.py test_abc.py ... 我在 __init__.py 中定义了一个固定装置: @pytest.fixtu
目前,我所有的装置都与它们要用于的 table 同名,因为最近出现了 rails 问题,似乎不可能有一个以“test”这个词开头的装置 有谁知道有一种方法可以使用不同的灯具名称,然后将其映射到正确的表
我正在尝试向使用多个数据库的 rails (v 3.1.3) 应用程序添加测试装置。 该夹具应仅应用于应用程序自己的测试 sqlite 数据库: test: adapter: sqlite3
我正在尝试在Docker容器中运行riofs,但是当我尝试运行riofs时,出现以下错误: fuse: device not found, try 'modprobe fuse' first ERRO
我制作了一个基本包,以方便在 Pyramid 应用程序中使用 SQLAlchemy:pyramid_sqlalchemy 。当您使用此包为应用程序编写测试时,您将需要一些固定装置来提供工作数据库环境。
有没有办法将我现有的数据库行导出为 Doctrine 装置? 最佳答案 不幸的是,目前没有 symfony 1.x 中的导出功能 关于doctrine - Symfony2 将数据库导出到 Doctr
我正在尝试创建一组测试用例来覆盖我的 Django 应用程序。我需要预定义的数据库数据来运行我的一些测试。所以我决定使用固定装置。 我所做的是:1)创建 fixture 文件: oleg$ pytho
我有以下结构: demo/ conftest.py test_1.py test_2.py conftest.py 内容为: import pytest @pytest.fixture()
有人在 Windows 上安装过 Polymer 吗?我刚开始使用 GIT,它说你需要 Bower 和 Node 以及其他一些东西才能让它工作。 最佳答案 我们正在开发一个简单的 ZIP 文件供人们下
Python 和 Django 的新手,尝试导入 .json 文件。 JSON 文件的结构使得每个根级对象中都有一个嵌套对象。 例如,JSON 的结构为: [ { "model": "test
我正在尝试理解提供的示例 here并模拟它适用于 post 方法而不是 get 方法。 当我测试 response.status_code == 200 时,一切正常。如何在不重复代码的情况下测试多个
我正在使用 jasmine fixtures,我想用一个包含 iframe 的 HTML 编写一个测试。 问题是测试在我的 iframe 加载之前执行。 库本身有解决方案吗? 还是我必须实现自己的机制
我有一个基于 Symfony2 + Doctrine2 构建的应用程序,我想为其创建一些测试(使用 phpunit)。 例如,如果我想针对数据库中的记录测试一个唯一验证器,我想创建一个我可以使用的记录
如何在 .yml 中为 has_many 和 belongs_to 变量创建示例数据。 这是将这些文件添加到终端中一个简单的 rails new lab 命令的示例。我真的不知道如何用英语解释这个。但
我是一名优秀的程序员,十分优秀!