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



这是我的代码,我想在其中测试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的基本模块结构。有关详细信息,请参阅此链接:如果__name__==&quot__main__":做简短答案中的第一点似乎是你做了什么

最新更新