如何通过 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?
简短回答中的第一点似乎是您所做的。 :)
这是我的代码,我想在这里测试 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?
简短回答中的第一点似乎是您所做的。 :)