gpt4 book ai didi

python - 如何跨子模块导入

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:14 24 4
gpt4 key购买 nike

我们已经有了一个使用 nose 和 factory_boy 的测试框架。

按照建议,我们在每个模块目录中放置了一个/test 目录,这是我们放置 factories.py 文件和各种测试用例的地方。

我遇到的挑战是尝试在这些测试子模块之间导入工厂和函数。完整的代码分支在这里:

https://github.com/bethlakshmi/GBE2/tree/GBE-471

以防我没有传达足够有用的细节。

详细问题

相关结构的总结是:

/gbe
__init__.py
tests.py
(many more files)
/tests
__init__.py
factories.py
functions.py
(many files of tests, all tests_*)
/ticketing
__init__.py
tests.py
/tests
__init__.py
factories.py
test_edit_event.py

问题发生在最后一个文件夹中。

我似乎无法从 gbe.tests 导入任何东西,我想重用 factory.py 中提供的模拟和 functions.py 中的函数

无论我尝试什么,始终以以下任一形式产生结果:

Traceback (most recent call last):
File "/Users/bethlakshmi/Documents/mysite/GBE2/expo/ticketing/test/test_edit_event.py", line 27, in setUp
self.privileged_user = gbe_tests.factories.ProfileFactory.create().user_object
AttributeError: 'module' object has no attribute 'factories'

或类似于:

Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/nose/loader.py", line 420, in loadTestsFromName
addr.filename, addr.module)
File "/Library/Python/2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/Library/Python/2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/Users/bethlakshmi/Documents/mysite/GBE2/expo/ticketing/test/test_edit_event.py", line 12, in <module>
import gbe.tests.factories as gbe_fact

ImportError: No module named factories

我尝试过的事情:

  • “from gbe.tests import functions, factories”的各种变体
  • 各种形式的“将 gbe.tests 导入为 gbe_test”并相应地重命名对工厂和函数的调用。
  • 弄乱 init.py 文件导入到那里,或者将 all 设置为 functions.py 和 factories.py

我要运行的命令是:

./manage.py 测试票务

据我所知,对于代码,gbe.tests 的内部内容根本不存在。我在导入 gbe.models、gbe.views、gbe.functions 等时没有问题。/ticketing 中的任何内容也没有问题

我已经阅读了 stackoverflow 中所有我能找到但没有成功的问题。

90% 的已接受答案似乎是“确保你有一个 init.py”——这对我来说已经是事实了。

我也试过弄乱系统路径,但没有成功。

注意事项:

你会看到我在 ticketing/tests/factories.py 中重复了我想要模拟的工厂 - 这是我可以运行 ticketing 中的测试的唯一方法,并且我拒绝在支票中破坏测试-如果我能帮忙的话。

我已经尝试删除这些类,但上述错误仍然存​​在 - 当我可以重构以删除这些冗余代码时,我会非常高兴地这样做。

最后一个问题

我错过了什么?

最佳答案

问题出在你的包结构上:

/gbe
__init__.py
tests.py
/tests
__init__.py
factories.py
functions.py

你有一个文件 tests.py 和一个包 tests。现在当你想 from gbe.tests import x 时,python 解释器不知道你是想从文件还是包中导入,默认情况下会尝试从文件中导入。

要解决此问题,我建议您将 tests.py 移动并重命名为 tests 包。

请注意,惯例是将测试文件夹放在主应用程序文件夹之外,例如 flask做。我个人使用以下结构进行测试:

/tests
/my_app
test_views.py
/integration
/factories
/fixtures
mocks.py
/my_app
views.py

所以我有一个 tests/my_app 文件夹,我在其中复制了 my_app 的结构 - 我只将单元测试放在那里。
我还有 tests/integration 文件夹,我没有在其中复制 my_app 的结构 - 我在那里使用了不同的命名。
我将工厂类和固定装置分组在单独的文件夹中,如果需要,我可以在所有测试中使用它们。

关于python - 如何跨子模块导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31747029/

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