pytest:不同目录下的源文件和测试文件

cap*_*jim 7 python unit-testing pytest

我有一个项目,它由源代码和测试代码组成。源代码存储在一个目录中,我的测试存储在另一个目录中。

root
  |- src
  | |- pkg
  | | | - __init__.py
  | | | - src1.py
  | | | - src2.py
  |- test
  | |- tests_for_pkg
  | | | - __init__.py
  | | | - first_test.py
  | | | - second_test.py
Run Code Online (Sandbox Code Playgroud)

当我运行我的测试时,我需要在_test.py文件中导入我的所有源代码。

from pkg.src1 import src1
from pkg.src2 import src2
Run Code Online (Sandbox Code Playgroud)

我想使用python -m pytest <tests>或运行脚本一次性运行我的所有测试,但我不断收到有关我的导入的错误。

我之前在 Eclipse IDE 中遇到过 Python 路径问题,因此我选择使用相对路径,并根据文件夹结构中的相对路径将它们作为外部库添加到 Python 路径中。

例如,我的包含路径是:

../src/pkg
Run Code Online (Sandbox Code Playgroud)

如何在 Python 命令行/作为 Python 脚本实现这样的相对路径?

编辑:使用提供的链接,我能够通过添加conftest.py文件并附加我的代码的位置来使我的测试工作。

但是,我的实际项目有一个庞大的源代码树,如下所示:

root
| - projectdir
| | - projectone
| | | - datedir
| | | | - trunk
| | | | | - sd
| | | | | | - code
| | | | | | | src
| | | | | | | - pkg
| | | | | | | | - __init__.py
| | | | | | | | - src1.py
| | | | | | | | - src2.py
| | | | | | - model
| | | | | | | - testdir
| | | | | | | | - testware
| | | | | | | | | - unittest_pkg
| | | | | | | | | | - test
| | | | | | | | | | | - tests_for_pkg
| | | | | | | | | | | | - first_test.py
| | | | | | | | | | | | - second_test.py
Run Code Online (Sandbox Code Playgroud)

conftest.py 第一个源代码树(允许我从测试目录运行我的测试):

import sys
sys.path.append('..\..\src')
Run Code Online (Sandbox Code Playgroud)

conftest.py 第二个源树(不能从任何目录运行任何测试):

import sys
sys.path.append('..\..\..\..\..\..\..\code\src')
Run Code Online (Sandbox Code Playgroud)

当我使用与以前完全相同的方法时,它不起作用。conftest.py它可以搜索src目录的距离是否有限制?

编辑:在这个问题的帮助下解决了。

我最终制作了一个批处理脚本,该脚本查找以结尾的任何文件test.py并运行它们。

@echo off
for /r %%i in (*test.py) do (
    setlocal
    set PYTHONPATH=../../../src/pkg
    python -m pytest --junitxml=%%~pi/JUnit_%%~ni.xml %%i
    endlocal
)

@RD /S /Q .pytest_cache 
Run Code Online (Sandbox Code Playgroud)

Ale*_*ung 5

PYTHONPATH为什么不在运行 pytest 之前添加当前目录?

export PYTHONPATH="$PYTHONPATH:$PWD"
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过以下方式将目录添加到测试中的 PYTHONPATH .py

import sys
import os
sys.path.append(os.path.abspath('../src/pkg'))
Run Code Online (Sandbox Code Playgroud)