8

Pythonドキュメント(http://docs.python.org/library/unittest.html)から:

import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def tearDown(self):
        self.widget.dispose()
        self.widget = None

    def test_default_size(self):
        self.assertEqual(self.widget.size(), (50,50),
                         'incorrect default size')

    def test_resize(self):
        self.widget.resize(100,150)
        self.assertEqual(self.widget.size(), (100,150),
                         'wrong size after resize')

これらのテストケースを呼び出す方法は次のとおりです。

def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_size'))
    suite.addTest(WidgetTestCase('test_resize'))
    return suite

次のように、パラメータcustom_parameterをWidgetTestCaseに挿入することは可能ですか?

class WidgetTestCase(unittest.TestCase):
    def setUp(self,custom_parameter):
        self.widget = Widget('The widget')
        self.custom_parameter=custom_parameter

4

5 に答える 5

6

私が行ったことは、追加されたばかりのtest_suiteモジュールにあります

WidgetTestCase.CustomParameter="some_address"

最も単純なソリューションが最適です:)

于 2011-08-29T21:31:08.423 に答える
3

これは、最近私の頭に浮かんだことです。はい、可能です。私はそれをシナリオテストと呼びましたが、パラメータ化された方がより正確かもしれないと思います。要点として概念実証をここに掲載します。つまり、シナリオを定義し、それに対して一連のテストを実行できるメタ クラスです。それを使用すると、例は次のようになります。

class WidgetTestCase(unittest.TestCase):
    __metaclass__ = ScenarioMeta
    class widget_width(ScenerioTest):
        scenarios = [
            dict(widget_in=Widget("One Way"), expected_tuple=(50, 50)),
            dict(widget_in=Widget("Another Way"), expected_tuple=(100, 150))
        ]
        def __test__(self, widget_in, expected_tuple):
            self.assertEqual(widget_in.size, expected_tuple)

実行すると、メタ クラスは 2 つの別個のテストを出力するため、出力は次のようになります。

$ python myscerariotest.py -v
test_widget_width_0 (__main__.widget_width) ... OK
test_widget_width_1 (__main__.widget_width) ... OK


-------------------------------------------------- --------------------
0.001 秒で 2 つのテストを実行

わかった

ご覧のとおり、シナリオは実行時にテストに変換されます。

これが良いアイデアであるかどうかはまだわかりません。わずかに異なるデータで同じアサーションを繰り返すテキスト中心のケースが多数あるテストで使用します。これにより、小さなエッジ ケースをキャッチするのに役立ちます。しかし、その要点のクラスはうまく機能し、あなたが求めていることを達成すると信じています。

テスト ケースに名前を付けたり、テキスト ファイルやデータベースなどの外部ソースから取得したりすることもできます。まだ文書化されていませんが、メタクラスを掘り下げることから始めてください。私の投稿hereには、さらにいくつかの情報と例もあります。

編集

これは私がもうサポートしていない醜いハックです。実装は、ハッキングされたメタ クラスとしてではなく、TestCase のサブクラスとして行われるべきでした。生活し、学びます。さらに良い解決策は、ノーズ ジェネレーターを使用することです。

于 2011-03-21T05:43:38.353 に答える
3

これを行う方法を見つけましたが、少し面倒です。

基本的に、私がやっていること__init__は、「デフォルト」パラメーターを定義するメソッドをTestCase に追加し、ケース__str__を区別できるようにすることです。

class WidgetTestCase(unittest.TestCase):

    def __init__(self, methodName='runTest'):
        self.parameter = default_parameter
        unittest.TestCase.__init__(self, methodName)

    def __str__(self):
        ''' Override this so that we know which instance it is '''
        return "%s(%s) (%s)" % (self._testMethodName, self.currentTest, unittest._strclass(self.__class__))

次に suite() で、テスト パラメーターを反復処理し、既定のパラメーターを各テストに固有のパラメーターに置き換えます。

def suite():
    suite = unittest.TestSuite()

    for test_parameter in test_parameters:
        loadedtests = unittest.TestLoader().loadTestsFromTestCase(WidgetTestCase)
        for t in loadedtests:
            t.parameter = test_parameter
        suite.addTests(loadedtests)

    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(OtherWidgetTestCases))
    return suite

OtherWidgetTestCasesパラメータ化する必要のないテストはどこにありますか。

たとえば、一連のテストをそれぞれに適用する必要がある実際のデータに対する一連のテストがありますが、通常はデータに存在しない特定のエッジケースをテストするように設計された合成データセットもいくつかあります。それらに特定のテストを適用して、OtherWidgetTestCases.

于 2011-03-21T17:38:08.823 に答える
0

私はそうは思いません.setUpの署名は、ユニットテストが期待しているものである必要があります.afaik、setUpはテストケースの実行メソッド内でsetUp()として自動的に呼び出されます... run をオーバーライドして、必要な変数を渡します。しかし、あなたが望むものは単体テストの目的に反すると思います。これで DRY 哲学を使用しようとしないでください。テストする各ユニットは、クラスの一部であるか、関数/メソッドの一部である必要があります。

于 2011-03-17T09:36:27.390 に答える
0

これは良い考えではないと思います。単体テストは、ケースのすべての機能をテストするのに十分なほど徹底する必要があるため、さまざまなパラメーターを渡す必要はありません。

あなたは www アドレスを渡していると言っていますが、これはほぼ間違いなく良い考えではありません。ネット接続がダウンしているマシンでテストを実行しようとするとどうなりますか? テストは次のようにする必要があります。

  • 自動 - アプリがサポートされているすべてのマシンとプラットフォームで、ユーザーの介入なしで実行されます。外部環境に頼って合格するべきではありません。これは、(とりわけ)インターネットへの接続が適切に設定されていることに依存することは悪い考えであることを意味します。ダミーデータを提供することでこれを回避できます。リソースに URL を渡す代わりに、データ ソースを抽象化し、データ ストリームなどを渡します。これは、python のダックタイピングを利用してストリームのようなオブジェクトを表示できるため、python では特に簡単です (python はまさにこの理由で「ファイルのような」オブジェクトを頻繁に使用します!)。

  • 徹底 - 単体テストは 100% のコード カバレッジを持ち、考えられるすべての状況をカバーする必要があります。複数のサイトでコードをテストしたいですか? 代わりに、サイトに含まれる可能性のあるすべての機能を使用してコードをテストしてください。あなたのアプリケーションが何をするかをもっと知らなければ、この点で多くのアドバイスを提供することはできません.

さて、あなたのテストはかなりデータ駆動型になるようです。単体テスト用のデータセットを定義してテストにロードできるツールは多数あります。たとえば、Python テスト フィクスチャを確認してください。

これがあなたが探している答えではないことは理解していますが、これらの原則に従えば、長期的にはより多くの喜びを得ることができると思います.

于 2011-03-21T19:51:20.290 に答える