将Python unittest与其他测试模块中的导入隔离开来

时间:2016-05-30 23:32:53

标签: python python-unittest ptvs

当运行针对使用反射的特定方法的测试时,我遇到的问题是测试的输出取决于我是否使用PTVS(在测试资源管理器中运行所有测试)或使用命令行Python工具(在Windows和Linux系统上):

$ python -m unittest

我从一开始就认为它与测试运行者在PTVS和Python的单元测试框架中的工作方式有所不同(因为我也注意到了其他差异)。

# method to be tested
# written in Python 3
def create_line(self):
    problems = []
    for creator in LineCreator.__subclasses__():
        item = creator(self.structure)
        cls = item.get_subtype()
        line = cls(self.text)
        try:
            line.parse()
            return line
        except ParseException as exc:
            problems.append(exc)
    raise ParseException("parsing did not succeed", problems)

""" subclasses of LineCreator are defined in separate files.
They implement get_subtype() and return the class objects of the actual types they must instantiate.
"""

我注意到以这种方式找到的子类会有所不同,具体取决于调用此方法的代码中加载了哪些模块。这正是我想要的(现在)。有了这些知识,我总是小心翼翼地只能在任何给定的测试模块,类或方法中访问LineCreator的一个子类。

但是,当我从Python命令行运行测试时,从ParseException.problems属性可以清楚地看到两者都是一直加载的。它也很容易重现:插入以下代码会使所有测试在命令行上失败,但它们在PTVS上成功。

if len(LineCreator.__subclasses__()) > 1:
    raise ImportError()

我知道我的测试应该相互独立,并且与任何背景因素相关。这实际上就是我想在这里实现的目标。

如果我不清楚,我的问题是为什么行为不同,哪一个是正确的。如果您感觉非常慷慨,如何更改我的代码以使测试在所有平台上都成功。

0 个答案:

没有答案