cpp

Тестирование

Очень хорошим способом избежать ошибок является покрытие кода тестами. Обычно тесты размещают в отдельных файлах с названиями вида <Название пакета>_test.go. Внутри файла код тестов добавляют внутри функций следующего формата:

func Test<Название теста>(t *testing.T) {
   // Код функции
}

Внутри функции тестирования выполняется проверка каких-либо значений. Например, значений, возвращаемых функцией. Если значение соответствует ожидаемому значению, то ничего делать не нужно. Нормальный выход из функции тестирования означает, что тест пройден успешно. Если значение не соответствует ожидаемому значению, то через переменную t следует вызвать один из методов:

  • Log() — записывает сообщение в журнал ошибок. Сообщение отобразится в том случае, если тест не пройден или запуск тестов выполняется с флагом -test.v (go test -test.v). Формат метода:
(*testing.common).Log(args ...interface{})

Пример:

t.Log("Сообщение об ошибке")
  • Logf() — формирует сообщение в соответствии со строкой формата format и записывает его в журнал ошибок. Сообщение отобразится в том случае, если тест не пройден или запуск тестов выполняется с флагом -test.v (go test -test.v). Формат метода:
(*testing.common).Logf(format string, args ...interface{})

Пример:

t.Logf("%s", "Сообщение об ошибке")
  • Fail() — помечает тест как не пройденный, при этом не прерывая выполнение функции. Формат метода:
(*testing.common).Fail()

Пример:

t.Log("Сообщение об ошибке")
t.Fail()
  • Error() — комбинация Log() плюс Fail(). Формат метода:
(*testing.common).Error(args ...interface{})

Пример:

t.Error("Сообщение об ошибке")
  • Errorf() — комбинация Logf() плюс Fail(). Формат метода:
(*testing.common).Errorf(format string, args ...interface{})

Пример:

t.Errorf("%s", "Сообщение об ошибке")
  • FailNow() — помечает тест как не пройденный и прерывает выполнение функции. Формат метода:
(*testing.common).FailNow()

Пример:

t.Log("Сообщение об ошибке")
t.FailNow()
  • Fatal() — комбинация Log() плюс FailNow(). Формат метода:
(*testing.common).Fatal(args ...interface{})

Пример:

t.Fatal("Сообщение об ошибке")
  • Fatalf() — комбинация Logf() плюс FailNow(). Формат метода:
(*testing.common).Fatalf(format string, args ...interface{})

Пример:

t.Fatalf("%s", "Сообщение об ошибке")

В качестве примера добавим в файл C:\book\packages\main.go код из листинга 13.5.

Листинг 13.5. Содержимое файла C:\book\packages\main.go

package main

import "fmt"

func main() {
   fmt.Println(Sum(10, 20))
}
func Sum(x, y int) int {
   return x + y
}

Теперь протестируем функцию Sum(). Для этого создаем файл C:\book\packages\main_test.go и добавляем в него код из листинга 13.6.

Листинг 13.6. Содержимое файла C:\book\packages\main_test.go

package main

import "testing"

func TestSum(t *testing.T) {
   res := Sum(10, 20)
   if res != 30 {
      t.Errorf("Sum(10, 20) == %d", res)
   }
}

Запуск тестирования выполняется с помощью команды go test:

C:\book\packages>go test
PASS
ok      exanple.com/mymodule    0.031s

Как видно из результата, тест успешно пройден.

Чтобы получить подробную информацию о прохождении тестов нужно добавить флаг -test.v:

C:\book\packages>go test -test.v
=== RUN   TestSum
--- PASS: TestSum (0.00s)
PASS
ok      exanple.com/mymodule    0.028s

Теперь изменим функцию TestSum() следующим образом:

func TestSum(t *testing.T) {
   res := Sum(10, 20)
   if res != 40 {
      t.Errorf("Sum(10, 20) == %d", res)
   }
}

Результат выполнения функции Sum() не будет равен значению 40, поэтому будет вызван метод Errorf(). Запустим тестирование:

C:\book\packages>go test
--- FAIL: TestSum (0.00s)
    main_test.go:8: Sum(10, 20) == 30
FAIL
exit status 1
FAIL    exanple.com/mymodule    0.028s

Как видно из результата, тест не пройден.

Примечание

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp