如何通过 pytest 正确测试 python 函数

How to properly test a python function via pytest

这是我的代码,我想在这里测试 validate_yaml 函数(我删除了函数体,因为它们不需要问题):

yaml_file_name = "env.yaml"
 
def load_yaml(file: str) -> list:
    pass


def validate_yaml(env_list: list):
    pass


def yaml_to_env(env_list: list):
    pass


env_list = load_yaml(f"{yaml_file_name}")
validate_yaml(env_list)
yaml_to_env(env_list)

这是我的测试文件:

import pytest
import jsonschema
from yaml_to_env import load_yaml, validate_yaml


@pytest.mark.parametrize(
    "invalid_yaml",
    [
        (load_yaml("tests/yaml_files/invalid_workload_type.yaml")),
    ],
)
def test_yaml_env(invalid_yaml):
    with pytest.raises(jsonschema.ValidationError):
        validate_yaml(invalid_yaml)

我的问题是,当我 运行 pytest 时,最后三行也被执行:

env_list = load_yaml(f"{yaml_file_name}")
validate_yaml(env_list)
yaml_to_env(env_list)

为什么要这样做?我只想测试 validate_yaml 函数,而不是在 pytest.

期间调用那三行

提前致谢

[编辑 1]

这是迄今为止我找到的最佳解决方案:

if __name__ == "__main__":
    env_list = load_yaml(f"{yaml_file_name}")
    validate_yaml(env_list)
    yaml_to_env(env_list)

您的编辑正是您需要在此处执行的操作。 在您之前的尝试中,代码已在测试文件中的生产代码 import 期间执行。 这不是 pytest 的问题,而是 python 的基本模块结构。 有关详细信息,请参阅此 link: What does if __name__ == "__main__": do? 简短回答中的第一点似乎是您所做的。 :)