【问题标题】:how to set attribute to a python file?如何将属性设置为python文件?
【发布时间】:2012-10-21 10:05:30
【问题描述】:

我知道如何为类设置属性,但找不到如何为文件设置..

flow = ['1','4','5','2']

def test_generator(test):
    def test_parser(self):
        print test
    return test_parser

class API_tests(unittest.TestCase):
        pass


for test in flow:
    test_name = 'test_%s' % test
    test = test_generator(test)
    setattr(API_tests, test_name, test)

这个,会起作用的。

我想将 setattr() 上的 API_tests 替换为作为对象而不是类的文件,以便该文件将附加我动态设置的函数 (test_generator X 4)

我在命令行上运行“nosetests -v”时的预期结果是它会显示“4 个测试通过”

这个问题可以在其他作品中:如何将当前文件作为对象获取

谢谢

【问题讨论】:

  • 当前文件名在__file__。然而,那是一个字符串。
  • 您是否打算创建可以运行nosetest 的X(本例中为4 个)测试?如果是这样,请查看测试生成器的鼻子测试支持。简而言之,编写一个产生可调用对象和可调用对象所需参数的生成器。鼻子会为你运行它们。
  • 在这里您可以找到如何在当前模块中设置属性(我认为这是您实际要求的):How do I call setattr() on the current module?

标签: python nosetests setattr


【解决方案1】:

不要在模块命名空间中动态创建测试函数(我认为这是您的意图),而是使用测试生成器的 nosetest 支持。

如果nose 检测到一个生成器并且该生成器生成一个可调用对象和可调用对象所需的任何参数,它会对其进行迭代并为您运行每个测试。

你的例子可以改写为

def check_flow_value(val):
    # assert something about val
    assert True

def test_flows():
    flow = ['1','4','5','2']
    for val in flow:
        yield check_flow_value, val

鉴于此,nose 将运行 4 次测试

【讨论】:

  • 响应如下: API_tests.test_generator.test_flows('1',) ... ok API_tests.test_generator.test_flows('4',) ... ok API_tests.test_generator.test_flows(' 5',) ... ok API_tests.test_generator.test_flows('2',) ... 好的,我对这种方式的问题是 1,2,4,5 实际上将被参数的休 dict 替换。我只想提供输出我将生成的测试名称,它只会显示名称,而不是参数..可能吗?
  • 如果它是您担心的输出,您可以动态包装您的测试函数,因此 unittest 或 nosetest 看到的 test 将是一个非常简单的函数,没有参数。例如。部分:new_test_method = partial(create_generic_test, arg_name=arg)
猜你喜欢
  • 2013-01-07
  • 2018-09-02
  • 2018-08-30
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多