Задать вопрос
@starosta46

Возможны ли бенчмарки функций из пакетов в golang?

Здравствуйте. Есть файл models с таким кодом:
package api

import "encoding/json"

type Awesome struct {
	Id        string  `json:"id"`
	Message   string  `json:"message"`
	Score     float64 `json:"score"`
	Confirmed bool    `json:"confirmed"`
}

func NewAwesome(id string, message string, score float64, confirmed bool) *Awesome {
	return &Awesome{
		id,
		message,
		score,
		confirmed,
	}
}

func(a *Awesome) ToJSON() ([]byte, error) {
	return json.Marshal(a)
}


Хочу сделать бенчмарк функции ToJSON. Для этого, в этой же директории есть файл models_test с таким кодом:
package api

import "testing"



func BenchmarkAwesomeToJSON(b *testing.B) {
	for i := 0; i < b.N; i++ {
		awesome := NewAwesome("123456789", "Total awesomeness", 9.99, true)
		awesome.ToJSON()
	}
}

Однако, при запуске бенчмарка (go test -bench . models_test.go ), получаю следующую ошибку:
./models_test.go:9:14: undefined: NewAwesome
Если перенести функцию в тестовый файл, то все работает. Возможно ли тестировать функции из других файлов и из других пакетов? И, если можно, то что для этого необходимо сделать?
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
@ghostiam
На Go писатель, серверов пинатель.
Конечно можно, но вы указываете только один файл в проекте, запустите через go test -bench . и всё заработает.
$ go test -bench . 
goos: darwin
goarch: amd64
pkg: api
BenchmarkAwesomeToJSON-8         3000000               470 ns/op
PASS
ok      api    1.895s

можно указать только нужные файлы go test -bench . test_test.go test.go, но проще без них.

Так же, не совсем верно оформлен бенчмарк, в вашем случае замеряется не только производительность json.Marshal() но и производительность создания объекта.
Правильно будет делать так:
func BenchmarkAwesomeToJSON(b *testing.B) {
	awesome := NewAwesome("123456789", "Total awesomeness", 9.99, true)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		awesome.ToJSON()
	}
}
Ответ написан
nikonor
@nikonor
Программист go, perl
а зачем в команде "models_test.go"? уберите либо файл. либо точку

если из других пакетов, то нужно просто импорт делать обычный, но это как бы странно, тестировать два пакета сразу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы