如何对多个相似类进行单元测试

2024-05-19 21:38:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,有多个非常相似的类:

class BlackBox1():
    def calc(self, a, b):
        return a + b

class BlackBox2():
    def calc(self, a, b):
        return a * b
...

现在我想为所有这些类编写单元测试。当然,我可以为每个黑盒编写单独的测试。不管怎样,由于每个blackbox都有完全相同的方法要测试calc(a, b),我想知道是否有类似于“最佳实践”的东西,自动地将类和预期结果提供给抽象测试框架,比如

^{pr2}$

有没有一种方法可以将{"blackbox": Blackbox1, "a": 3, "b": 5, "result": 8}{"blackbox": Blackbox2, "a": 4, "b": 7, "result": 28}传递给TestAbstractBox类,这样就不会有多次相同的代码,而是有一种简单的方法来测试新的黑匣子?在


Tags: 方法self程序框架returndef黑盒calc
3条回答

我认为这不是一个好办法。在

一个测试方法应该只做一个测试,而不是循环几个assert*调用。否则,在失败的情况下,您将无法轻松判断哪个测试失败。毕竟,这就是单元测试的全部意义所在。在

另外,您不应该冒着破坏现有测试的风险,为新类添加新的变体,或者将现有测试重构为一些常用方法。在

对于具有相同方法的多个类(考虑在多个派生类中实现一个公共接口),将接口的公共属性的所有测试放在一个基类中,然后为每个被测类派生单独的测试类可能会很有用。这些派生类将实现合适的setUp和{}方法。它们还可以添加更多特定于被测类的测试用例。在

您只需将这些类添加到setUp

class TestAbstractBox(unittest.TestCase):
  def setUp(self):
    self.boxes = [Blackbox1(), Blackbox2()]
    self.param_a = a
    self.param_b = b
    self.expected_result = result

  def test_calc_method(self):
    for box in self.boxes:
      real_result = self.box.calc(self.param_a, self.param_b)
      self.assertEqual(real_result, self.expected_result, 
          "{0} gives wrong result".format(self.box.__class__))

编辑版本2:

^{pr2}$

我想我找到了一个解决方案,基本上如下所示:

import unittest

class BlackBox1():
    def calc(self, a, b):
        return a + b

class BlackBox2():
    def calc(self, a, b):
        return a * b

class TestBlackBox1(unittest.TestCase):
    test_params = {"blackbox": BlackBox1, "a": 3, "b": 5, "result": 8}
    def setUp(self):
        self.box = self.test_params["blackbox"]()
        self.param_a = self.test_params["a"]
        self.param_b = self.test_params["b"]
        self.expected_result = self.test_params["result"]

    def test_calc_method(self):
        real_result = self.box.calc(self.param_a, self.param_b)
        self.assertEqual(real_result, self.expected_result,
                        "{0} gives wrong result: {1} instead of {2}".format
                        (self.box.__class__, real_result, self.expected_result))

class TestBlackBox2(TestBlackBox1):
    test_params = {"blackbox": BlackBox2, "a": 4, "b": 7, "result": 28}

TBB1 = unittest.defaultTestLoader.loadTestsFromTestCase(TestBlackBox1)
TBB2 = unittest.defaultTestLoader.loadTestsFromTestCase(TestBlackBox2)

不管怎样,谢谢你的回答,也很抱歉一开始没有找到这样的答案。在

相关问题 更多 >