单元测试基类是一个好的实践吗?(Python / webapp2)

7

我对单元测试比较新,正在尝试了解最佳实践。我在这里看到过一些关于单元测试继承基类的问题,该基类本身包含多个测试,例如:

class TestBase(unittest.TestCase):
    # some standard tests

class AnotherTest(TestBase):
    # run some more tests in addition to the standard tests

我认为从社区中得到的建议是,最好为每个实现编写单独的测试并使用多重继承。但是,如果基类实际上不包含任何测试-只是所有其他测试的辅助工具呢?例如,假设我有一个基本测试类,我用它来存储大多数甚至所有其他测试将使用的一些常见方法。让我们还假设我在models.py中有一个名为ContentModel的数据库模型。

test_base.py

import webtest
from google.appengine.ext import testbed
from models import ContentModel

class TestBase(unittest.TestCase):

    def setUp(self):
        self.ContentModel = ContentModel
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        # other useful stuff

    def tearDown(self):
        self.testbed.deactivate()

    def createUser(self, admin=False):
        # create a user that may or may not be an admin

    # possibly other useful things

看起来这将在所有其他测试中节省我大量时间:

another_test.py

from test_base import TestBase

class AnotherTest(TestBase):
    def test_something_authorized(self):
        self.createUser(admin=True)
        # run a test

    def test_something_unauthorized(self):
        self.createUser(admin=False)
        # run a test

    def test_some_interaction_with_the_content_model(self):
        new_instance = self.ContentModel('foo' = 'bar').put()
        # run a test

注意:这是基于我在Google App Engine上的Webapp2工作的一些内容,但我预计几乎任何Python Web应用程序都会出现类似的情况。

我的问题

使用包含有用方法/变量的基础/助手类,让所有其他测试继承它,这样做是否是一个好的实践,还是每个测试类应该是“自包含”的?

谢谢!

2个回答

3
出色的问题。我认为几乎任何自动化测试都是优秀的。话虽如此,测试确实作为唯一可靠的文档来源。因此,测试应该非常易于阅读和理解。与注释不同,测试是可靠的,因为它们显示软件实际执行的操作以及如何使用它。
我喜欢这种方法。但你也可以尝试 nose。 Nose比较“轻量级”设置,并且在使用类似Jenkins进行自动构建/测试/部署的持续集成路线时得到了很好的支持。Nose的消息格式不如xUnit风格那样漂亮(当然是我的个人意见)。但对于许多事情,您可能愿意放弃这一点。
顺便说一句,Python不是Java。因此,重用普通的Python函数是完全可以接受的。

1
一个基类在某些情况下是一个很好的选择 - 只要你不在基类中测试任何内容。我经常使用基类。
此外,考虑到在测试类中看到代码的价值。一个很好的例子是我一直使用的基类(在c#.NET中):我使用Esri的ArcObjects SDK,需要许可证。在正常执行过程中,这在其他地方处理,但在测试中,我必须在使用库中的对象之前检查(或激活)许可证。这与我在测试类中测试的代码功能绝对没有任何关系,但必须使测试运行。因此,我决定将这个功能隐藏在一个基类中,在测试之前和之后检查许可证。需要许可证的测试只需从这个基类继承。
最后,请非常小心地设置和拆除测试的前提条件。如果一些是在基类中完成的,而其他一些是在子类中完成的,会变得混乱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接