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 アプリ エンジンの webapp2 での私の作業の一部に基づいていますが、ほぼすべての Python Web アプリケーションで同様の状況が発生することを期待しています。

私の質問

他のすべてのテストが継承する便利なメソッド/変数を含むベース/ヘルパー クラスを使用するのは良い習慣ですか、それとも各テスト クラスを「自己完結型」にする必要がありますか?

ありがとう!

4

2 に答える 2

3

すばらしい質問です。テストを自動化するために行うことのほとんどは優れていると思います。そうは言っても、テストは実際にはドキュメントの唯一の信頼できるソースとして機能します. したがって、テストは非常に読みやすく理解しやすいものでなければなりません。テストは、ソフトウェアが実際に何を行い、どのように使用するかを示しているため、コメントとは異なり信頼できます。

私はこのアプローチが好きです。しかし、鼻を試してみることもできます。Nose はセットアップが少し「軽量」であり、自動化されたビルド/テスト/デプロイのためにJenkinsのようなものとの継続的な統合ルートに進む場合に十分にサポートされます。Nose は、xUnit スタイル (もちろん、IMO) ほどうまくメッセージをフォーマットしません。しかし、多くの場合、あなたは喜んでそれをあきらめるかもしれません。

ところで。Python は Java ではありません。したがって、単純な古い python 関数を再利用するために再利用することはまったく問題ありません。

于 2014-02-13T00:25:12.377 に答える