在子文件夹

时间:2017-11-26 16:30:08

标签: python unit-testing pytest

我正在使用python pytest来运行我的单元测试。 我的项目文件夹是:

Main - 包含数据文件:A.txt

Main\Tests - 我运行pytest的文件夹

Main\Tests\A_test - 包含测试文件的文件夹

A_test文件夹中的测试使用文件A.txt(位于主文件夹中)。

我的问题是,当我运行py.test时,测试失败,因为找不到A.txt

我发现这是因为pytest在运行测试时使用路径Main\Test而不是将路径更改为Main\Tests\A_test(我在打开A.txt时使用相对路径测试文件)

我的问题:有没有办法让pytest更改目录到它为每个测试执行的测试文件夹?那么测试中的相对路径仍然可以工作?

还有其他一些通用的解决方法吗? (我不想把所有东西都改成绝对路径或类似的东西,这也是一个例子,在现实生活中我有几百个测试)。

谢谢,

诺姆

5 个答案:

答案 0 :(得分:5)

选项A

在项目的根目录下,创建一个名为 tests.py 的文件

jquery(*, someJqueryElementName).not([(@dataType='optgroup')]);

然后您可以使用命令jquery(*, someJqueryElementName).not([(dataType='optgroup')]); 来运行测试。


选项B

对于那些喜欢使用批处理/ bash运行脚本的人,我们可以更改批处理/ bash中的目录,然后调用运行pytest框架的Python脚本。为此,请在项目文件夹中创建以下脚本。

test.bat (对于Windows)

import os, pathlib
import pytest

os.chdir( pathlib.Path.cwd() / 'Tests' )

pytest.main()

test.sh (对于Linux)

python tests.py

然后在Tests文件夹中,使用以下内容创建一个名为 runner.py 的文件

@echo off

cd /d %~dp0Tests
python %~dp0Tests/runner.py %*
cd /d %~dp0

如果您的目录结构在Tests文件夹中包含某种类型的lib文件夹,我们可以通过创建带有以下内容的 pytest.ini 配置文件来指示pytest忽略它。

cd $PWD/Tests
python runner.py $@
cd $PWD

在这种情况下,您的目录/文件结构最终将是:

import pathlib, sys
import pytest

cwd = pathlib.Path.cwd()

# Add the project's root directory to the system path
sys.path.append(str( cwd.parent ))

# This is optional, but you can add a lib directory 
# To the system path for tests to be able to use
sys.path.append(str( cwd / 'lib' ))

pytest.main()

其他信息

这不是运行pytest的典型方法,但是我更喜欢使用[pytest] norecursedirs = lib ,因为这个小技巧使我们能够:

  • 具有任何目录结构。
  • 在测试运行程序启动之前执行代码。
  • 您仍然可以传递命令行选项,其行为与直接运行root ├── test.bat ├── test.sh ├── Main └── Tests ├── runner.py ├── pytest.ini # Optional pytest config file ├── lib # Optional, contains helper modules for the tests ├── tests # Tests go here └── # Or, in the OPs case, you could also place all of your tests here 命令的行为完全相同。

答案 1 :(得分:2)

__init__.py添加到测试包中对我有用。所有测试都在之后执行。

答案 2 :(得分:1)

嗯,我有点解决了它,不确定它是最好的方法,但它正在发挥作用:

在每个测试中:

  1. 我检查测试是从目录执行还是从\Main\Tests
  2. 执行
  3. 如果是从\Main\Tests执行,那么我chdir\Main\Tests\A_test
  4. 我是在def setUpClass方法下完成的。

    例如:

    @classmethod
    def setUpClass(cls):
        if (os.path.exists(os.path.join(os.curdir, "A_test"))):
            os.chdir("A_test")
    

    无论是从Tests文件夹(使用pytest)还是从A_test文件夹(通过pycharm)执行测试都会使测试通过

答案 3 :(得分:0)

假设您需要在Main中使用根sys.path

提供当前目录为Main/

$python -m pytest Tests/A_test

这会将Main附加到sys.path并在A_test子目录中运行测试。 有关pythonpath和pytest关系的更多信息,请点击此处:http://doc.pytest.org/en/latest/pythonpath.html#pythonpath

答案 4 :(得分:0)

我认为“最真实”的答案(可能取决于意见)来自 pytest docs 自己:testpaths 配置选项可以在 setup.cfgpytest.initox.inipyroject.toml 文件。