gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:39:31 27 4
gpt4 key购买 nike

问题

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

'pkg_resources' 用于此目的。

当 unittest 使用 python 运行时,它工作正常。但是在运行扭曲试验时它会失败。

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

运行带有扭曲试验的测试用例时,会在路径中添加“_trial_temp”目录。请让我知道有什么办法可以解决这个问题吗?

示例目录结构:

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

试验测试.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将取决于 __init__.py 的存在tests 中的文件目录,设置 __name__trialTesttests.trialTest ;或者甚至myproject.tests.trialTest .

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

基本上,pkg_resources密切依赖于代码被加载和执行的命名空间的细节,所以你需要注意所有的设置都是一致的。如果您确保以相同的方式导入所有内容,使用相同的名称(例如,从不使用 __main__),那么这应该在 trial 之间完全一致。和标准库 unittest ;除了您将它(trial 本身)作为主脚本而不是您的测试脚本作为主脚本运行之外,这里的试用并没有什么特别之处。

关于python - 如何在使用扭曲试验运行 python unittest 时加载资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29303463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com