pytest 获取当前测试文件的文件路径

Jas*_*ris 11 python pytest

我似乎无法获取 pytest 中正在测试的当前文件的文件路径。

\n\n

例如,考虑如下目录结构:

\n\n
devops_scripts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 devops_utilities\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 backupMonthly.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 generateAnsibleINI.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_backup.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 monitoring\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 analyizeCatalinaLog.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fetchCatalinaLogs.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 getaccountcredit.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pi_provisioning\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 piImageMake.sh\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 piImageRead.sh\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 piImageSquashSd.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 script_utilities\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 execute.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 path_handling.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sql_handling.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sourcedirfortests\n \xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.txt\n \xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.txt\n \xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test_ansible.txt\n \xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_execute.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我pytest从顶层运行,它将下降到测试test_execute.txt。当test_execute.txt正在测试时如何获取它的文件路径?(我可以rootdir通过os.path.abspath(\'.\')但这不是我需要的)

\n\n

(我需要能够设置这些路径,以便测试 和 上的一些执行内容file1.txtfile2.txt无论我尝试测试的各种内容嵌套得有多深,我也需要它才能工作。)我对设置特定的内容不太感兴趣临时测试目录并将其删除等。我只需要正在测试的文件的路径。

\n\n

我尝试过类似的事情:

\n\n
>>> print os.path.abspath(__file__)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这只会产生:UNEXPECTED EXCEPTION: NameError("name \'__file__\' is not defined",)

\n\n

我什至不访问 py.test 中的一些内部函数/对象

\n\n

(我应该补充一点,我需要它在 Python 2.7 和 Python 3.x 中工作)

\n

Sil*_*Guy 11

Pytest 为当前运行的测试设置 PYTEST_CURRENT_TEST env var。它不仅具有当前文件信息,还具有当前收集的测试 ID 的信息(如测试名称、参数等)。

import os
def test_current():
    print(os.getenv('PYTEST_CURRENT_TEST'))
Run Code Online (Sandbox Code Playgroud)

-s如果您想查看打印的文本,则必须使用pytest run 标志。

来自参考文档

在测试会话期间,pytest会将PYTEST_CURRENT_TEST设置为当前测试nodeid和当前阶段,可以设置、调用和拆卸。

  • 你是对的,@NickVeld。为了避免这种情况,应该使用“request”固定装置来获取当前正在运行的测试。`request.node` 应该可以。 (3认同)
  • 来自同一文档:“PYTEST_CURRENT_TEST 的内容应该是人类可读的,并且实际格式可以在版本之间更改(甚至错误修复),因此不应依赖它来进行脚本编写或自动化。” (2认同)

Abh*_*kar 6

与接受的答案相反,不要使用环境PYTEST_CURRENT_TEST变量。文档明确表示“不应依赖它\xe2\x80\x99 ”,在这种情况下,它甚至不是OP所要求的,即“当前正在测试的文件的文件路径”。

\n

给定以下目录结构:

\n
graph/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py/\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_graph.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 functions.py\n
Run Code Online (Sandbox Code Playgroud)\n

文件中PYTEST_CURRENT_TEST函数的值是:test_bfstest_graph.py

\n
\'graph/test/test_graph.py::test_bfs (call)\'\n
Run Code Online (Sandbox Code Playgroud)\n

request.path具有 值graph/test/test_graph.py。这正是OP所要求的。

\n

更多关于request: FixtureRequest 这里

\n