いくつかのテストのためのUnittest setUp / tearDown


118

テストのシナリオの開始/終了時に実行される関数はありますか?関数setUpおよびtearDownは、すべてのテストの前後に実行されます。

私は通常これが欲しいです:

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

現時点では、これらのsetUpとtearDownは単体テストであり、すべてのシナリオ(多くのテストを含む)で広がります。1つは最初のテストで、もう1つは最後のテストです。


6
どのバージョン?unittestモジュールが拡張され、Python 2.7にmodule_setupおよびmodule_teardownが含まれるようになりました。
S.Lott、2011

3
2.7では、setUpClass()およびtearDownClass()クラスメソッドも導入されました。これにより、独自のスイートごとのセットアップとティアダウンを使用して、複数のクラスを同じファイルに含めることができます。
Fagrellによる11

回答:


132

(あたり2.7のとおり文書)あなたが得るsetUpClasstearDownClass、それぞれ、実行される前に、与えられたクラスのテストの後に実行され。または、1つのファイルにそれらのグループがある場合は、setUpModuleand tearDownModuledocumentation)を使用できます。

それ以外の場合、おそらく最善の策は、独自の派生TestSuiteを作成してオーバーライドすることrun()です。他のすべての呼び出しは親によって処理され、runは親のrunメソッドまでの呼び出しに関連するセットアップコードと破棄コードを呼び出します。


71

私は同じシナリオを持っています、私にとっては、setUpClassメソッドとtearDownClassメソッドは完全に機能します

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()

6
これは、正しい例を示し、これらの関数が機能するためにクラスメソッドである必要があるため、承認された回答になるように更新する必要がありますが、承認された回答には記載されていません。
NuclearPeon

1

Python 2.5の場合、およびpydevで作業する場合、少し難しいです。pydevはテストスイートを使用していないようですが、個々のテストケースをすべて見つけ、それらを個別に実行します。

これに対する私の解決策は、次のようなクラス変数を使用することでした:

class TestCase(unittest.TestCase):
    runCount = 0

    def setUpClass(self):
        pass # overridden in actual testcases

    def run(self, result=None):
        if type(self).runCount == 0:
            self.setUpClass()

        super(TestCase, self).run(result)
        type(self).runCount += 1

このトリックを使用すると、TestCase(元のからではなくunittest.TestCase)これから継承するとrunCount、0 も継承します。次に、runメソッドrunCountで、子テストケースのがチェックされ、増分されます。これにより、runCountこのクラスの変数は0のままになります。

つまり、setUpClassはクラスごとに1回だけ実行され、インスタンスごとに1回は実行されません。

私は持っていないtearDownClass、まだ方法を、私は何かがそのカウンターを使用して作ることができると思います。


0

次に例を示します。3つのテストメソッドが共有リソースにアクセスします。これは、テストごとではなく、1回だけ作成されます。

import unittest
import random

class TestSimulateLogistics(unittest.TestCase):

    shared_resource = None

    @classmethod
    def setUpClass(cls):
        cls.shared_resource = random.randint(1, 100)

    @classmethod
    def tearDownClass(cls):
        cls.shared_resource = None

    def test_1(self):
        print('test 1:', self.shared_resource)

    def test_2(self):
        print('test 2:', self.shared_resource)

    def test_3(self):
        print('test 3:', self.shared_resource)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.