Как реализовать модульные тесты для команд консоли в go - PullRequest
1 голос
/ 13 января 2020

Я запускаю новый инструмент OSS CLI, который использует spf13 / cobra. Будучи новичком в golang, мне трудно найти лучший способ тестирования команд в изоляции. Кто-нибудь может дать мне пример того, как проверить команду? Несколько предостережений:

  1. вы не можете вернуть кобру. Команда из вашей функции инициализации
  2. вы не можете иметь get_test.go в каталоге cmd ... которым я был под впечатлением была golang лучшая практика.
  3. Я новичок в golang, go легко для меня: sweat_smile:

Пожалуйста, поправьте меня, если я ' m неправильно.

Вот cmd, которое я пытаюсь проверить: https://github.com/sahellebusch/raider/blob/3-add-get-alerts/cmd/get.go.

Открыт для идей, предложений, критики, чего угодно.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Существует несколько подходов к реализации CLI с использованием go. Это базовая c структура CLI, которую я разработал, на которую в основном влияет docker CLI, и я также добавил модульные тесты.

Первое, что вам нужно, это иметь CLI в качестве интерфейса , Это будет внутри пакета с именем "cli".

package cli

type Cli interface {
     // Have interface functions here
     sayHello() error
}

Это будет реализовано двумя clis: HelloCli (наш настоящий CLI) и MockCli (используется для модульных тестов)

package cli

type HelloCli struct {
}

func NewHelloCli() *HelloCli {
    cli := &HelloCli{
    }
    return cli
}

Здесь HelloCli будет реализовывать функцию sayHello следующим образом.

package cli

func (cli *HelloCli) SayHello() error {
    // Implement here
}

Аналогично, в пакете с именем test будет фиктивный cli, который будет реализовывать интерфейс cli, а также будет реализована функция sayHello.

package test

type MockCli struct {
    }

    func NewMockCli() *HelloCli {
        cli := &MockCli{
        }
        return cli
    }

func (cli *MockCli) SayHello() error {
        // Mock implementation here
    }

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

package main

func newCliCommand(cli cli.Cli) *cobra.Command {
    cmd := &cobra.Command{
        Use:   "foo <command>"
    }

    cmd.AddCommand(
        newHelloCommand(cli),
    )
    return cmd
}

func main() {
    helloCli := cli.NewHelloCli()
    cmd := newCliCommand(helloCli)
    if err := cmd.Execute(); err != nil {
        // Do something here if execution fails
    }
}

func newHelloCommand(cli cli.Cli) *cobra.Command {
    cmd := &cobra.Command{
        Use:   "hello",
        Short: "Prints hello",
        Run: func(cmd *cobra.Command, args []string) {
            if err := pkg.RunHello(cli, args[0]); err != nil {
                // Do something if command fails
            }
        },
        Example: "  foo hello",
    }
    return cmd
}

Здесь у меня есть одна команда с именем hello. Далее у меня будет реализация в отдельном пакете под названием «pkg».

package pkg

func RunHello(cli cli.Cli) error {
    // Do something in this function
    cli.SayHello()
    return nil
}

В этом пакете также будут содержаться модульные тесты в файле с именем hello_test.

package pkg

func TestRunHello(t *testing.T) {
    mockCli := test.NewMockCli()

    tests := []struct {
        name     string
    }{
        {
            name:     "my test 1",
        },
        {
            name:     "my test 2"
        },
    }
    for _, tst := range tests {
        t.Run(tst.name, func(t *testing.T) {
            err := SayHello(mockCli)
            if err != nil {
                t.Errorf("error in SayHello, %v", err)
            }
        })
    }
}

Когда вы выполните foo hello, HelloCli будет пройдено в функцию sayHello () и при запуске модульных тестов будет передано MockCli.

0 голосов
/ 13 января 2020

Вы можете проверить, как это делает сама cobra - https://github.com/spf13/cobra/blob/master/command_test.go

По сути, вы можете реорганизовать фактические команды Command c (функция запуска) в отдельную функцию и проверить эту функцию. Вы, вероятно, хотите правильно назвать свои функции, а не просто вызывать их run.

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