0

我有三个文件;一个包含测试,一个包含数据,一个包含运行测试的指令。

基础.py

#!/usr/bin/env python

class Base(object):

    def __init__(self):
        pass

    def is_true(self):
        return True

数据驱动程序.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 个目录;库、数据和测试。将 test_execute.py 放在测试中,将 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 _ __ _ __ _ __ _ _ _ __ _ __ _ __ _ ___ 测试/test_execute.py:6:在

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': Base.is_true}}) E NameError: name 'Base' is not defined ========== =========================================== 0.02 秒内出现 1 个错误 === ====================================================

使用'allowed': {'test1': base.is_true}}):测试/test_execute.py:6:在

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': base.is_true}}) E NameError: name 'base' is not defined

Assert.true(base.functionToCall())

测试/test_execute.py:6: 在

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': is_true}}) E NameError: name 'is_true' is not defined

4

2 回答 2

0

Base.is_true和之间有区别is_true,第一个是对象的方法Base,第二个是代码中未定义的函数。您可以拥有一个方法字典并像这样调用它们:

d = {'test1': Base.is_true}
f = d['test1']
f(base)

这样您就可以调用该方法并base作为参数给出self

于 2012-05-09T15:17:03.487 回答
0

您需要在 datadrv.py 中添加一个“import Base”行。

这将解决“未定义基础”错误,因此您可以使用 {'test1': Base.is_true}

于 2012-05-09T16:25:16.083 回答