2015-08-21 14 views
0

我們有大量的測試用例類來執行一些檢查。我需要生成所有那些相同的測試,但改變一個變量的值。 例如:Python元編程。在可變值發生變化時生成大量類似的測試

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變量設置一個不同的值。這是我不明白如何實現的。

+0

你試過遍歷'globals()'嗎?它不起作用嗎?你知道如何實例化一個類嗎? – scytale

+0

我不明白我如何實例化所需的類來解決問題。 – FranGoitia

+0

你不明白如何實例化一個類?或者在這種情況下如何去做。迭代'globals()'怎麼樣? – scytale

回答

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) 

確定這可能不是正是你想要的 - 你要動態分配類名等...但也許這就解決了您最初動態生成帶有修改後的類變量的類的問題

還有其他方法 - 類裝飾器,metaclasses - 它真的取決於你想要做什麼的其他細節

+0

我無法修改這些類。我需要創建測試相同的新東西,但base_url具有不同的值。 – FranGoitia

+0

您可以修改該類的實例。嘗試一下。 – scytale

+0

你剛纔說你需要實例化一個新的測試類......現在你說你需要創建新的類 - 它不是很清楚你想要做什麼。你意識到你可以修改類屬性('base_url'),並且你可以創建具有修改類屬性的實例?或者你可以使用一個元類...很難知道該說些什麼,讓你把事情做得更清楚 – scytale

相關問題