From vmkteam-developer
Provides Go service testing patterns using BDD (goconvey or testify/assert), real PostgreSQL DB, no mocks. Includes Makefile targets, TestMain setup, and DB test examples.
npx claudepluginhub vmkteam/claude-plugins --plugin vmkteam-developerThis skill uses the workspace's default tool permissions.
Паттерны тестирования для vmkteam Go-сервисов.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Паттерны тестирования для vmkteam Go-сервисов.
testify/assert + testify/require в BDD стилеTestDB*Test[^D][^B]# Все тесты (включая DB)
test:
@PGDATABASE=$(TEST_PGDATABASE) go test -count=1 $(GOFLAGS) -coverprofile=coverage.txt -covermode count $(PKG)
# Быстрые тесты (без DB) — пропускает TestDB*
test-short:
@go test $(GOFLAGS) -v -test.short -test.run="Test[^D][^B]" -coverprofile=coverage.txt -covermode count $(PKG)
# Пересоздать тестовую БД
db-test:
@dropdb --if-exists $(TEST_PGDATABASE)
@createdb -E UTF-8 $(TEST_PGDATABASE)
@psql -f docs/schema.sql $(TEST_PGDATABASE)
import . "github.com/smartystreets/goconvey/convey"
func TestDBUserService(t *testing.T) {
Convey("Test UserService", t, func() {
ctx := t.Context()
srv := NewUserService(testDB)
Convey("Positive testing", func() {
Convey("Test CRUD", func() {
inUser := User{
Login: fmt.Sprintf("ivan_%d", time.Now().Unix()),
Password: "pwd",
StatusID: db.StatusEnabled,
}
// Add
outUser, err := srv.Add(ctx, inUser)
So(err, ShouldBeNil)
So(outUser, ShouldNotBeNil)
So(outUser.ID, ShouldBeGreaterThan, 0)
// GetByID
u, err := srv.GetByID(ctx, outUser.ID)
So(err, ShouldBeNil)
So(u.Login, ShouldEqual, inUser.Login)
// Update
u.Login = "updated"
ok, err := srv.Update(ctx, *u)
So(err, ShouldBeNil)
So(ok, ShouldBeTrue)
// Delete
ok, err = srv.Delete(ctx, outUser.ID)
So(err, ShouldBeNil)
So(ok, ShouldBeTrue)
})
})
Convey("Negative testing", func() {
Convey("Empty login", func() {
_, err := srv.Add(ctx, User{Login: "", Password: "pwd", StatusID: db.StatusEnabled})
So(err, ShouldNotBeNil)
})
})
})
}
// server_test.go
var testDB db.DB
func TestMain(m *testing.M) {
testDB = NewTestDB()
os.Exit(m.Run())
}
func NewTestDB() db.DB {
cfg, err := pg.ParseURL(os.Getenv("DB_CONN"))
if err != nil {
cfg, _ = pg.ParseURL("postgresql://localhost:5432/test-mysrv?sslmode=disable")
}
dbc := pg.Connect(cfg)
return db.New(dbc)
}
Генерируются через make mfd-db-test (/mfd). Содержат фабрики, Cleaner, NextID — не пиши хелперы вручную.
// Использование
entity, clean := test.Entity(t, dbo, nil)
defer clean()
Для сложных проектов — дамп тестовой БД с seed data:
# Пересоздать из дампа
db-test:
@dropdb --if-exists $(TEST_PGDATABASE)
@createdb -E UTF-8 -O postgres -T template0 $(TEST_PGDATABASE)
@pg_restore -O -x --disable-triggers -d $(TEST_PGDATABASE) docs/schema.dump
@pg_restore -O -x --disable-triggers -d $(TEST_PGDATABASE) docs/seed.dump
# Сохранить текущее состояние
db-test-dump:
@pg_dump -Fc -O -x -s $(TEST_PGDATABASE) > docs/schema.dump
@pg_dump -Fc -O -x -a -t 'public.*' $(TEST_PGDATABASE) > docs/seed.dump
make mfd-db-test
Генерирует фабрики в pkg/db/test/ с gofakeit/v7:
func Entity(t, dbo, in, ...OpFunc) (*db.Entity, Cleaner)defer clean() для автоочисткиWithFakeEntity() — случайные данныеNextID() — атомарный инкремент для параллельных тестовtest-short их пропускает