2016-07-05 76 views
2

我想爲Python腳本編寫單元測試。腳本本身正確運行。Python:如何單元測試讀取命令行arg的類?

腳本由一個類組成,它從命令行讀取一個值到類變量中。

當我將類導入到測試文件中時,在類從sys.argv []讀取的位置出現'列表索引超出範圍'的錯誤。

我是新來的測試,在Python和一般。在過去的幾天裏,我已經閱讀了大量的文檔和SO頁面。

下面的代碼:

文件bongo.py -

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 

我嘗試過所有我能想到的事情;我一直在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-罐單元測試-它) – alecxe

回答

2

一般來說,單元測試有助於弄清楚你的類的邊界。如果你的班級很難進行單元測試,你應該考慮:「我怎樣才能讓測試更容易?」幾乎總是會導致更好的結構化類。

其中一種症狀是您有外部依賴性,如sys.argv,難以控制。通常你想把這樣的依賴注入到類中。這是面向對象編程的優點之一 - 您可以分離依賴關係並最小化對象本身的複雜性。

__main__塊非常適合命令行特定邏輯,如sys.argv。我建議讀取那裏的變量,並將其傳遞給構造函數Bongo。然後你可以單元測試Bongo作爲一個具有兩個變量的類,並且它對sys.argv一無所知。