2012-11-23 21 views
-1

我一直在原型設計中,並且不在乎分配一個變量的低質量代碼,它從調用argv上的eval()開始取值,然後在外部文件中獲取它的值API密鑰。令我驚訝的是,它嚴重地使單元測試崩潰(它們甚至沒有運行)。eval()的奇怪行爲break unittest

這裏是代碼片段,我認爲是罪魁禍首:

from sys import argv 
from apikeys import * 


def setKey(the_key=DCK): 
    global CK 
    CK = the_key # Currently used key 

if len(argv) == 1: 
    print('---Executing script. Enter optional arguments if you wish to use special API keys.---') 
    setKey() 
elif len(argv) > 1: 
    setKey(eval(argv[1])) 

TOKEN = rget(DOMAIN+'signin', params={'key':CK}).json['response']['token'] 
PARAMS = {'signature':TESTSIG, 'token':TOKEN} 

# Rest of the code uses unittests which rely on PARAMS. 

所以我傳遞一個包含關鍵,因爲它的值來測試我的腳本變量之一,它產生以下回溯:

[[email protected] dv1/tests]# python 2test_api2.py ANDROID_FILMS_KEY 
Traceback (most recent call last): 
    File "2test_api2.py", line 604, in <module> 
    unittest.main() 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 97, in __init__ 
    self.parseArgs(argv) 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 152, in parseArgs 
    self.createTests() 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 161, in createTests 
    self.module) 
    File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 148, in loadTestsFromNames 
    suites = [self.loadTestsFromName(name, module) for name in names] 
    File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 142, in loadTestsFromName 
    raise TypeError("don't know how to make test from: %s" % obj) 
TypeError: don't know how to make test from: 9b269ac759211de6b3c8b238bd758ccf 

9b269ac759211de6b3c8b238bd758ccf基本上是運行的eval(ANDROID_FILMS_KEY),並在一個單獨的腳本正確運行setkey的函數的結果的API密鑰分配給CK作爲字符串「9b269ac759211de6b3c8b238bd758ccf」

踢球者如下:當CK和PARAMS被用於包含應該進行單元測試的方法的類時,Python出乎意料地提出了一個奇怪的例外,它應該告訴unittest不考慮9b269ac759211de6b3c8b238bd758ccf一個字符串?

+0

你正在使用'eval'來獲得一個局部變量? 'locals()[variable]'怎麼樣? – katrielalex

+0

@katrielalex:問題不在於如何重寫此代碼以使其起作用,這是微不足道的。這更像是「爲什麼unittest無法正確處理eval()?」 – GSP

回答

1

unittest2裝載機檢查sys.argv,讓你限制加載測試from the command line模塊。

這裏發生的是裝載程序正在尋找名爲9b269ac759211de6b3c8b238bd758ccf的測試模塊。

你將不得不從你的unittest操作sys.argv;這是一個標準的Python列表,你可以改變。另外,創建一個main(args)功能,默認情況下,你sys.argv[1:]撥打:

def main(args): 
    if not args: 
     print('---Executing script. Enter optional arguments if you wish to use special API keys.---') 
     setKey() 
    else: 
     setKey(eval(args[0])) 

if __name__ == '__main__': 
    import sys 
    main(sys.argv[1:]) 

,現在你可以測試main()使用不同的參數,而不必依賴於傳遞參數給你的測試腳本。

+0

它在哪裏尋找名爲9b269ac759211de6b3c8b238bd758ccf的測試模塊?在單元測試的網站包或執行腳本的目錄? – GSP

+0

@GSP:我想它看着python模塊路徑(其中包括本地目錄)。請注意,它在模塊中查找'load_tests'函數(如果這是您在命令行上傳遞的內容)。 –