2013-06-29 5 views
1

Я пишу веб-приложение в go, и оно работает отлично. Однако при запуске тестов для пакета команда go test просто зависает (ничего не делает, даже не заканчивается).Go зависает при запуске тестов

У меня есть функция для тестирования, который запускает сервер:

func mkroutes(t *testing.T, f func()) { 
    handlerRegistry = handlerList([]handler{}) 
    middlewareRegistry = []middleware{} 
    if testListener == nil { 
    _testListener, err := net.Listen("tcp", ":8081") 
    testListener = _testListener 
    if err != nil { 
     fmt.Printf("[Fail] could not start tcp server:\n%s\n", err) 
    } 
    } 
    f() 
    go func() { 
    if err := serve(testListener, nil); err != nil { 
     fmt.Printf("[Fail] the server failed to start:\n%s\n", err) 
     t.FailNow() 
    } 
    }() 
} 

Если изменить порт, который он прослушивает, все работает нормально (все тесты потерпеть неудачу, хотя, так как они не могут подключиться к сервер). Это показывает, что код действительно работает, но если я записываю что-то в функции или даже в функцию init, а порт правильно, он снова ломается.

После того, как я принудительно завершаю команду go test, она печатает все, что я зарегистрировал, а затем выходим. Это приводит меня к мысли, что что-то еще блокирует основной поток до того, как выполнение достигнет журнала, но это невозможно, так как изменение порта имеет значение.

В пакете нет никаких init функций, и только код, который запускается при запуске, составляет var sessionStore = sessions.NewCookieStore([]byte("test-key")), который использует пакет github.com/gorilla/sessions. Когда я запускаю программу в обычном режиме, это не вызывает проблем, и я не вижу ничего в источнике пакета, что приведет к тому, что он будет вести себя по-разному при тестировании.

Это единственный пакет за пределами стандартной библиотеки, которая импортируется.

Я могу предоставить любой другой код в пакете, но я не знаю, что актуально.

+0

Что делает функция 'f'? Как предполагается, что следующие функции будут выполняться, если 'f' не запущен как goroutine? Разве это не должно быть помещено * после * подарочной гортины? – Mostafa

+1

Все любят отлаживать неполные программы. – zzzz

+0

Вам нужно предоставить нам небольшой фрагмент кода, который мы можем скомпилировать и запустить, чтобы воспроизвести вашу проблему. – peterSO

ответ

2

Во-первых: обратите внимание, что go test создаст, скомпилирует и запускает тестовую программу, которая перехватывает выходные данные из каждого теста, чтобы вы не увидели выходные данные своих тестов, пока тест не завершится (в этот момент вывод будет напечатан).

Два вопроса с кодом:

  1. Если вы не можете запустить ТСР сервер т не сообщается, вы Printf здесь только и по-прежнему, как будто все было в порядке.

  2. Вы вызываете t.FailNow из другого гортани, чем ваш тест проходит. Вы не должны этого делать. См. http://golang.org/pkg/testing/#T.FailNow

Фиксация этих предметов может по крайней мере показать, что еще не так. Также: посмотрите, как пакет net/http выполняет его тестирование.

Смежные вопросы