重载unittest.testcase的__init__

4 投票
1 回答
5785 浏览
提问于 2025-04-15 15:39

我想在我的子类中添加两个变量,这个子类是从unittest.testcase继承过来的。

比如我现在有:

import unittest

class mrp_repair_test_case(unittest.TestCase):

     def __init__(self, a=None, b=None, methodName=['runTest']):
             unittest.TestCase.__init__(self)
             self.a= a
              self.b = b

     def test1(self):
           ..........
           .......

def runtest()
    mrp_repair_test_case(a=10,b=20)
    suite = unittest.TestLoader().loadTestsFromTestCase(mrp_repair_test_case)
    res = unittest.TextTestRunner(stream=out,verbosity=2).run(suite)

我该怎么做到这一点呢?我遇到了这个错误:

ValueError: no such test method in ****<class 'mrp_repair.unit_test.test.mrp_repair_test_case'>:**** runTest

谢谢!

1 个回答

6

乍一看,你似乎需要创建一个 mrp_repair_test_case 的实例。你现在的代码:

mrp_repair_test_case(a=10,b=20)

其实并没有做什么。

试试这个(没测试过):

def runtest():
    m = mrp_repair_test_case(a=10, b=20)
    suite = unittest.TestLoader().loadsTestsFromTestCase(m)
    res = unittest.TextTestRunner(stream=out, verbosity=2).run(suite)

这假设你已经把 'out' 设置成一个流了。

补充:

顺便问一下,你为什么不使用 setUp 方法来设置这些值呢?这样做是比较常规的好习惯。根据 loadTestsFromTestCase 的文档,它似乎只接受类本身,而不是它的实例,这意味着你可能在和 unittest 模块的设计方向相悖。

补充 2:

针对你提供的更多信息,我建议你在调用测试之前,先在模块级别单独设置 uid 和 cursor 的值。我通常不太喜欢使用全局变量,但如果我理解正确的话,这些值 A) 是只读的 B) 对于同一个客户总是相同的,这样可以避免使用它们时常见的问题。

补充 3:

回应你的补充,如果你真的想使用 __init__,你可能可以做到,但你需要自己实现一个 loadTestsFromTestCase 的替代方案,可能还需要自己做一个 TestSuite(你得检查一下它的内部工作原理)。正如我之前所说的,你会在与模块的现有设计相悖的情况下工作——如果你决定以这种方式进行测试,可能从头开始自己实现一个解决方案会比使用 unittest 更简单。补充:我刚检查过,你肯定需要自己实现一个 TestSuite 的版本,因为现有的会为每个测试创建一个 TestCaseClass 的新实例。

撰写回答