DEV Community

Cover image for How to make Coverage in Golang?
Francisco Javier Sánchez Fuentes
Francisco Javier Sánchez Fuentes

Posted on

2

How to make Coverage in Golang?

Hi Everyone!

In this post we'll to check about coverage in Golang.

Alternatively, you can download the Source code and follow the instructions in the README.md.

TL;DR

# Run the tests and save the coverage profile in "coverage.out"
go test -coverprofile=coverage.out ./...

# View the coverage profile in your browser
go tool cover -html=coverage.out
Enter fullscreen mode Exit fullscreen mode

Coverage in Golang

For this example, we have to create an user entity and store it in memory. This is the structure of the project.

.
├── README.md
├── cmd
│   └── main.go
├── go.mod
├── go.sum
└── internal
    └── user
        ├── storage.go
        ├── storage_test.go
        └── user.go
Enter fullscreen mode Exit fullscreen mode

we need to write the program

First of all, we need to declare the user entity, the filename for this is 'user.go' (in the "internal" folder in called user).

// Package user describe user entity attributes and manage user storage
package user

type User struct {
    ID        uint64
    FirstName string
    LastName  string
    Age       uint16
}
Enter fullscreen mode Exit fullscreen mode

And now, we have to create the user storage. In the same package, the storage.go was created with the following structure and methods.

package user

type UserStorage struct {
    DB []User
}

// AddUser Add user information to the UserStorage database
func (us *UserStorage) AddUser(user User) {
    us.DB = append(us.DB, user)
}

// FindUserByID find the user by ID
func (us *UserStorage) FindUserByID(id uint64) User {
    for _, user := range us.DB {
        if user.ID == id {
            return user
        }
    }
    return User{}
}

// Count total users in the database
func (us *UserStorage) Count() int {
    return len(us.DB)
}
Enter fullscreen mode Exit fullscreen mode

We need to test the program

For now, we have three methods of adding, searching, and counting your own users in storage. But we have to test that, so we add the storage_test.go file with its test. The following code has three tests that make 100% coverage for UserStorage.

package user_test

import (
    "testing"

    user "github.com/fransafu/coverage-golang-example/internal/user"
    "github.com/stretchr/testify/assert"
)

func TestUserStorage_SaveUser(t *testing.T) {
    var userStorage user.UserStorage

    user1 := user.User{}
    user1.ID = 1
    user1.FirstName = "Francisco"
    user1.LastName = "Sanchez"
    user1.Age = 99

    userStorage.AddUser(user1)

    assert.Equal(t, 1, userStorage.Count())
}

func TestUserStorage_SearchUser(t *testing.T) {
    var userStorage user.UserStorage

    user1 := user.User{}
    user1.ID = 1
    user1.FirstName = "Francisco"
    user1.LastName = "Sanchez"
    user1.Age = 99

    userStorage.AddUser(user1)

    assert.Equal(t, user1, userStorage.FindUserByID(user1.ID))
}

func TestUserStorage_EmptySearchUser(t *testing.T) {
    var userStorage user.UserStorage

    assert.Equal(t, 0, userStorage.Count())
    assert.Equal(t, user.User{}, userStorage.FindUserByID(1))
}
Enter fullscreen mode Exit fullscreen mode

If you thinking about improving the tests with "Test Suite" or "Test Group", yes, this is the way, but for now, these examples are simple and atomic for this post.

Get the coverage

To get the coverage in a Golang project you can use the "./..." wildcard and the Golang CLI will search for all tests declared in a project.

# Run the tests and save the coverage profile in "coverage.out"
go test -coverprofile=coverage.out ./...
Enter fullscreen mode Exit fullscreen mode

Ok, we have the file coverage.out that contains the coverage information but we need to view the results, the following command line shows the coverage program in the browser.

# View the coverage profile in your browser
go tool cover -html=coverage.out
Enter fullscreen mode Exit fullscreen mode

Now you can check all files that contain declared tests. If you don't declare a test file, you won't have coverage for that module.

It's all for now, thanks for reading this post.

:)!

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

AWS GenAI Live!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️