2

私はmercurial統合の単体テストを行っており、現在、setUpメソッドでファイルとそのリポジトリのクローンを含むリポジトリを作成し、tearDownメソッドでそれらを削除するテストクラスを持っています。

おそらく想像できると思いますが、特にすべてのテストで個別にこれを行う必要がある場合は、パフォーマンスが非常に高速になります。
したがって、私がやりたいことは、フォルダーを作成し、クラスのロード時にmercurial用に初期化して、TestCaseクラスのすべてのユニットテストがこれらのリポジトリーを使用できるようにすることです。次に、すべてのテストが実行されたら、それらを削除したいと思います。この場合、setUpメソッドとTeaDownメソッドで処理する必要があるのは、2 つのリポジトリが各テスト間で同じ状態にあることだけです。

基本的に私が探しているのは、JUnitとアノテーションに相当するPythonです。@BeforeClass@AfterClass

4

2 に答える 2

2

ここでは、TestSuite クラスをサブクラス化することでこれを行いました。これは、標準のローダーがすべてのテスト メソッドを、それらが定義されている TestCase のインスタンスにラップし、それらを TestSuite にまとめるからです。最初の TestCase の before() および after() メソッドを TestSuite に呼び出させます。もちろん、これは TestCase オブジェクトに値を初期化できないことを意味しますが、とにかく setUp でこれを実行したいでしょう。

TestSuite は次のようになります。

class BeforeAfterSuite(unittest.TestSuite):
    def run(self, result):
        if len(self._tests) < 1:
            return unittest.TestSuite.run(self, result)

        first_test = self._tests[0]
        if "before" in dir(first_test):
            first_test.before()
        result = unittest.TestSuite.run(self, result)
        if "after" in dir(first_test):
            first_test.after()
        return result

もう少し細かい制御のために、BeforeAfterSuite が test-method-TestCase オブジェクトをラップするためにのみ使用されるようにするカスタム TestLoader も作成しました。これは次のようになります。

class BeforeAfterLoader(unittest.TestLoader):
    def loadTestsFromTestCase(self, testCaseClass):
        self.suiteClass = BeforeAfterSuite
        suite = unittest.TestLoader.loadTestsFromTestCase(self, testCaseClass)
        self.suiteClass = unittest.TestLoader.suiteClass
        return suite

おそらく、スイート内のすべてのテストケースが失敗する可能性がある before と after の周りの try/except ブロックが欠落しています。

于 2011-02-09T15:42:32.117 に答える
1

Pythonユニットテストのドキュメントから:

setUpClass() :

個々のクラスの実行でテストの前に呼び出されるクラス メソッド。setUpClass はクラスを唯一の引数として呼び出され、classmethod() として装飾する必要があります。

@classmethod
def setUpClass(cls):
...

バージョン 2.7 の新機能。

TearDownClass() :

個々のクラスのテストが実行された後に呼び出されるクラス メソッド。teaDownClass は、クラスを唯一の引数として呼び出され、classmethod() として装飾する必要があります。

@classmethod
def tearDownClass(cls):
    ...
于 2013-03-25T09:04:38.433 に答える