Как протестировать код на Go с Github Actions

Введение

Процесс тестирования очень важен при разработке программного обеспечения. Разработчики должны быть уверены в стабильности своего кода и в том, что он соответствует требованиям проекта. Существует много разных видов тестирования программного обеспечения: модульное, сквозное, интеграционное и т. д. Самый популярный и простой способ тестирования кода  —  это модульное тестирование.

Модульный тест  —  это способ протестировать модуль, т. е. минимальную часть кода, рассматриваемую как логически обособленную единицу в системе. В большинстве языков программирования таким модулем является функция, подпрограмма, метод или свойство. Тесты запускают локально  —  на ноутбуке и ПК, но быстрее и эффективнее это делать в системах непрерывной интеграции.

Эти системы запускают модульные тесты в облаке, позволяя экономить время и вычислительные ресурсы. В этой статье мы узнаем, как протестировать небольшой веб-сервер, написанный на Golang, с помощью Github Actions  —  одной из самых популярных систем непрерывной интеграции. Github Actions доступны для всех репозиториев, размещенных на Github.

Инициализация проекта

Просто создаем репозиторий на Github и клонируем его.

Инициализация модуля Go

Первым делом нужно инициализировать модуль Go. Хотите подробнее ознакомиться с модулями Go? Тогда загляните сюда.

go mod init github.com/<user>/<repo>

Создаем файл main.go

Теперь создадим файл main.go в папке cmd (в соответствии с лучшими практиками).

Создаем файл config.go

Начнем с веб-сервера. Cоздадим простую структуру папок и файл config.go для базовой конфигурации сервера.

package apiserver

type Config struct {
	BindAddr string
}

func NewConfig() *Config {
	return &Config {
		BindAddr: ":8082",
	}
}

Устанавливаем маршрутизатор gorilla/mux

Для этого будем использовать пакет маршрутизатора gorilla/mux. Это один из самых популярных http-маршрутизаторов для Golang.

go get github.com/gorilla/mux

Теперь мы готовы написать простой код для сервера API.

Пишем файл apiserver.go

package apiserver

import (
	"github.com/gorilla/mux"
	"net/http"
)

type APIServer struct{
	Config *Config
	Router *mux.Router
}

func New(config *Config) *APIServer {
	return &APIServer{
		Config: config,
		Router: mux.NewRouter(),
	}
}

func (s *APIServer) Start() error {
	s.configureRouter()
	return http.ListenAndServe(s.Config.BindAddr, s.Router)
}

func (s *APIServer) configureRouter() {
	s.Router.HandleFunc("/", s.HandleHello())
}

Пишем файл HandleHello.go

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

package apiserver

import "net/http"

func (s *APIServer) HandleHello() http.HandlerFunc {
	return func (w http.ResponseWriter, r *http.Request) {
		w.Write([]byte(("Hello world")))
	}
}

Теперь обновим файл main.go и проверим, работает ли сервер (просто запускаем файл main.goи переходим наlocalhost:8082):

Устанавливаем stretchr/testify

Код протестируем с помощью пакета stretchr/testify. Это один из самых популярных инструментов для тестирования кода на Golang.

go get github.com/stretchr/testify

Пишем файл apiserver_test.go

Это первый тестовый файл для нашего сервера API. Здесь мы создадим экземпляр сервера и отправим в него запрос. После этого сопоставим ответ с сервера со строкой c Hello world:

package apiserver

import (
	"github.com/stretchr/testify/assert"
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestAPIServer_HandleHello(t *testing.T) {
	server := New(NewConfig())
	rec := httptest.NewRecorder()
	req, _ := http.NewRequest("GET", "/", nil)
	server.HandleHello().ServeHTTP(rec, req)
	assert.Equal(t, rec.Body.String(), "Hello world")
}

Проверим результат с помощью этой команды:

go test -v ./...

Добавляем файл Github Actions

Создадим папку .github в корневом каталоге проекта, а потом файл .github/workflows/go.yml:

name: Go

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.16

    - name: Build
      run: go build -v ./...

    - name: Test
      run: go test -v ./...

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

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Gleb Kletskov: How to test your Go code with Github actions

Предыдущая статьяКак писать код на Python лучше: 6 рекомендаций
Следующая статьяАсинхронный Rust: проблемы и способы их решения