如何在子模块中导入

时间:2015-07-31 13:11:16

标签: python django python-2.7 unit-testing

我们有一个使用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导入任何东西,我想重用在factories.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

我尝试过的事情:

  • 来自gbe.tests导入功能,工厂&#34;
  • 的各种变体
  • 各种形式的&#34;导入gbe.tests为gbe_test&#34;并相应地重命名对工厂和功能的调用。
  • 搞乱 init .py文件导入,或者将 all 设置为functions.py和factories.py

我试图运行的命令是:

./ manage.py test ticket

据我所知,对于代码来说,gbe.tests的内部内容并不存在。我没有问题导入gbe.models,gbe.views,gbe.functions等。我也没有问题/票务

我已经阅读了stackoverflow中的每个问题,但我没有成功。

90%的已接受答案似乎是&#34;确保您拥有 init .py&#34; - 在我的情况下已经是这样了。

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

注意:

你会看到我在票务/ tests / factories.py中重复了我想要嘲笑的工厂 - 这是我在票务运行中获得测试的唯一方法,我拒绝如果我可以提供帮助,我会在办理登机手续时打破测试。

我已经尝试删除这些类,并且上面的错误占上风 - 当我可以重构删除这些冗余代码时,我会非常高兴地这样做。

最终问题

我错过了什么?

1 个答案:

答案 0 :(得分:2)

问题在于您的包结构:

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

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

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

请注意,惯例是将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的结构 - 我在那里使用不同的命名。
我将工厂类和灯具分组在一个单独的文件夹中,如果我愿意,我可以在我的所有测试中使用它们。