【问题标题】:How do you run pytest tests on functionality inside of a for loop and yield?如何对 for 循环和产量内的功能运行 pytest 测试?
【发布时间】:2022-01-16 22:51:09
【问题描述】:

例如, 我将数据列表传递给函数。如何对 get_messagefoo_functionyield 进行 pytest?

我认为我可以自行对 foo_function 进行 pytest,但很难找到如何测试一般迭代函数和专门使用 yield 的示例。

def get_message(records):
    for record in records:
        data = foo_function(record)
        if data['message'] == 'BAR':
            yield {
                'result': 'OK',
                'message': data['message']
            }

【问题讨论】:

  • 您可以将结果转换为列表(例如list(get_message(records)))并针对结果列表进行测试。根据foo_function 的复杂性,您可能还想模拟它。
  • 你有时间看看我的answer吗?很高兴收到您的反馈。

标签: pytest python-3.7


【解决方案1】:

这是一个提供一些提示的示例。

  • yield 输出是一个生成器,带有默认值的next 方法(在本例中为None)可用于检索和测试该值。
  • pytest.mark.parametrize 可用于测试不同的组合
  • 在示例中,我编写了一个愚蠢的foo_function 来返回一些测试数据。根据您的用例,您可以选择模拟它。
import pytest


def foo_function(record):
    data = {"OK": {"message": "BAR"}, "NOK": {"message": "FOO"}}
    return data.get(record)


def get_message(records):
    for record in records:
        data = foo_function(record)
        if data["message"] == "BAR":
            yield {"result": "OK", "message": data["message"]}


@pytest.mark.parametrize(
    "record,result", [("OK", {"result": "OK", "message": "BAR"}), ("NOK", None)]
)
def test_get_message(record, result):
    assert next(get_message([record]), None) == result

测试执行

pytest -rA test_mock.py
# ...
# PASSED test_mock.py::test_get_message[OK-result0]
# PASSED test_mock.py::test_get_message[NOK-None]

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2023-04-04
    • 2015-04-09
    相关资源
    最近更新 更多