Go Testing: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 8: Line 8:


=Overview=
=Overview=
Go comes with a lightweight test framework that includes the [[Go_test_Command#test|<code>go test</code>]] command and the <code>[[Go Package testing#Overview|testing]]</code> package. The tests live in <code>*_test.go</code> files.
Go comes with a lightweight test framework that includes the [[Go_test_Command#Overview|<code>go test</code>]] command and the <code>[[Go Package testing#Overview|testing]]</code> package. The tests live in <code>*_test.go</code> files.


=<span id='Writing_a_Unit_Test'></span>Write a Unit Test=
=<span id='Writing_a_Unit_Test'></span>Write a Unit Test=

Revision as of 23:41, 8 January 2024

External

Internal

Overview

Go comes with a lightweight test framework that includes the go test command and the testing package. The tests live in *_test.go files.

Write a Unit Test

Write a module as shown here:

Declaring a Module

For each file containing behavior to test (a.go)

package a

func Reverse(s string) string {
 rs := []rune(s)
 var result []rune
 for i := len(rs) - 1; i >= 0; i-- {
  result = append(result, rs[i])
 }
 return string(result)
}

add a <file-name>_test.go test file. In this case a_test.go. These files are ignored by the compiler and only compiled and executed when go test is run. These files will be excluded from regular package builds.

The test files should be part of the same package. If that is the case, the test has access to unexpected identifiers from the package being tested. It is also possible to declare the test files into a corresponding package with the suffix _test. In this case, the package being tested must be imported explicitly in the test. This is known as "black box" testing. Also see external test packages.

The test files should import testing.

Add individual tests, as functions starting with TestX.., where X... does not start with a lowercase letter, and taking an argument t *testing.T. The function name serves to identify the test routine. Within these functions, use Error, Fail or related methods to signal failure.

func TestX...(t *testing.T) {
  ...
  t.Error("expected this: %q, got that: %q ", ...)
}
package a

import "testing"

func TestReverseEmptyString(t *testing.T) {
 expected := ""
 result := Reverse("")
 if result != expected {
  t.Errorf("expected %q, got %q", expected, result)
 }
}

func TestReverseOneCharString(t *testing.T) {
 expected := "a"
 result := Reverse("a")
 if result != expected {
  t.Errorf("expected %q, got %q", expected, result)
 }
}

func TestReverseTwoCharString(t *testing.T) {
 expected := "ba"
 result := Reverse("ab")
 if result != expected {
  t.Errorf("expected %q, got %q", expected, result)
 }
}

From the module directory, run the tests:

go test

PASS
ok  	example.com/a	0.116s

Benchmarks

Process this: https://pkg.go.dev/testing#hdr-Benchmarks.

Fuzzing

Process this: https://pkg.go.dev/testing#hdr-Fuzzing.

Skipping

Process this: https://pkg.go.dev/testing#hdr-Skipping.

Subtests and Sub-benchmarks

Process this: https://pkg.go.dev/testing#hdr-Subtests_and_Sub_benchmarks.

Main

Process this: https://pkg.go.dev/testing#hdr-Main.

Mocks

Mock support: github.com/golang/mock/mockgen

TO DO