Testing Clients to an HTTP API in Go

An example on how to test a client which calls out to an external API, without requiring the API server to be up and running. From Testing Techniques video by Andrew Gerrand at Google I/O 2014.

Go has a standard library net/http/httptest which you can use to create a test HTTP server, similar to Go’s normal HTTP server. The test server will create a server that listens locally on a random port.

A test consists of

  • Create test server
  • Setup server to return what you want
  • Pass server URL to your test

Here’s a simple example from my fetcher library which tests retrieving a URL with a GET parameter.

I setup my test server to just echo back whatever parameter gets passed in, so then I just need to confirm what I pass in, is what I get back.

Create test fetcher_test.go and run from my package dir using go test

// This tests GET request with passing in a parameter.
func TestGetParams(t *testing.T) {

    // echoHandler, passes back form parameter p
    echoHandler := func( w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, r.FormValue("p"))
    }

    // create test server with handler
    ts := httptest.NewServer(http.HandlerFunc(echoHandler))
    defer ts.Close()

    // call library I want to test, using test server ts
    f := fetcher.NewFetcher()
    f.Params.Add("p", "hello")
    result, err := f.Fetch(ts.URL,"GET")
    if err != nil {
        t.Errorf("Error: %v", err)
    }

    // confirm result
    if result != "hello" {
        t.Errorf("Unexpected result: %v", result)
    }
}

That’s all there is to it, check out the video for a ton more useful information around testing in Go. Plus read the testing and httptest package documentation.

Hi, I’m Marcus Kazmierczak

Profile Photo I'm an engineer trying to do my small part to make the web a little better. I believe open source can help empower people, and grow our collective knowledge; moving the world forward. I hope this site is a small contribution to that collective.