读martini测试文件martin_test.go的疑问!

在读martin测试文件martin_test.go的时候,大部分的测试目的能看明白,下边这个测试不知道是什么目的,大家不吝赐教。

func Test_Martini_Basic_NoRace(t *testing.T) {
    m := New()
    handlers := []Handler{func() {}, func() {}}
    // Ensure append will not realloc to trigger the race condition
    m.handlers = handlers[:1]
    req, _ := http.NewRequest("GET", "/", nil)
    for i := 0; i < 2; i++ {
        go func() {
            response := httptest.NewRecorder()
            m.ServeHTTP(response, req)
        }()
    }
}

共 2 个回复


Unknown

因为martini的handler是用一个slice存的,并使用append来做增加操作,而slice在多gouroutine下是线程安全的,所以会导致数据竞争。它要测试的就是handler们在启动注册路由的时候就全部搞定,这样在进行HTTP 访问(多gouroutine)的时候就不会再发生append操作。

PS:append操作在容量不够的时候会重新分配内存地址

# 0

gman

@Unknown 我明白了,他这是要确保在进行m.ServeHTTP的时候不会有对m.handler进行append操作的情况出现,也就是确保handler接下来不会变动了。

# 1