2015-05-11 38 views
0

有沒有辦法在GoLang中以預先定義的順序執行測試用例?以預先定義的順序執行測試用例

P.S:我正在編寫事件生命週期的測試用例。所以我對所有的CURD操作都有不同的API。我希望按照特定的順序運行這些測試用例,因爲只有創建了一個事件才能銷燬它。

我也可以從一個測試用例中獲得一些值,並將其作爲輸入傳遞給另一個測試用例。 (例如: - 爲了測試刪除事件api,我需要一個event_id,當我打電話給create_event測試用例時)

我是GoLang的新手,有人可以引導我。

在此先感謝

回答

3

來做到這一點是所有的測試封裝成一個測試功能,即以正確的順序和正確的上下文調用子功能,以及testing.T指針傳遞給每個的唯一方法所以他們可能會失敗。不利的一面是,他們都將作爲一項測試出現。但實際上情況就是這樣 - 就測試框架而言,測試是無狀態的,每個函數都是一個單獨的測試用例。

請注意,雖然測試可能按照它們寫入的順序運行,但我沒有發現任何文檔說明這實際上是某種合同。所以,即使你可以按順序編寫它們,並將狀態保持爲外部全局變量 - 這不推薦。

唯一的靈活性框架讓你走,因爲1.4是TestMain方法,可以讓你的步驟後,之前運行/或安裝/拆卸:

func TestMain(m *testing.M) { 

    if err := setUp(); err != nil { 
     panic(err) 
    } 
    rc := m.Run() 
    tearDown() 
    os.Exit(rc) 
} 

但是,這不會給你想要的東西。安全地做到這一點的唯一方法是做類似的事情:

// this is the whole stateful sequence of tests - to the testing framework it's just one case 
func TestWrapper(t *testing.T) { 

    // let's say you pass context as some containing struct 
    ctx := new(context) 
    test1(t, ctx) 
    test2(t, ctx) 
    ... 
} 

// this holds context between methods 
type context struct { 
    eventId string 
} 

func test1(t *testing.T, c *context) { 
    // do your thing, and you can manipulate the context 
    c.eventId = "something" 
} 

func test2(t *testing.T, c *context) { 
    // do your thing, and you can manipulate the context 
    doSomethingWith(c.eventId) 
} 
+0

感謝您的回答,您是否也可以解釋爲什麼不推薦將狀態保持爲外部全局變量。 –

+0

@VikasVerma你可以肯定地做到這一點,但從我的經驗來看,這只是要求麻煩。例如,如果你運行並行測試?在無狀態函數之間傳遞上下文更好。 –

相關問題