PyUnit中的测试套件被弃用了吗?

2 投票
2 回答
1181 浏览
提问于 2025-04-16 00:26

根据PyUnit的例子,我写了以下的单元测试代码,运行得很好。

import unittest

class Board:
  def __init__(self, x, y):
    self.x = x; self.y = y;
  def __eq__(self, other):
      return self.x == other.x and self.y == other.y

class BoardTest(unittest.TestCase):
    def setUp(self):
        self.b10_10 = Board(10,10)
        self.b10_10p = Board(10,10)
        self.b10_20 = Board(10,20)
    def tearDown(self):
        pass
    def test1(self):
        self.assert_(self.b10_10 == self.b10_10p)
    def test2(self):
        self.assert_(not (self.b10_10 == self.b10_20))

class BoardTest2(unittest.TestCase):
    def setUp(self):
        self.b10_10 = Board(10,10)
        self.b10_10p = Board(10,10)
        self.b10_20 = Board(10,20)
    def tearDown(self):
        pass
    def test1(self):
        self.assert_(self.b10_10 == self.b10_10p)
    def test2(self):
        self.assert_(not (self.b10_10 == self.b10_20))

def suite():
    suite1 = unittest.makeSuite(BoardTest)
    suite2 = unittest.makeSuite(BoardTest2)
    return unittest.TestSuite((suite1, suite2))

if __name__ == "__main__":
  unittest.main()

但是问题是,即使我把

def suite():
去掉,结果还是一样。换句话说,看起来在PyUnit中,fixture/suite并不是没用的。

这样理解对吗?

2 个回答

3

除了Mark的回答,还有一个理由是,如果你是动态生成测试用例的话,自己写一个suite()会很有用。

另外,我花了一段时间才弄明白怎么让PyDev识别这个suite并在图形化测试运行器中运行。诀窍是要写一个像下面这样的函数:

def load_tests(loader, tests, pattern):
    return suite()

这样的方法就能被图形化测试运行器识别了。

4

如果你只是想在一个模块里运行所有的测试,其实不需要用到unittest.TestSuite,因为unittest.main()会自动检查它被调用的模块,找到所有从unittest.TestCase派生的类。

不过,TestSuite类在一些情况下还是挺有用的:

  1. 你想把测试分成几个逻辑组,比如单元测试组、集成测试组,或者某个特定子系统的测试组等等。
  2. 你的测试分布在多个模块或包里。在这种情况下,有一个可以运行所有测试的单一脚本会很方便。你可以通过构建一个包含所有测试的套件来实现这一点。不过,如果使用像discovery这样的库,这个就不太重要了。

撰写回答