2017-07-05 28 views
0

Pythonでunittestに関する質問があります。たとえば、特定のapiエンドポイントを処理するドッキング・コンテナを設定したとしましょう(例:my_site/users/etc/etc/etcというユーザー)。このコンテナのために分割されて処理されるかなり異なるレイヤーがあります。実際の呼び出しと応答、ロジックレイヤー、データレイヤーを処理するクラス。私は特定の呼び出しの周りのテストを書いてみたい(ちょうどステータスコードをチェックする)。setUpメソッドを継承するPython Unittest

与えられたエンドポイントのハンドラとして機能するクラスはたくさんあります。 1つにつき異なる設定が必要なことがいくつかありますが、それぞれがアプリケーションから継承し、そこからいくつかのメソッドを使用します。私はunittestのためにsetUp classをやりたいので、毎回これを再確立する必要はありません。どんな助言も役に立ちます。今のところ私は主に、テストでは継承が悪い考えであることを主に見てきましたが、私はsetUpのためにこれを使いたいだけです。ここに例があります:

class SetUpClass(unittest.TestCase): 
    def setUp(self): 
     self._some_data = data_set.FirstOne() 
     self._another_data_set = data_set.SecondOne() 
    def get_app(self): 
     config = Config() 
     return Application(config, 
      first_one=self._some_data, 
      second_one=self._another_data_set) 


class TestFirstHandler(SetUpClass, unittest.TestCase): 
    def setUp(self): 
     new_var = something 
    def tearDown(self): 
     pass 
    def test_this_handler(self): 
     # This specific handler needs the application to function 
     # but I don't want to define it in this test class 
     res = self.fetch('some_url/users') 
     self.assertEqual(res.code, 200) 


class TestSecondHandler(SetUpClass, unittest.TestCase): 
    def setUp(self): 
     different_var_thats_specific_to_this_handler = something_else 
    def tearDown(self): 
     pass 
    def test_this_handler(self): 
     # This specific handler needs the application to function 
     # but I don't want to define it in this test class 
     res = self.fetch('some_url/users/account/?something_custom={}'.format('WOW')) 
     self.assertEqual(res.code, 200) 

もう一度ありがとう!!

+0

だからあなたの質問がされ、「私はテストケースから継承することは悪いことを聞いた、それは本当にある」:

ここではPython 3用のシンプルなバージョンですか? – syntonym

+0

これは質問の一部です。もう1つは、それが悪くない場合、実際にセットアップクラスからどのように継承されるかです。私はそれが完了したことを見ていない。 –

+0

これは悪いことに本当にコメントできませんが、すでにベースクラスから継承しています。しかし、毎回 'setUp'メソッドを上書きします。 'setUp'関数を拡張したいのであれば、スーパー関数、すなわち' def setUp(self):SetUpClass.setUp(self) 'を呼び出し、その後にあなたのコードを呼び出すべきです。 – syntonym

答えて

0

コメントに記載されているとおり、super()の使い方を学ぶ必要があります。また、基底クラスのリストにTestCaseを繰り返す必要はありません。

class TestFirstHandler(SetUpClass): 
    def setUp(self): 
     super().setUp() 
     new_var = something 
    def tearDown(self): # Easier to not declare this if it's empty. 
     super().tearDown() 
    def test_this_handler(self): 
     # This specific handler needs the application to function 
     # but I don't want to define it in this test class 
     res = self.fetch('some_url/users') 
     self.assertEqual(res.code, 200)