我正在尝试创建一个简单的框架,它将从特定目录中发现所有测试用例(我对这些用例使用 unittest),并针对多个 python 文件运行这些测试用例中的每一个,这些文件都将使用相同的代码实现相同的代码函数签名。
Autograder.py
TestCasesFolder/
TestCase1.py
TestCase2.py
...
ImplementationFolder/
Implementation1.py
SecondImplementationFolder/
Implementation2.py
框架使用成功找到所有测试用例(注意这是在类中)
self.suites = unittest.defaultTestLoader.discover(self.testDirectory)
从那里,我想在 Implementation1 和 Implementation2 上运行这些套件。
我一直在使用内置
self.suites.run(unittest.TestResult)
来自 unittest 的方法来运行我的测试,我第一次尝试解决这个问题是导入我想要测试的当前实现
imp.load_source
然后使用正确的模块引用更新 TestCase1.py 的全局命名空间。但是,因为每个模块都有自己的全局命名空间,所以我不确定是否可以连接到其他文件命名空间。我也不确定这是否是正确的方法,或者是否有比我的实现更好的方法。我该怎么做呢?
编辑
我目前似乎可行的解决方案是让 Autograder.py 文件__builtins__
参考实施模块来更新模块。实际的行如下所示:
__builtins__.ImplementationModule = imp.load_source("Implementation Module", "Implementation1.py")
这意味着当 TestCase1.py 可以通过__builtins__
. 当然,问题是假设__builtins__
模块永远不会实现任何名为 ImplementationModule 的东西,否则我会用未知的含义覆盖它。这样做有没有风险较小的版本?