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



Книга Как протестировать код на 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/[email protected]

- name: Set up Go
uses: actions/[email protected]
with:
go-version: 1.16

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

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

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


1536   0  

Comments

    Ничего не найдено.