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

时间:2018-02-20 17:34:09

标签: python pytest

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

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文档不清楚,并且对于应该直截了当的事情感到困惑。我们赞赏最佳实践方法。

1 个答案:

答案 0 :(得分:1)

这是熟悉名为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 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创建的文件和目录,因此您不必担心这一点。