Запуск main-like в неосновном пакете - PullRequest
0 голосов
/ 13 сентября 2018

У нас есть пакет с достаточным количеством сложных тестов. Как часть набора тестов, они работают на сборках и т. Д.

 func TestFunc(t *testing.T) {
    //lots of setup stuff and defining success conditions
    result := SystemModel.Run()
 }

Теперь для одного из этих тестов я хочу представить какой-нибудь интерфейс, который позволит мне отладить несколько вещей. Это на самом деле не тест, а инструмент отладки. Для этого я хочу просто запустить тот же тест, но с шаблоном Builder:

 func TestFuncWithFrontend(t *testing.T) {
    //lots of setup stuff and defining success conditions
    result := SystemModel.Run().WithHTTPFrontend(":9999")
 }

Тогда тест начнется только в том случае, если я отправлю сигнал через HTTP из внешнего интерфейса. В основном WithHTTPFrontend() просто ожидает канал с HTTP-вызовом из внешнего интерфейса.

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

Я не могу просто переименовать пакет в main, поскольку в пакете 15 файлов, и они используются в других местах системы.

Точно так же я не нашел способа запустить тест только по требованию, исключая его из набора тестов, чтобы TestFuncWithFrontend запускался только из командной строки - мне все равно, если go run или go test или что угодно.

Я также думал о ExampleTestFunc(), но в результате теста получилось так много выводов, что он бесполезен, и без определения Output: ... Пример не запустится.

К сожалению, на уровне пакета (частного, то есть в нижнем регистре) также требуется много кода инициализации, который необходим тесту. Поэтому я не могу просто создать подпакет main, так как многие из этих вещей не будут доступны.

Кажется, у меня есть три варианта:

  1. Экспортируйте все эти переменные инициализации и код в верхнем регистре, чтобы я мог использовать его из вспомогательного пакета

  2. Дублируйте весь код.

  3. Переместите тест в подпакет main, а затем получите func main() для теста с Frontend и _test.go для обычного теста, который должен был бы импортировать несколько вещей из родительского пакет.

Я бы предпочел избежать второго варианта ... И первый лучше, но тоже не велик ИМХО. Я думаю, что я пойду на третий, но ...

я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы можете передать пользовательский аргумент командной строки в go test и запустить порт отладки на основе этого.Примерно так:

package hello_test

import (
    "flag"
    "log"
    "testing"
)

var debugTest bool

func init() {
    flag.BoolVar(&debugTest, "debug-test", false, "Setup debugging for tests")
}

func TestHelloWorld(t *testing.T) {
    if debugTest {
        log.Println("Starting debug port for test...")
        // Start the server here
    }

    log.Println("Done")
}

Тогда, если вы хотите запустить только этот конкретный тест, go test -debug-test -run '^TestHelloWorld$' ./.

В качестве альтернативы, также можно установить пользовательскую переменную среды, которую вы проверяете в тесте.функция для изменения поведения.

0 голосов
/ 13 сентября 2018

Я наконец нашел приемлемый вариант.Этот ответ

Пропустить некоторые тесты с go test

привел меня на правильный путь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...