Go Testing with Testify

This documentation explains how to write tests using Testify in Go.

Installation

To install Testify, use the following command:

go get github.com/stretchr/testify

Structure

The directory structure for organizing your tests:

project-root/
├── internal/
│   ├── area/
│   │   ├── service.go
│   │   └── model.go
├── test/
│   ├── area/
│   │   ├── service_test.go
│   │   ├── mock_service.go
│   │   └── testdata/
│   │       └── example.json
│   ├── action_consumer/
│   │   ├── consumer_test.go
│   │   ├── mock_rabbitmq.go
│   │   └── testdata/
│   │       └── example.json
├── cmd/
│   └── main.go
├── go.mod
├── go.sum

Example: Writing a Unit Test

Here is an example of a unit test using Testify:

package area_test

import (
    "testing"
    "AREA/internal/area"
    "github.com/stretchr/testify/assert"
)

func TestAdd(t *testing.T) {
    result := area.Add(2, 3)
    assert.Equal(t, 5, result, "they should be equal")
}

Mocking with Testify

To mock dependencies like RabbitMQ, use Testify’s mock package:

package consumer

import "github.com/stretchr/testify/mock"

// MockRabbitMQ mocks RabbitMQ interactions
type MockRabbitMQ struct {
    mock.Mock
}

func (m *MockRabbitMQ) Publish(message string) error {
    args := m.Called(message)
    return args.Error(0)
}

Running Tests with Coverage

To measure test coverage, run:

go test ./... -cover

To generate a detailed coverage report:

go test ./... -coverprofile=coverage.out
go tool cover -func=coverage.out

To generate an HTML report:

go tool cover -html=coverage.out -o coverage.html

Automating Testing with Makefile

You can use makefile command to run already implementing test commands:

  • To run all tests and logs them without coverage:

make test_server
  • To run all tests and get result preview in a html file:

make coverage_server

Best Practices

  • Organize your tests in a /test directory mirroring your code structure.

  • Use testify/mock to mock dependencies.

  • Keep your tests focused on specific functionalities.

  • Use testdata directories for static test resources.