如何使用扭曲试验运行python unittest时加载资源文件

Dur*_*ose 5 python twisted pkg-resources trial python-unittest

问题

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

'pkg_resources'用于此目的.

当unittest与python一起运行时,它工作正常.但是在使用扭曲试验运行时失败了.

我的项目将testcase与python unittest测试用例以及twisted.trial.unittest测试用例混合在一起.因此,一般需要使用扭曲试验来运行两种类型的测试用例.

使用扭曲试验运行测试用例时,会在路径中添加'_trial_temp'目录.拜托,让我知道有办法解决这个问题吗?

示例目录结构:

myproject/
??? tests
    ??? data
    ?   ??? input.json
    ??? trialTest.py
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

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

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

OK
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

Gly*_*yph 4

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

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

您应该将模块重新命名为,test_trialtest.py以便试验的模块遍历代码正确地发现它,然后使用模块名称而不是文件名来调用它。这意味着您应该清楚地了解myproject/tests/test_trialtest.py模块名称应该什么。应该myproject是开着的sys.path吧?父目录?

基本上,pkg_resources密切依赖于代码加载和执行的命名空间的详细信息,因此您需要小心,确保所有内容设置一致。如果您确保所有内容都以相同的方式、相同的名称导入(例如,绝不是),那么这在和 stdlib__main__之间应该完全一致;这里的试用没有什么特别之处,除了您将它(本身)作为主脚本运行,而不是作为主脚本运行测试脚本。trialunittesttrial