13

何百ものテストケースでソケットを使用するモジュールに取り組んでいます。いいですね。今を除いて、socket.setdefaulttimeout( 60 ) の有無にかかわらずすべてのケースをテストする必要があります... すべてのテストをカットアンドペーストして、セットアップ/ティアダウンでデフォルトのタイムアウトを設定/削除するように言わないでください。

正直なところ、各テスト ケースを個別にレイアウトすることは良い習慣だと思いますが、同じことを繰り返すのも好きではありません。これは実際には、異なるテストではなく、異なるコンテキストでのテストです。

unittest がモジュール レベルのセットアップ/ティアダウン フィクスチャをサポートしていることがわかりますが、1 つのテスト モジュールを 2 つの異なるセットアップで 2 回テストするように変換する方法がわかりません。

どんな助けでも大歓迎です。

4

5 に答える 5

9

次のようなことができます。

class TestCommon(unittest.TestCase):
    def method_one(self):
        # code for your first test
        pass

    def method_two(self):
        # code for your second test
        pass

class TestWithSetupA(TestCommon):
    def SetUp(self):
        # setup for context A
        do_setup_a_stuff()

    def test_method_one(self):
        self.method_one()

    def test_method_two(self):
        self.method_two()

class TestWithSetupB(TestCommon):
    def SetUp(self):
        # setup for context B
        do_setup_b_stuff()

    def test_method_one(self):
        self.method_one()

    def test_method_two(self):
        self.method_two()
于 2018-03-26T20:40:42.637 に答える
5

The other answers on this question are valid in as much as they make it possible to actually perform the tests under multiple environments, but in playing around with the options I think I like a more self contained approach. I'm using suites and results to organize and display results of tests. In order to run one tests with two environments rather than two tests I took this approach - create a TestSuite subclass.

class FixtureSuite(unittest.TestSuite):
    def run(self, result, debug=False):
        socket.setdefaulttimeout(30)
        super().run(result, debug)
        socket.setdefaulttimeout(None)
...
suite1 = unittest.TestSuite(testCases)
suite2 = FixtureSuite(testCases)
fullSuite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(fullSuite)
于 2012-07-24T13:58:50.483 に答える
4

私は次のようにします:

  1. すべてのテストを独自の TestCase クラスから派生させます。それを SynapticTestCase と呼びましょう。

  2. SynapticTestCase.setUp() で、環境変数を調べて、ソケット タイムアウトを設定するかどうかを決定します。

  3. テスト スイート全体を 2 回実行します。1 回は環境変数を一方に設定して、もう 1 回は別の方法で設定します。

  4. 両方の方法でテスト スイートを呼び出す小さなシェル スクリプトを記述します。

于 2012-07-22T23:42:53.083 に答える
1

コードが呼び出されない場合はsocket.setdefaulttimeout、次の方法でテストを実行できます。

import socket
socket.setdeaulttimeout(60)
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None
unittest.main()
socket.setdefaulttimeout = old_setdefaulttimeout

これはハックですが、機能します

于 2012-07-23T00:00:01.723 に答える