我的代码将路径作为命令行参数,在该位置打开文本文件并将其读入变量。
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文档不清楚,并且对于应该直截了当的事情感到困惑。我们赞赏最佳实践方法。
答案 0 :(得分:1)
这是熟悉名为tmpdir
的pytest内置夹具的好机会。
以下是您的功能示例,其中我有两个文件module.py
和test_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
fixture对象。
接下来,tmpdir
可以直接用于创建新目录和新文件。在这种情况下,我只是在其中放入一些随机名称作为目录和文件,然后将一些玩具数据写入其中。只要我们设置测试以寻找正确的成功计算结果,它们的含义并不重要。
请注意,我将值f
传递给函数fill_list
。从函数fill_list
运行代码时,该函数会将其视为文件路径,因为tmpdir
对象的实现方式使它们像路径一样被处理。
我依赖的一个特殊行为在documentation for os.path.join
:
如果组件是绝对路径,则抛弃所有先前的组件,并从绝对路径组件继续连接。
因此,即使fill_list
尝试执行操作os.path.join(os.path.dirname(__file__), path)
,当path
来自tmpdir
时,它将是一个绝对路径,因此第一部分将被忽略(这是我们想要的测试)。
(注意,如果您没有对fill_list
必须添加到文件名前的假设进行硬编码,这也表明您的os.path.dirname(__file__)
设计可以得到改进。 fill_list
可以使用调用者提供的任何路径,当您设置调用它的路径时,你可以确保仅在需要时添加os.path.dirname(__file__)
。它&# 39;没有必要,但通常是一个好主意。)
当pytest完成时,它知道会自动销毁由tmpdir
创建的文件和目录,因此您不必担心这一点。