DEV Community

Alireza Bashiri
Alireza Bashiri

Posted on

5

Go already has RSpec!

You can use (*testing.T).Run(string, func(t *testing.T)) to run each test case in isolation and also is more readable than table driven approach.

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

func TestRateRecipe(t *testing.T) {
    t.Run("ok", func(t *testing.T) {
        res := post("/recipes/1/rating", nil)
        assert.Equal(t, res.Code, http.StatusOK)
    })

    t.Run("id is invalid", func(t *testing.T) {
        res := post("/recipes/foo/rating", nil)
        assert.Equal(t, res.Code, http.StatusBadRequest)
    })
}

Top comments (4)

Collapse
 
quii profile image
Chris James

I dont think t.Run and table tests are mutually exclusive. Also table tests dont have to be hard to read :)

But table tests are sometimes reached out to when maybe they're not neccessary.

Overall though, i agree that you really dont have to use frameworks to write tests in Go, that's why it's so great!

Collapse
 
ladydascalie profile image
Benjamin Cable

Correct, they are not mutually exclusive. I often end up using both, sometimes one pattern fits better.

Table-driven tests are really good if your tests would otherwise involve a lot of boilerplate to be repeated over and over. But in some other cases, simply isolating is good enough.

Collapse
 
rhymes profile image
rhymes

I'm conflicted on the table driven approach as well. But I think that for testing "error cases" is the best. You just list them all and done. Also it saves a lot of code duplication.

I tend not to use the test tables for the "ok" response, so that I can dig into the response and check everything's how it's supposed to be.

Collapse
 
alirezabashiri profile image
Alireza Bashiri

I think there's a conflict in Go community too when it comes to writing a program, duplication becomes a second-citizen but in testing duplication not tolerated.

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post