我正在尝试创建一个简单的框架,它将发现特定目录中的所有测试用例(我对这些用例使用 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 的全局命名空间。但是,因为每个模块都有自己的全局 namespace ,所以我不确定是否可以连接到其他文件 namespace 。我也不确定这是否是正确的方法,或者是否有比我的实现更好的方法。我应该怎么做?
编辑 我当前似乎有效的解决方案是让 Autograder.py 文件更新 __builtins__ 模块并引用 Implementation 模块。实际的行看起来像:
__builtins__.ImplementationModule = imp.load_source("Implementation Module", "Implementation1.py")
这意味着当 TestCase1.py 可以通过 __builtins__ 访问 ImplementationModule 时。当然,问题是这假设 __builtins__ 模块从不实现任何名为 ImplementationModule 的东西,否则我将用未知的含义覆盖它。这样做有风险较小的版本吗?
请您参考如下方法:
你看过 Nose 系统吗?这听起来与您正在做的非常相似。
