2016-07-26 3 views
0

クラス(コンシューマ)を含むConsumer.pyというモジュールを作成しました。このクラスは、計算に使用するさまざまなパラメータとロギングに使用されるloq queの名前を含む設定ファイルを使用して初期化されます。Python - 異なるクラスのメソッドをユニットテストする適切な方法は何ですか?

私はこのクラスの単体テストを書くので、私はTestConsumerMethods(unittest.TestCase)というクラスを使ってtest_Consumer.pyというスクリプトを作りました。

私がやったことは、consというコンシューマークラスの新しいオブジェクトを作成し、それを使ってテスト用のクラスメソッドを呼び出すことです。たとえば、Consumerには、指定されたディレクトリにファイルが存在するかどうかを調べる簡単なメソッドがあります。私が作ったテストはこのようになります

import Consumer 
from Consumer import Consumer 

cons = Consumer('mockconfig.config', 'logque1') 

class TestConsumerMethods(unittest.TestCase): 

    def test_fileExists(self): 
     self.assertEqual(cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(cons.file_exists('./dir/', thisDoesExist.config), True) 

私のクラスをテストする正しい方法ですか?私は理想的には、クラスをインスタンス化せずにクラスメソッドを使用したいのですが、コードを「分離する」ためです。

答えて

0

私はそれはあなたが探しているものだかどうかわからないんだけど、あなたは、このようなあなたのファイルの最後にテストを追加することができます。

#!/usr/bin/python 

... 

class TestConsumerMethods(...): 
    ... 

if __name__ == "__main__": 
    # add your tests here. 

この方法では、クラスを含むファイルを実行することにより、 ifステートメントに記述したテストを実行します。

この方法では、ファイル自体を直接実行する場合にのみテストが実行されますが、クラスをインポートする場合は実行されません。

+1

この問題は、それがテストを実行できる_only_な方法です。 unittestでそれらを発見することはできません。または、CIセットアップで簡単に実行することはできません。 – SpoonMeiser

+0

@SpoonMeiser実際にはそうですが、いくつかのテストを実装する簡単な方法が必要な場合には良い方法です(例えば、 。 それでもテストを実装するのは簡単かつ迅速な方法ですが、限界があります。 私はそれが単にあなたが必要としているものに依存していると思います。 – vmonteco

2

テスト対象のグローバルオブジェクトを作成しないでください。テストによってグローバルにオブジェクトが設定され、別のグローバルオブジェクトに影響を及ぼす可能性があります。

各テストは単独で実行し、他のテストとは完全に独立している必要があります。

代わりに、いずれかのテストでオブジェクトを作成、またはセットアップ方法でそれを置くことによって、それが自動的に各テストのために作成した:

import Consumer 
from Consumer import Consumer 


class TestConsumerMethods(unittest.TestCase): 
    def setUp(self): 
     self.cons = Consumer('mockconfig.config', 'logque1') 

    def test_fileExists(self): 
     self.assertEqual(self.cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(self.cons.file_exists('./dir/', thisDoesExist.config), True) 

限り、あなたが実際にすべてのあなたのクラスをインスタンス化する必要があるかどうかなどこれは、クラスの実装に依存します。私は一般的に、クラスをインスタンス化してそのメソッドをテストすることを期待していると思います。

+0

それは感謝します、ありがとう! tearDown()でオブジェクトを削除する必要がありますか? – Zazz

+0

@Zazz通常、いいえ。 'TestConsumerMethods'はテストごとにインスタンス化され、新しい' Consumer'が構築されるたびにインスタンス化されます。古い消費者は、範囲外になるもののようにガベージコレクションされます。何らかのリソースやその他のリソースを明示的に解放する必要がある場合は、tearDownで何かする必要があります。 – SpoonMeiser

関連する問題