【问题标题】:Python Metaprogramming. Generating massive amount of similar tests where a variable value is changedPython 元编程。在变量值发生变化的情况下生成大量类似的测试
【发布时间】:2015-11-15 11:06:44
【问题描述】:

我们有大量的测试用例类来执行一些检查。我需要生成所有相同的测试,但要更改变量的值。 例如:

class DynamicPivotSeriesTestCase(AuthenticatedApiTestCase):
    '''
    Test all series against a fixed category trying every format
    '''
    #binding
    ftn = utils.format_test_name

    # Test Params
    base_url, formats = API_FORMATS['pivot']
    base_test_name = 'test_pivot_series_{series}'

    # Test vars
    series = VARS

    for srs in series:
        params = {'series': srs, 'cats': 'campaign', 'from': '2013-07-31', 'to': '2013-07-31'}
        test_name = ftn(base_test_name, params)
        locals()[test_name] = utils.make_check_code(200, base_url, params, formats)

class DynamicPivotDerivedSeriesTestCase(AuthenticatedApiTestCase):
    #binding
    ftn = utils.format_test_name

    # Test Params
    base_url, formats = API_FORMATS['pivot']
    base_test_name = 'test_pivot_derived_series_{series}'

    # Test vars
    series = DERIVED_VARS

    for srs in series:
        params = {'series': srs, 'cats': 'campaign', 'from': '2013-07-31', 'to': '2013-07-31'}
        test_name = ftn(base_test_name, params)
        locals()[test_name] = utils.make_check_code(200, base_url, params, formats)

大约有 150 个这样的测试,我无法复制粘贴代码。我需要遍历全局变量,访问每个(class_name,类对象),检查该类是否是测试类,如果是,我需要实例化一个与当前访问的类测试具有相同主体的新测试类,但我需要为 base_url 变量设置一个不同的值。这是我不明白如何实现的。

【问题讨论】:

  • 你试过迭代globals()吗?它不起作用吗?你知道如何实例化一个类吗?
  • 我不明白如何实例化所需的类来解决问题。
  • 你不懂如何实例化一个类?或在这种情况下如何处理。遍历globals() 怎么样?
  • 我无法复制粘贴代码。我遍历全局变量,访问每个(class_name,类对象),检查该类是否是测试类,如果是,我需要实例化一个与当前访问的类测试具有相同主体的新测试类,但我需要为 base_url 变量设置不同的值。这是我不明白如何实现的。
  • 如果您在问题中省略了类似的基本信息,您将不会得到明确的答案

标签: python class metaprogramming scopes


【解决方案1】:

对象属性的简单更新:

if __name__ == '__main__':
    for name, thing in globals().iteritems():
        if issubclass(thing, AuthenticatedApiTestCase):
            obj = thing()
            obj.base_url = something_new

如果你不能实例化,那么你可以做

new_classes = []
if issubclass(thing, AuthenticatedApiTestCase):
    class NewClasS(thing):
        base_url = something_new

    new_classes.append(NewClass)

好吧,这可能不是您想要的 - 您需要动态分配类名等...但这也许可以解决您最初使用修改后的类变量动态生成新类的问题

还有其他方法 - 类装饰器、元类 - 这实际上取决于有关您尝试做什么的其他细节

【讨论】:

  • 我无法修改这些类。我需要创建新的测试相同的东西,但 base_url 有不同的值。
  • 可以修改类的实例。试试看。
  • 你最初说你需要实例化一个新的测试类......现在你说你需要创建新的类 - 你想要做什么并不是很清楚。您意识到您可以修改类属性 (base_url) 并且可以创建具有修改后的类属性的实例?或者你可以使用元类......如果不让事情更清楚,很难知道该说什么
  • 你是对的。对不起,英语不是我的自然语言,有时很难正确表达自己,而且我对这种元编程很陌生。我需要创建 base_url 具有不同值的新类。除此之外环境应该是一样的。
  • 而且只实例化一个新对象并更改base_url 还不够?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多