2017-02-21 50 views
1

我對測試一無所知,所以需要你的幫助。用例外參數列表測試python函數

得到了一個不時被改變的python函數。 另外還有一個參數列表,該函數不應該有例外。 所以這個問題 - 如何做出正確的簡單測試。

我需要這樣的東西

for arg in args: 
    cmd = 'python script.py %s' % arg 
    p = subprocess.Popen(cmd, shell = True, 
     stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
    output, err = p.communicate() 
    if err: 
     print arg 
     print err 

是否確定這樣的自寫腳本來做到這一點,還是有這方面的任何特殊模塊?

或者處理它的最好方法是什麼?

回答

1

理想的情況下,該模塊script.py包含一個函數main()當你調用script.py作爲腳本被調用,與通常的成語

import sys 

def main(arg1, arg2, arg3): 
    print(arg1, arg2, arg3) 
    return 42 

if __name__ == "__main__": 
    main(*sys.argv[1:]) 

在這種情況下,你可以簡單地導入功能main並做測試沒有所有的子麻煩:

from script import main as testsubject 

assert testsubject(1, 2, 3) == 42 

如果script.py不是在Python搜索路徑,您可能需要手動添加:

import sys 
sys.path.append("/path/to/folder/containing/script.py") 

from script import main 

有一個名爲unittest作爲標準庫的一部分,專門用於檢測這樣的功能,具有可讀的文檔包,所以我強烈建議你給一個嘗試。

隨着uittest,測試可能是這樣的:

import unittest 

import script 

class Test_Script(unittest.TestCase): 

    def test_return_value(self): 
     answer = script.main(1, 2, 3) 
     self.assertEqual(answer, 42) 

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

編輯補充:

如果你的函數沒有返回值,所有你想知道的是你的函數是否拋出例外,你的測試功能,可以簡單地寫成像

def test_runs_without_exception(self): 
     script.main(1, 2, 3) 

如果script.main()引發異常,則unittest將捕獲該異常並打印相應的失敗消息。

如果你想要做的就是簡單地測試了一個腳本,使用unittest可能是矯枉過正,你可以逃脫也許是一個簡單的

import time 

import script 

try: 
    sript.main(1, 2, 3) 
except Exception as e: 
    print("An Exception occured!") 
    with open("script_log.txt", "a") as logfile: 
     logfile.write(str(time.time()) + "\t" + str(e)) 
    raise e 
else: 
    print("Everything is fine.") 

如果你有超過script.py控制,你可能希望直接在script.py中包含一些日誌功能。在這種情況下,您可能需要查看包logging

+0

問題是我的函數什麼都沒有返回。它只是打印大量的信息。所以我不需要檢查平等;我想確保沒有例外 –

+0

擴大了答案,以包含沒有返回值的函數的情況。 – Jan