【问题标题】:Are unittest base classes good practice? (python/webapp2)单元测试基类是好的做法吗? (python/webapp2)
【发布时间】:2014-03-11 15:38:51
【问题描述】:

我对单元测试比较陌生,并且正在尝试找出该事物的最佳实践。我在这里看到了几个关于单元测试继承本身包含多个测试的基类的问题,例如:

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 应用程序都会出现类似的情况

我的问题

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

谢谢!

【问题讨论】:

    标签: python unit-testing webapp2 webtest testbed


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      对于某些用途来说,基类是一个不错的选择——只要您不对基类中的任何内容进行测试。我一直使用基类。

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

      最后,要非常小心设置和取消测试的先决条件。如果一些在基类中完成,而另一些在子类中完成,它可能会变得混乱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2011-07-27
        • 2012-09-27
        • 2010-10-20
        相关资源
        最近更新 更多