Введение
Процесс тестирования очень важен при разработке программного обеспечения. Разработчики должны быть уверены в стабильности своего кода и в том, что он соответствует требованиям проекта. Существует много разных видов тестирования программного обеспечения: модульное, сквозное, интеграционное и т. д. Самый популярный и простой способ тестирования кода — это модульное тестирование.
Модульный тест — это способ протестировать модуль, т. е. минимальную часть кода, рассматриваемую как логически обособленную единицу в системе. В большинстве языков программирования таким модулем является функция, подпрограмма, метод или свойство. Тесты запускают локально — на ноутбуке и ПК, но быстрее и эффективнее это делать в системах непрерывной интеграции.
Эти системы запускают модульные тесты в облаке, позволяя экономить время и вычислительные ресурсы. В этой статье мы узнаем, как протестировать небольшой веб-сервер, написанный на 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 репозитория и видим, что тесты пройдены.
Читайте также:
- 8 хитрых приемов написания кода на Go
- Нормальное завершение работы в Go
- Как на самом деле работает Git
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Gleb Kletskov: How to test your Go code with Github actions