【问题标题】:How can I make test data files accessible to pytest tests when run with tox?使用 tox 运行时,如何使 pytest 测试可以访问测试数据文件?
【发布时间】:2019-04-17 22:57:08
【问题描述】:

我想为一个函数运行一个test,该函数通过一个参数将一个Path 作为输入作为输入:function(some_path_to_file) 通过tox。我想传递给函数的文件不能在测试设置期间临时创建(我通常通过pytests builtin tmpdir fixtures 执行此操作),但位于测试目录<package>/tests 之外的包<package>/data 目录中(位置<package>/tests/data 可能会更好)。因为tox 在 vi​​rtualenv 中运行测试,所以我不清楚如何使测试数据文件可用于测试。我知道我可以使用--basedir option 定义pytest 的基本临时目录,但我还没有使用tox

tl;dr

问题是使用Path.resolve(some_path_to_filePath 转换为str(将其传递给function 内的sqlite3.connect(database)。无需以任何方式配置pytests--basedir选项和tox

【问题讨论】:

    标签: pytest tox


    【解决方案1】:

    这也把我绊倒了。我能够解决它的方法是指定文本文件的完整路径,我希望测试函数读取相对到基本目录。

    例如,我的目录树如下所示:

    .
    ├── __init__.py
    ├── my_package
    │   ├── __init__.py
    │   └── calculate_stats.py
    ├── my_package.egg-info
    │   ├── PKG-INFO
    │   ├── SOURCES.txt
    │   ├── dependency_links.txt
    │   ├── requires.txt
    │   └── top_level.txt
    ├── bin
    │   └── calculate_stats
    ├── requirements
    │   ├── default.txt
    │   └── development.txt
    ├── setup.py
    ├── test
    │   ├── __init__.py
    │   ├── test_calculate_stats.csv
    │   ├── test_calculate_stats.txt
    │   └── test_calculate_stats.py
    └── tox.ini
    

    在文件test_calculate_stats.py 我有以下行:

    assert (calculate_stats.calculate_stats_to_csv("test/test_calculate_stats.txt", "test/test_calculate_stats.csv") == 60)
    

    calculate_stats_to_csv 函数读取test/test_calculate_stats.txt 文件,计算一些统计数据,并将它们输出到test/test_calculate_stats.csv

    最初我刚刚将输入文件指定为test_calculate_stats.txt,因为它与包含测试函数的文件位于同一目录中——那时我遇到了错误。

    【讨论】:

    • 你通过 tox 中的 --basedir 选项向 pytest 传递了什么?
    • 实际上什么都没有——在tox.ini 我有commands = unit: pytest -v test 我的pytest 似乎无法识别--basedir。我正在使用的pytest 是 4.0.0 版,我正在运行 python v3.7.1
    • 在我的特定用例中,我通过connect(database, ... 连接到函数中的数据库,接受path like object。之前我将Path 转换为str 并将其传递给connect(database。我将生产代码从 function(some_path_to_file: Path) 更改为 function(some_path_to_file: str) 并删除了转换。该函数正确读取文件并运行测试。仍然想知道为什么 Path to str 转换工作 w.o.毒物
    • ... 想通了:在文件路径 some_path_to_filePathstr 的转换中,我使用 str(Path.resolve(...)) 获取完整路径并将其传递给 connect( str。如果使用相对路径转换str(Path(...)) 就可以了。
    【解决方案2】:

    tox 预定义多个substitutions。 virtualenv 的目录是{envdir}site-packages{envsitepackagesdir}。将一个值从命令行传递到您的测试脚本,如下所示:

    [testenv]
        commands = pytest --basedir={envsitepackagesdir}/mypackage
    

    【讨论】:

    • 我仍然不清楚测试代码应该是什么样子?
    • 传递{envsitepackagesdir} 或对您的代码进行任何替换;代码应该使用传递的值来计算数据的相对路径。更多详情请提供minimal reproducible example
    • MCVE 是次要的,因为下面的答案中的例子。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多