单元测试基础班是否良好的做法? (蟒/ webapp2的)

我对单元测试相当陌生,并且试图感受这个东西的最佳实践。 我在这里看到了几个有关单元测试的问题,这些单元测试继承了一个本身包含多个测试的基类,例如:

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引擎上的webapp2中的一些工作,但我期望几乎所有python web应用程序都会出现类似的情况

我的问题

使用包含所有其他测试继承的有用方法/变量的基类/助手类是否是好习惯,还是每个测试类都应该是“自包含的”?

谢谢!


精湛的问题。 我认为几乎所有你自动测试的东西都非常出色。 也就是说,测试真的是唯一可靠的文档来源。 所以测试应该很容易阅读和理解。 与评论不同的是,这些测试是可靠的,因为它们显示了软件真正的功能以及如何使用它。

我喜欢这种方法。 但你也可以尝试鼻子。 鼻子的设置有点“轻量级”,如果你像詹金斯那样持续整合路线进行自动化构建/测试/部署,鼻子的支持就会得到很好的支持。 鼻子不会像xUnit风格那样格式化它的消息(当然,IMO)。 但对于很多事情,你可能愿意放弃。

BTW。 Python不是Java。 因此,只重用一个普通的旧python函数来重用是完全可以接受的。


基类对于某些用途来说是个不错的选择 - 只要你不在基类中测试任何东西。 我总是使用基类。

另外,请考虑在测试类中看到代码的价值。 一个很好的例子是我一直使用的基类(在C#.NET中):我使用Esri的SDK - ArcObjects - 需要许可证。 在正常的执行过程中,这是在其他地方处理的,但在测试中,我必须先检出(或激活)许可证,然后才能使用库中的对象。 这与我在测试类中测试的代码的功能完全无关,但是需要使测试运行。 因此,我决定将这个功能集中在一个基类中,在测试之前检查一下许可证,然后再检查它。 需要许可证的测试只是从这个基类继承而来。

最后,要非常小心地设置和拆除测试的先决条件。 如果在基类中完成某些操作并且在子类中完成其他操作,则可能会变得杂乱无章。

链接地址: http://www.djcxy.com/p/77297.html

上一篇: Are unittest base classes good practice? (python/webapp2)

下一篇: Draggable code not working with hammer.js