我需要在python中使用unittest
来编写一些测试。我正在测试两个类A
和B
的行为,它们在行为上有很多重叠,因为它们都是C
的子类,它们是抽象的。我真的希望能够编写3个测试类:ATestCase
,BTestCase
和AbstractTestCase
,其中AbstractTestCase
定义ATestCase
和BTestCase
的常用设置逻辑ATestCase
,但本身并没有进行任何测试。 BTestCase
和AbstractTestCase
将是A
的子类,并将定义特定于B
和unittest
的行为/输入数据。
有没有办法通过python // Don’t do it this way!
GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.addScope(Plus.SCOPE_PLUS_LOGIN) // The bad part
.build();
// Don’t do it this way!
创建一个抽象类,它可以通过继承TestCase来处理设置功能,但实际上并没有运行任何测试?
答案 0 :(得分:3)
当然,这样的构造肯定会起作用:
class BaseTestCase(unittest.TestCase):
def setUp(self):
pass # common teardown
def tearDown(self):
pass # common teardown
class ATestCase(BaseTestCase):
def test1(self):
pass
class BTestCase(BaseTestCase):
def test1(self):
pass
如果ATestCase
中需要来自BTestCase
或BaseTestCase
的知识,只需覆盖子类中的某些方法,但在超类中使用它。
class BaseTestCase(unittest.TestCase):
def setUp(self):
self.instance = self._create_instance()
def _create_instance(self):
raise NotImplementedError()
class ATestCase(BaseTestCase):
def _create_instance(self):
return A()
class BestCase(BaseTestCase):
def _create_instance(self):
return B()
请注意,如果任何test_(self)
方法将在BaseTestCase中实现,那么当自动运行程序发现它们时,它们将运行(并且由于setUp失败而失败)。
作为一种解决方法,您可以在抽象测试中的setUp子句中使用skipTest
,并在子类中覆盖它。
class BaseTestCase(unittest.TestCase):
def setUp(self):
self.instance = self._create_instance()
def _create_instance(self):
self.skipTest("Abstract")
def test_fromBase(self):
self.assertTrue(True)
请注意,跳过test_fromBase
(例如通过装饰器)不会很好,因为“应该跳过测试”逻辑将被所有子类继承。
答案 1 :(得分:0)
我尝试了Łukasz的答案并且它有效,但我不喜欢OK (SKIP=<number>)
个消息。为了我自己的愿望和目标,有一个测试套件,我不希望我或某人开始信任任何特定数量的跳过测试,或者不信任和深入研究测试套件并询问为什么有些东西被跳过,而且总是?故意?对我而言,这是一个非首发。
我碰巧只使用nosetests,按照惯例,不运行以_
开头的测试类,因此命名我的基类_TestBaseClass
就足够了。
我在Pycharm中尝试使用Unittests和py.test,并且这两个尝试运行我的基类及其测试导致错误,因为抽象基类中没有实例数据。也许对这些跑步者中的任何一个具有特定知识的人可以制作绕过基类的套件或其他东西。