2016-03-05 66 views
3

我正在爲我的python腳本編寫一些unit tests。該腳本允許用戶覆蓋參數的值。使用unittest和argparse解析測試參數

python paramParser.py -d C:\\Path\\to\\yourfile\\xxx.m -p 'xxxParamName' -v 20 

-d文件名可能包含一個參數名稱和值
-p參數名稱
-v參數值

腳本讀取該文件,如果該參數在它存在的 - 它需要它的價值和用它的新值將它寫入另一個文件。

command-line成功運行該參數將覆蓋該參數的值。

這裏是我的代碼:

import unittest 
import paramParser 

class Tests(unittest.TestCase): 

    def testOneIntValue(self): 
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3"]) 
    self.assertTrue('xxxParamName.Value= 3', result) 

    def testMultipleIntValues(self): 
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3"]) 
    self.assertTrue('[ xxxParamName.Value = [ 1 2 3 ]', result) 

    def testTrueBoolean(self): 
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v true"]) 
    self.assertTrue('xxxParamName.Value = true', result) 

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

的測試總是通過,任何知道我做錯了嗎?

編輯 我試圖做同樣的方式與這個傢伙所做的:argparse fails when called from unittest test

def testOneValue(self): 
    parsed = paramParser.main(["-d","C:\\Path\\to\\yourfile\\xxx.m", "-p", "xxxParamName", "-v", "3"]) 
    self.assertEqual(parsed["d"], "C:\\Path\\to\\yourfile\\xxx.m") 
    self.assertEqual(parsed["p"], "xxxParamName") 
    self.assertEqual(parsed["v"], "3") 

雖然他的傳球(用的[]的幫助和分離該參數)礦井沒有。我得到這個錯誤:

TypeError: 'NoneType' object has no attribute '__getitem__' 

只是關於上一個問題的快速更新。我忘了在我的def main()中添加一個返回值。測試現在正在工作。

+3

你要求測試來評估一個非空字符串是否真實,它**總是**。您是否閱讀過'unittest'的實際文檔? – jonrsharpe

+2

「assertTrue」的第一個參數是一個可以轉換爲「bool」的對象,而不是布爾語句作爲字符串(這是您提供的)。看起來像'assertEqual'可能更適用於前兩個。 – cdarke

+0

查看'argparse'單元測試文件以獲取更多想法,'Lib/test/test_argparse.py' - 儘管這涵蓋的不僅僅是代碼的需要。 – hpaulj

回答

2

assertTrue聲明中,您傳遞的非空string總是評估爲True

如果paramParser.main返回它的參數,你應該做這樣的事情:

def testOneIntValue(self): 
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3 "]) 
    self.assertEqual(result.xxxParamName, 3) # access xxxParamName here the way you pass it 

此外,您可能要閱讀有關​​模塊,並檢查了這個問題 - How do you write tests for argparse?

+0

我嘗試了另外一種方式: 'def testOneValue(self): parsed = paramParser.main([「 - d」,「C:\\ Path \\ to \\ yourfile \\ xxx.m」 ,「-p」,「xxxParamName」,「-v」,「3」]) self.assertEqual(parsed [「d」],「C:\\ Path \\ to \\ yourfile \\ xxx.m」 ) self.assertEqual(parsed [「p」],「xxxParamName」) self.assertEqual(parsed [「v」],「3」)' 但相反,我得到TypeError:NoneType對象沒有屬性'__getitem __'' 這適用於另一個人(可以在我上面的Edit中看到) – user825023

相關問題