gpt4 book ai didi

python - 如何在生成的列表上使用 pytest 测试

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:03 25 4
gpt4 key购买 nike

我有代码将路径作为命令行参数,在该位置打开一个文本文件并将其读入变量。

def main():
arg_parser.add_argument('-p','--path', action='store')
args = arg_parser.parse_args()
path = args.path
list_from_file = fill_list(path)

def fill_list(path):
fn = os.path.join(os.path.dirname(__file__), path)
with open(fn) as f:
pass_list = f.readlines()
return pass_list

如何让我的 pytests 查看 list_from_file ?

例如

def test_something():
assert any("something" in d for d in list_from_file)

我尝试过各种固定装置但没有成功;我发现 pytest 文档对于一些应该简单明了的东西来说不清楚且令人困惑。最佳实践方法值得赞赏。

最佳答案

这是熟悉名为 tmpdir 的 pytest 内置装置的好机会。 .

这是您的函数的示例,其中我有两个文件,module.pytest_module.py :

# module.py
import os


def fill_list(path):
fn = os.path.join(os.path.dirname(__file__), path)
with open(fn) as f:
pass_list = f.readlines()
return pass_list

# test_module.py
from module import fill_list


def test_fill_list(tmpdir):
f = tmpdir.mkdir("testdata").join("testfile.txt")
f.write("line1\nline2\nline3")
assert fill_list(f) == ["line1\n", "line2\n", "line3"]

当我运行pytest test_module.py时从源代码目录中,我得到:

(py36-keras) ely@eschaton:~/pytesttest$ pytest test_module.py 
============================================================= test session starts ==============================================================
platform linux -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/ely/pytesttest, inifile:
collected 1 item

test_module.py .

=========================================================== 1 passed in 0.01 seconds ===========================================================

这里有一些解释。首先tmpdir是 pytest 自动提供的特殊装置,因此您可以像我一样将其作为参数包含在测试函数中,而无需导入它或以其他方式对其进行任何定义。当pytest执行测试函数时,它会看到一个tmpdir参数已命名,它会自动传入自己的 tmpdir固定装置对象。

下一步,tmpdir可以直接用来创建新目录和新文件。在这种情况下,我只是在目录和文件中放置一些随机名称,然后向其中写入一些玩具数据。这些是什么并不重要,只要我们设置测试来寻找正确的成功计算结果即可。

请注意,我传递了值 f进入函数fill_list 。当从函数 fill_list 运行代码时,该函数会将其视为文件路径。 ,因为tmpdir对象的实现方式让它们被视为路径。

我所依赖的一个特殊行为在 documentation for os.path.join 的底部注明。 :

If a component is an absolute path, all previous components are thrown away and joining continues from the absolute path component.

所以,尽管 fill_list尝试执行操作 os.path.join(os.path.dirname(__file__), path) ,当 path来自tmpdir ,这将是一个绝对路径,因此第一部分将被忽略(无论如何,这正是我们想要进行测试的部分)。

(注意,这也表明,如果您不硬编码 fill_list 必须前置到文件名的假设,那么您的 os.path.dirname(__file__) 的设计可以得到改进。相反,只需让 fill_list 与任何调用者提供的路径,当您设置调用它的路径时,可以确保仅在需要时在前面添加 os.path.dirname(__file__)。这不是必需的,但通常是个好主意。)

当 pytest 完成时,它知道自动销毁 tmpdir 创建的文件和目录。 ,所以你不必担心这个。

关于python - 如何在生成的列表上使用 pytest 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com