从pytest访问模块的一部分

时间:2015-04-24 18:06:19

标签: python pytest

我在从pytest访问部分导入模块时遇到问题。

以下是代码引用的分支:https://github.com/asvc/snapshotr/tree/develop

特别是,在运行此测试时,它会按预期运行test_correct_installation(),但test_script_name_checking()会因AttributeError而失败。

import main as ss
import os

class TestInit:
    def test_correct_installation(self):
        assert os.path.exists(ss.snapr_path)
        assert os.path.isfile(ss.snapr_path + "/main/markup.py")
        assert os.path.isfile(ss.snapr_path + "/main/scandir.py")

    def test_script_name_checking(self):
        assert ss.ssPanel.check_script('blah') is None # Here it fails

Link to the main which is being tested

我想要做的是提取"提取"隔离的一段代码,用已知数据运行它并将结果与​​一些参考进行比较。似乎提取部分不能很好地工作,非常感谢这些案例的最佳实践。

回溯: AttributeError: 'module' object has no attribute 'ssPanel'

我在test_init.py

尝试了一个小黑客
class dummy():
    pass

nuke = dummy()
nuke.GUI = True

但它(显然)并不起作用,因为nuke.GUI在每次发布时都会在__init__.py中重新定义。

1 个答案:

答案 0 :(得分:1)

这是一个相当复杂的情况。当您在main中导入test_init.py时,它将导入main/__init__.py并执行所有代码。这会导致nuke被导入,如果nuke.GUI为False,则不会有ssPanel,如您所见。

问题在于,您无法在测试脚本中伪造虚拟核武器。它不会起作用。因为在测试运行之前,真正的核武器已经导入了。

我的建议是将ssPanel分隔到另一个python文件中。然后在__init__.py我们可以做到:

if nuke.GUI:
    from sspanel import ssPanel

在测试脚本中,我们也可以使用以下方法轻松导入它:

from main.sspanel import ssPanel