如何在 运行 python unittest using twisted trial 时加载资源文件

how to load resource file while running python unittest using twisted trial

问题

作为 python 单元测试的一部分,将加载一些输入 json 文件,这些文件存在于 'data' 目录下,该目录与测试 py 文件位于同一目录中。

'pkg_resources'用于此目的。

当单元测试为 运行 python 时,它工作正常。但是在运行扭曲试验时失败了。

我的项目混合了 python 单元测试用例和 twisted.trial.unittest 测试用例。因此,通常需要 运行 两种类型的测试用例进行扭曲试验。

当运行使用扭曲试验测试用例时,路径中添加了'_trial_temp'目录。请让我知道有什么办法可以解决这个问题?

示例目录结构:

myproject/
└── tests
    ├── data
    │   └── input.json
    ├── trialTest.py

trialTest.py

import unittest
import inspect
import pkg_resources

class Test(unittest.TestCase):
    def test_01_pathTest(self):
        dataDirExists =     pkg_resources.resource_exists(inspect.getmodule(self).__name__, 'data')
        print 'data exists: %s' % (dataDirExists)

if __name__ == '__main__':
    unittest.main()

运行 使用 python 进行测试及其输出:

cd myproject
python tests/trialTest.py
data exists: True
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

运行 使用 python 进行测试及其输出:

cd myproject
/usr/local/bin/trial tests/trialTest.py
trialTest
  Test
    test_01_pathTest ... data exists: False
                                                  [OK]

-------------------------------------------------------------------------------
Ran 1 tests in 0.013s

PASSED (successes=1)

在第一个示例中,__name__ 将设置为 __main__tests 目录将自动添加到 sys.path。这或多或少是偶然发生的;如果您将 unittest.main 调用移动到另一个模块,您将无法以完全相同的方式导入它,并且 data 可能不会显示。

在第二个示例中,trial 将根据 tests 目录中是否存在 __init__.py 文件,将 __name__ 设置为 trialTesttests.trialTest;甚至 myproject.tests.trialTest.

您应该将模块重命名为 test_trialtest.py 以便它能被 trial 的模块遍历代码正确发现,然后使用 module 名称而不是调用它而不是文件名。这意味着您应该清楚 myproject/tests/test_trialtest.py 的模块名称 应该 是什么。 myproject 应该在 sys.path 上吗?父目录?

基本上,pkg_resources 与加载和执行代码的命名空间的细节密切相关,因此您需要注意确保一切设置一致。如果您确保所有内容都以相同的方式导入,使用相同的名称(例如,绝不是 __main__),那么 trial 和 stdlib unittest 之间应该完全一致;这里的 trial 没有什么特别的,只是你 运行 它(trial 本身)` 作为主脚本而不是你的测试脚本作为主脚本。

在测试目录中放置一个 __init__.py 可以解决问题。

[durai@localhost myproject]$ touch tests/__init__.py
[durai@localhost myproject]$ tree
.
├── tests
    ├── data
    │   └── input.json
    ├── __init__.py
    ├── trialTest.py
    └── trialTest.pyc

[durai@localhost myproject]$ trial tests/trialTest.py
tests.trialTest
  Test
    test_01_pathTest ... currModule: <module 'tests.trialTest' from '/home/durai/Worskspace/myproject/tests/trialTest.pyc'>
currModule: tests.trialTest
data exists: True
                                                  [OK]

------------------------------------------------------------------------------    -
Ran 1 tests in 0.016s

PASSED (successes=1)