How to write test with golang
- TDD (Test-Driven development) разработка через тестирование
- Встроенная библиотека тестирования, управляемая формами, образцы тестов, TestMain
- Третья сторона: goconvey
- Патч обезьяны обезьяны
- макет базы данных
- travisCI
- покрытие кода
TDD
- Быстрое выполнение функций
- Редизайн и рефакторинг
тест программного обеспечения
При заданных условиях работать с программой и находить ошибки в программе
модульный тест
Составляющие единицы теста программного обеспечения, минимальная единица: Функция
Содержит три шага:
- Укажите ввод
- указать ожидания
- сравнивает результат функции с указанным ожиданием
показатель:
- Покрытие кода: количество строк кода, выполненных при выполнении тестов, в процентах от общего кода.
Использование тестовой библиотеки
// Hello ...
func Hello() string {
return "Hello World"
}
// 传统测试
func TestHello(t *testing.T) {
result := Hello()
want := "Hello World"
if result == want {
t.Logf("Hello() = %v, want %v", result, want)
} else {
t.Errorf("Hello() = %v, want %v", result, want)
}
want2 := "Hello world"
if result == want2 {
t.Logf("Hello() = %v, want %v", result, want)
} else {
t.Errorf("Hello() = %v, want %v", result, want)
}
}
// 表格驱动测试: 使用匿名结构体,逻辑更清晰
func TestHelloWithTable(t *testing.T) {
tests := []struct {
name string
want string
}{
// TODO: Add test cases.
{
name: "test for hello",
want: "Hello World",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Hello(); got != tt.want {
t.Errorf("Hello() = %v, want %v", got, tt.want)
}
})
}
}
бегать:
// mode one
go test // equal to : go test . 执行当前目录下的测试文件
// mode two
go test ./.. // 加上路径参数,可以执行指定目录下的测试文件
Образец теста:
func ExampleHello() {
fmt.Println(Hello())
// Output:
// Hello World
}
TestMain:
Выполняется перед запуском тестов пакета
func TestMain(m *testing.M) {
fmt.Println("Before ====================")
code := m.Run()
fmt.Println("End ====================")
os.Exit(code)
}
тестирование включает в себя следующие методы:
- Log | Logf
- Error | ErrorF
- Fatal | FatalF
Примечание:
- Файл должен заканчиваться на ...test.go
- Тестовые функции должны начинаться с TestX... ,
X
возможно_
или прописные буквы, а не строчные буквы или цифры - Параметры: *testing.T
- Примеры тестов должны начинаться с Example... , введите в виде комментария
- В каждом пакете есть только один TestMain с параметром *testing.M.
Покрытие:
go test -cover
go test -coverprofile=cover.out
go tool cover -html=cover.out -o coverage.html
Третья сторона: goconvey
- Поддержка утверждений
- Вложенность поддерживается
- Полностью совместим со встроенным тестированием
- Предоставить веб-интерфейс
func TestAdd_Two(t *testing.T) {
Convey("test add", t, func() {
Convey("0 + 0", func() {
So(Add(0, 0), ShouldEqual, 0)
})
Convey("-1 + 0", func() {
So(Add(-1, 0), ShouldEqual, -1)
})
})
}
func TestFloatToString_Two(t *testing.T) {
Convey("test float to string", t, func() {
Convey("1.0/3.0", func() {
result := FloatToString(1.0, 3.0)
So(result, ShouldContainSubstring, "%")
So(len(result), ShouldEqual, 6)
So(result, ShouldEqual, "33.33%")
})
})
}
goconvey // 启动 web 界面
Патч обезьяны обезьяны
- нагромождение функций
- процесс укладки
- метод укладки
// 函数
func main() {
monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {
s := make([]interface{}, len(a))
for i, v := range a {
s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1)
}
return fmt.Fprintln(os.Stdout, s...)
})
fmt.Println("what the hell?") // what the *bleep*?
}
// 方法
func main() {
var d *net.Dialer // Has to be a pointer to because `Dial` has a pointer receiver
monkey.PatchInstanceMethod(reflect.TypeOf(d), "Dial", func(_ *net.Dialer, _, _ string) (net.Conn, error) {
return nil, fmt.Errorf("no dialing allowed")
})
_, err := http.Get("http://google.com")
fmt.Println(err) // Get http://google.com: no dialing allowed
}
// 过程
guard := Patch(DestroyResource, func(_ string) {
})
defer guard.Unpatch()
Используя идеи, другие зависимые функции, которые необходимо использовать в тестируемой функции, выполнить обработку укладки.
sqlmock
Куча процесса выполнения sql.
- Создать фиктивное соединение
- Напишите собственные операторы sql
- Написать возвращаемое значение или сообщение об ошибке
- Оценка результата выполнения и предустановленного возвращаемого значения
Reference
- gotestsАвтоматически сгенерируйте тестовый код, просто заполните тестовые данные
- goconveyСторонняя библиотека тестирования, совместимая с библиотекой тестирования
- httpmockМоделирование интерфейса
- how to test with GoСправочная документация
- monkeyпатч обезьяны
- sqlmock sqlmock
- how to test with GoСправочная документация