当运行针对使用反射的特定方法的测试时,我遇到的问题是测试的输出取决于我是否使用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()
我知道我的测试应该相互独立,并且与任何背景因素相关。这实际上就是我想在这里实现的目标。
如果我不清楚,我的问题是为什么行为不同,哪一个是正确的。如果您感觉非常慷慨,如何更改我的代码以使测试在所有平台上都成功。