2016-07-05 45 views
2

Pythonスクリプトの単体テストを書いてみたい。スクリプト自体が正しく実行されます。Python:コマンドライン引数を読み込むクラスをunittestする方法は?

スクリプトは1つのクラスで構成され、コマンドラインから値をクラス変数に読み込みます。

私のテストファイルにクラスをインポートすると、クラスがsys.argv []から読み込んだところで 'リストのインデックスが範囲外です'というエラーが出ます。

私はPythonと一般的にテストするのが初めてです。私はここ数日間、これについて多くのdocとSOのページを読んできました。

import sys 

class Bongo: 

    my_int = int(sys.argv[1]) 

    def __init__(self, n): 
     self.n = n 

    def get_sum(self): 
     return self.n + Bongo.my_int 

if __name__ == '__main__': 
    bongo = Bongo(5) 
    m = bongo.get_sum() 
    print('bongo.get_sum() returns {}'.format(m)) 

ファイルbongo_test.py - -

import unittest 
from bongo import Bongo 

class TestBongoMethods(unittest.TestCase): 

    def setUp(self): 
     self.bongo = Bongo(10) 
     self.bongo.my_int = 5 

    def test_get_n(self): 
     self.assertEqual(self.bongo.get_sum(), 15) 

if __name__ == '__main__': 
    unittest.main() 

python bongo_test.pyを実行しているの出力が

Traceback (most recent call last): 
    File "bongo_test.py", line 2, in <module> 
    from bongo import Bongo 
    File "/home/me/class_for_testing/bongo.py", line 4, in <module> 
    class Bongo: 
    File "/home/me/class_for_testing/bongo.py", line 6, in Bongo 
    my_int = int(sys.argv[1]) 
IndexError: list index out of range 

ファイルbongo.py:ここ

コードです

私は考えることができるすべてについて試しました。私はPyCharm Pro 2016.1でPy 2.7を使っていましたが、 ですが、結果はPy 3.4を使っても、コマンドラインから実行しても変わりません。

unittestを使用してこれを行うことはできますか?それとも別のものが必要ですか?

ご協力いただければ幸いです。

+1

私はこれがかなり関連していると思います:[私は単体テストできるようにsys.argvを設定するにはどうすればいいですか?](http://stackoverflow.com/questions/18668947/how-do-i-set-sys-argv -so-i-can-unit-test-it) – alecxe

答えて

2

一般的に、単体テストはクラスの境界を把握するのに役立ちます。あなたのクラスが単体テストが難しい場合は、「どうすれば簡単にテストできますか?」と考えるべきです。ほとんどの場合、これは構造化されたクラスの改善につながります。

これらの症状の1つは、sys.argvなどの外部の依存関係が制御できないことです。一般的に、このような依存関係をクラスに注入したいとします。これはオブジェクト指向プログラミングの利点の1つです。つまり、依存関係を分離してオブジェクト自体の複雑さを最小限に抑えることができます。

ブロック__main__は、sys.argvなどのコマンドライン固有のロジックに最適です。変数を読み込み、Bongoのコンストラクタに渡すことをお勧めします。次に、Bongoを2つの変数を取り、sys.argvを知らないクラスとしてunittestすることができます。

関連する問題