Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python eval()的奇怪行为破坏了unittest_Python_Unit Testing - Fatal编程技术网

Python eval()的奇怪行为破坏了unittest

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

我一直在进行原型设计,并不在意分配变量的低质量代码,该变量通过在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(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
函数(如果您在命令行中传递了该函数)。