Найти тему
Nuances of programming

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

Оглавление

Источник: Nuances of Programming

Введение

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

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

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

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

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

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

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

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

-2

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

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

-3

Создаем файл 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())
}

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

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):

-4

Устанавливаем 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