2016-10-02 4 views
2

私はいくつかのプロシージャである@staticmethodのクラスを持っているので、何も返さない/戻り値の型はNoneです。Python:プロシージャのための肯定的なテストを作成するには?

実行中に失敗すると、Exceptionがスローされます。

私はこのクラスをunittestにしたいと思いますが、私は肯定的なテストを設計することに苦労しています。負のテストのために

この作業は簡単です:

assertRaises(ValueError, my_static_method(*args)) 
assertRaises(MyCustomException, my_static_method(*args)) 

...しかし、どのように私はポジティブテストを作成するのですか?実行後に常にTrueを返すように手順を再設計する必要があります。assertTrueを使用することができますか?

+2

だけで任意の表明せずに関数を呼び出します。例外が発生した場合、テストは失敗します。 – zvone

+1

したがって、プロシージャが例外を発生しない場合は成功しましたか?次に、try/catchラッパーを使用せずに_without_プロシージャーを呼び出します。 –

+0

はい。プロシージャが例外を発生しない*場合、それは成功しました。例外が発生した場合、そのプロシージャを使用する他のクラスによってキャッチされます。したがって、何か悪いことが起こった場合、unittestメソッドで例外がスローされます。 – daniel451

答えて

1

推測するのは難しいです実際のコードを見ることなく、しかし、私はいくつかの仮定を行いますが:

  1. 静的メソッド内のロジックは決定論的です。
  2. 入力値に対して何らかの計算を行った結果、結果は であり、この結果で何らかの操作が行われます。コードのいずれかをテストするために
  3. python3.4は、(モックは進化と最後のいくつかのバージョンの上に移動した)

少なくとも最後に、それは期待される結果を生成することを確認しなければなりません。戻り値がない場合、結果は通常格納されるか、どこかに送信されます。この場合、結果を格納または送信するメソッドが期待される引数で呼び出されることを確認できます。

これは、unittestパッケージの一部となっているmockパッケージで利用可能なツールを使用して実行できます。

my_package/my_module.pyで次の静的メソッド:ユニットテストで

import uuid 

class MyClass: 

    @staticmethod 
    def my_procedure(value): 
     if isinstance(value, str): 
      prefix = 'string' 
     else: 
      prefix = 'other' 

     with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f: 
      f.write(value) 

私は次のことをチェックします:

  1. openと呼ばれてきました。
  2. 予想されるファイル名が計算されています。
  3. openwriteモードで呼び出されました。
  4. ファイルハンドルのwrite()メソッドが、予想される引数で呼び出されました。

unittestの:

import unittest 
from unittest.mock import patch 

from my_package.my_module import MyClass 


class MyClassTest(unittest.TestCase): 
    @patch('my_package.my_module.open', create=True) 
    def test_my_procedure(self, open_mock): 
     write_mock = open_mock.return_value.write 
     MyClass.my_procedure('test') 
     self.assertTrue(open_mock.call_count, 1) 
     file_name, mode = open_mock.call_args[0] 
     self.assertTrue(file_name.startswith('/tmp/string_')) 
     self.assertEqual(mode, 'w') 
     self.assertTrue(write_mock.called_once_with('test')) 
1

あなたのメソッドが何かをするなら、そこにロジックがあるはずです。我々が持っている負のテストのために

cool = None 

def my_static_method(something): 
    try: 
     cool = int(something) 
    except ValueError: 
     # logs here 

::さんはこのダミーの例を考えてみましょう

assertRaises(ValueError, my_static_method(*args))  

とpossitiveテストのために、私たちは涼しい確認することができます。

assertIsNotNone(cool) 

my_static_methodを呼び出すのであれば、あなたがチェックしていますcoolに影響します。

関連する問題