pytest:源文件和测试文件在另一个目录中

时间:2018-07-25 15:25:29

标签: 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

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

from pkg.src1 import src1
from pkg.src2 import src2

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

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

例如,我的包含路径为:

../src/pkg

如何在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

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

import sys
sys.path.append('..\..\src')

conftest.py第二个源代码树(无法从任何目录运行任何测试):

import sys
sys.path.append('..\..\..\..\..\..\..\code\src')

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

编辑:在this问题的帮助下解决了此问题。

我最终制作了一个批处理脚本,该脚本查找以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 

1 个答案:

答案 0 :(得分:3)

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

export PYTHONPATH="$PYTHONPATH:$PWD"

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

import sys
import os
sys.path.append(os.path.abspath('../src/pkg'))