有沒有辦法在GoLang中以預先定義的順序執行測試用例?以預先定義的順序執行測試用例
P.S:我正在編寫事件生命週期的測試用例。所以我對所有的CURD操作都有不同的API。我希望按照特定的順序運行這些測試用例,因爲只有創建了一個事件才能銷燬它。
我也可以從一個測試用例中獲得一些值,並將其作爲輸入傳遞給另一個測試用例。 (例如: - 爲了測試刪除事件api,我需要一個event_id,當我打電話給create_event測試用例時)
我是GoLang的新手,有人可以引導我。
在此先感謝
有沒有辦法在GoLang中以預先定義的順序執行測試用例?以預先定義的順序執行測試用例
P.S:我正在編寫事件生命週期的測試用例。所以我對所有的CURD操作都有不同的API。我希望按照特定的順序運行這些測試用例,因爲只有創建了一個事件才能銷燬它。
我也可以從一個測試用例中獲得一些值,並將其作爲輸入傳遞給另一個測試用例。 (例如: - 爲了測試刪除事件api,我需要一個event_id,當我打電話給create_event測試用例時)
我是GoLang的新手,有人可以引導我。
在此先感謝
來做到這一點是所有的測試封裝成一個測試功能,即以正確的順序和正確的上下文調用子功能,以及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)
}
感謝您的回答,您是否也可以解釋爲什麼不推薦將狀態保持爲外部全局變量。 –
@VikasVerma你可以肯定地做到這一點,但從我的經驗來看,這只是要求麻煩。例如,如果你運行並行測試?在無狀態函數之間傳遞上下文更好。 –