unittest基类是否是良好的做法? (蟒/ webapp2的)

时间:2014-02-13 00:09:44

标签: python unit-testing webapp2 webtest testbed

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

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

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

我认为我从社区收集的内容是,为每个实现编写单独的测试并使用multiple inheritance更好。但是,如果该基类实际上不包含任何测试 - 只是所有其他测试的助手。例如,我们说我已经有了一些基础测试类,我已经用它来存储一些常用的方法,如果不是我所有的其他测试都会使用这些方法。我们还假设我在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
  

注意:这是基于我在谷歌应用引擎上的webapp2中的一些工作,但我希望如此   几乎任何python Web应用程序都会产生类似的情况

我的问题

使用包含所有其他测试继承的有用方法/变量的基础/辅助类,或者每个测试类应该是自包含的#34;

是一种好习惯吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

我喜欢这种方法。但你也可以尝试nose。鼻子的设置有点“重量轻”,如果您使用Jenkins之类的连续集成路线进行自动构建/测试/部署,则可以得到很好的支持。 Nose并没有像xUnit样式那样很好地格式化它的消息(当然是IMO)。但对于很多事情,你可能愿意放弃。

顺便说一句。 Python不是Java。因此,只重用一个普通的旧python函数进行重用是完全可以接受的。

答案 1 :(得分:1)

对于某些用途,基类是一个很好的选择 - 只要你不在基类中测试任何东西。我一直使用基类。

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

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