2016-09-19 7 views
1

作業中にSVNブランチを作成するエンティティがあるとします。私は結果のブランチを削除するか、テストが失敗した場合は何もしないようにしたい各テストの後tearDownメソッドにパラメータを渡す

class Tester(unittest.TestCase): 

def test_valid1_url(self): 
    url="valid1" 
    BranchCreator().create_branch(url) 
    self.assertUrlExists(url) # assume I have this method implemented 

def test_valid2_url(self): 
    url="valid2" 
    BranchCreator().create_branch(url) 
    self.assertUrlExists(url) # assume I have this method implemented 

def test_invalid_url(self): 
    url="invalid" 
    self.assertRaises(ValueError, BranchCreator().create_branch, url) 

:機能テストを実行するには、私は複数のほぼ同じメソッドを(私はフレームワークunittestモジュールのpythonを使用しますが、質問は任意のテストフレームワークに関連する)を作成します。理想的には次のようなものを使用します:

@teardown_params(url='valid1') 
def test_valid1_url(self): 

def tearDown(self, url): 
    if (url_exists(url)): remove_branch(url) 

しかし、tearDownはパラメータを受け入れません。 私はいくつかの非常に汚いソリューションを参照してください。

a)は、テスターに​​フィールド「used_url」を作成するすべての方法でそれを設定し、ティアダウンに使用します。それが原因で(少なくとも私の環境で動作するはず

def test_valid1_url(self): 
    self.used_url="valid1" 
    BranchCreator().create_branch(self.used_url) 
    self.assertUrlExists(url) 
... 
def tearDown(self): 
    if (url_exists(self.used_url)): remove_branch(self.used_url) 

を)すべてのテストが順番に実行されるので、競合は発生しません。しかし、このソリューションは、変数の共有によるテストの独立性の原則に違反しています。同時にテストを開始すると、うまく動作しません。

b)はcleanup(self, url)のような別の方法を使用して、すべての方法

からそれを呼び出す他の方法はありますか?

+0

「tearDown」がテストフレームワークに追加されてはならないと考えている人もいます。あなたの '' b''ソリューションを正しいものにする。私は重複を排除するために、適切な例外処理を使ってパラメータ化されたテストを作成します。 – zhon

答えて

0

すべてのテストでヘルパーメソッドを呼び出す必要があり、それが一種の重複のように私に聞こえる場合でも、b)ソリューションは機能すると思います。 もう1つのアプローチは、 "assertUrlExists"関数の中でヘルパーメソッドを呼び出すことです。このようにして複製が削除され、クリーンアップを管理するためにURLの存在をもう一度確認することを避けることができます。アサーション結果があり、それを使用することができます。

関連する問題