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

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

https://t.me/golang_lib

Введение

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

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

Эти системы запускают модульные тесты в облаке, позволяя экономить время и вычислительные ресурсы. В этой статье мы узнаем, как протестировать небольшой веб-сервер, написанный на 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 репозитория и видим, что тесты пройдены.

источник

Report Page