我有三个档案;一个包含测试,一个包含数据,另一个包含运行测试的指令。
base.py
#!/usr/bin/env python
class Base(object):
def __init__(self):
pass
def is_true(self):
return True
datadrv.py
def pytest_generate_tests(metafunc):
"""
Parse the data provided in scenarios.
"""
idlist = []
argvalues = []
for scenario in metafunc.cls.scenarios:
idlist.append(scenario[0])
items = scenario[1].items()
argnames = [x[0] for x in items]
argvalues.append(([x[1] for x in items]))
metafunc.parametrize(argnames, argvalues, ids=idlist)
###
# EDIT BELOW
# ADD NEW SCENARIOS
###
scenario1 = ('ACME_Manage_Keys', { 'org': 'ACME_Corporation',
'perm_name': 'ManageAcmeCorp',
'resource': 'activation_keys',
'verbs': ('manage_all',),
'allowed': {"test1": is_true}})
test_execute.py
#!/usr/bin/env python
from lib.base import Base
import pytest
from unittestzero import Assert
from data.datadrv import *
class TestDictionarySupport(object):
scenarios = [scenario1]
def test_datadriven_support(self,
org,
perm_name,
resource,
verbs,
allowed):
base = Base()
functionToCall = allowed['test1']
Assert.true(base.functionToCall())
""" THIS WORKS, uncomment the block to see """
"""
Assert.true(base.is_true())
"""
我的最终目标是拥有Assert.true(base.is_true())
但是我所做的每一次尝试都会导致TypeErrors或NameErrors。我在这里错过了什么或做错了什么?
要重现上述内容,只需创建3个目录; lib,数据和测试。将test_execute.py放在tests中,将datadrv.py放在data中,将base.py放在lib中。你需要运行pytest和unittestzero。从根目录,您可以运行py.test。
注意:当我有这么多工作时,我会有一个for循环和多个测试,所以functionToCall = allowed['test1']
会变成functionToCall = key[value]
另外,我的起始参考点是http://code.activestate.com/recipes/65126-dictionary-of-methodsfunctions/。
谢谢你,错误如下:
注意错误因尝试的方法而异。
'allowed': {'test1': Base.is_true}})
:
的 _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ 错误收集测试/ test_execute.py _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___
tests / test_execute.py:6:in
来自data.datadrv import * data / datadrv.py:22:in 'allowed':{'test1':Base.is_true}}) E NameError:未定义名称“Base” ================================================== == 1秒内错误=========================================== ==========
'allowed': {'test1': base.is_true}})
:
tests / test_execute.py:6:in
来自data.datadrv import * data / datadrv.py:22:in 'allowed':{'test1':base.is_true}}) E NameError:未定义名称“base”
使用Assert.true(base.functionToCall())
:
tests / test_execute.py:6:in
来自data.datadrv import * data / datadrv.py:22:in 'allowed':{'test1':is_true}}) E NameError:未定义名称'is_true'
答案 0 :(得分:0)
Base.is_true
和is_true
之间存在差异,第一个是对象Base
的方法,第二个是代码中未定义的函数。你可以有一个方法词典,并按如下方式调用它们:
d = {'test1': Base.is_true}
f = d['test1']
f(base)
这样您就可以调用方法并将base
作为参数self
。
答案 1 :(得分:0)
您需要在datadrv.py中添加'import Base'行。
这将解决'Base is not defined'错误,因此您可以使用{'test1':Base.is_true}