Python eval()的奇怪行为破坏了unittest
我一直在进行原型设计,并不在意分配变量的低质量代码,该变量通过在argv上调用eval()获取其值,然后在包含API键的外部文件中获取其值。令我惊讶的是,它严重地破坏了单元测试(它们甚至都没有运行) 以下是我认为是罪魁祸首的代码片段:Python eval()的奇怪行为破坏了unittest,python,unit-testing,Python,Unit Testing,我一直在进行原型设计,并不在意分配变量的低质量代码,该变量通过在argv上调用eval()获取其值,然后在包含API键的外部文件中获取其值。令我惊讶的是,它严重地破坏了单元测试(它们甚至都没有运行) 以下是我认为是罪魁祸首的代码片段: from sys import argv from apikeys import * def setKey(the_key=DCK): global CK CK = the_key # Currently used key if len(ar
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.
因此,我将包含key的一个变量作为其值传递给测试脚本,它将生成以下回溯:
[gp@imdev1 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
[gp@imdev1dv1/tests]#python 2test_api2.py安卓_电影_KEY
回溯(最近一次呼叫最后一次):
文件“2test_api2.py”,第604行,在
unittest.main()
文件“/usr/lib/python2.6/site packages/unittest2/main.py”,第97行,在__
self.parseArgs(argv)
parseArgs中的文件“/usr/lib/python2.6/site packages/unittest2/main.py”,第152行
self.createTests()
createTests中的文件“/usr/lib/python2.6/site packages/unittest2/main.py”,第161行
自我保护模块)
loadTestsFromNames中的文件“/usr/lib/python2.6/site packages/unittest2/loader.py”,第148行
suites=[self.loadTestsFromName(name,module)表示名称中的名称]
loadTestsFromName中的文件“/usr/lib/python2.6/site packages/unittest2/loader.py”,第142行
raise TypeError(“不知道如何从:%s”%obj)进行测试)
类型错误:不知道如何从9b269ac759211de6b3c8b238bd758ccf进行测试
9b269ac759211de6b3c8b238bd758ccf基本上是运行eval(ANDROID__-KEY)并在单独的脚本中运行setKey函数的结果,它将API密钥正确地分配给CK,作为字符串“9b269ac759211de6b3c8b238bd758ccf”
当CK和PARM在包含应该被单元测试的方法的类中使用时,Python意外地引发了一个奇怪的异常,它假定UnTestEnter不考虑9B269AC75 9121DE6B3C8B23 8BD75 8ccf一个字符串。<>代码> UNITSITTE2加载程序还检查<代码> sys .ARGV < /代码>,允许您限制为测试加载的模块 这里发生的情况是加载程序正在查找名为
9b269ac759211de6b3c8b238bd758ccf
的测试模块
您必须从unittest中操作sys.argv
;这是一个标准的python列表,您可以修改它。或者,创建一个main(args)
函数,默认情况下,您可以使用sys.argv[1://code>调用该函数:
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()
,而不必依赖于向测试脚本传递参数。您正在使用eval
获取局部变量吗?关于locals()[variable]
?@katrielex:问题不在于如何重写此代码以使其正常工作,这很简单。这更像是“为什么unittest不能正确处理eval()”,它在哪里查找名为9b269ac759211de6b3c8b238bd758ccf的测试模块?在unittest的站点包或执行脚本所在的目录中?@GSP:我猜它查看python模块路径(包括本地目录)。请注意,它在模块中查找load\u tests
函数(如果您在命令行中传递了该函数)。