我一直在原型設計中,並且不在乎分配一個變量的低質量代碼,它從調用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一個字符串?
你正在使用'eval'來獲得一個局部變量? 'locals()[variable]'怎麼樣? – katrielalex
@katrielalex:問題不在於如何重寫此代碼以使其起作用,這是微不足道的。這更像是「爲什麼unittest無法正確處理eval()?」 – GSP