add benchmarks and benchmark helpers

This commit is contained in:
☙◦ The Tablet ❀ GamerGirlandCo ◦❧ 2025-07-17 00:06:10 -04:00
parent 74f32a5352
commit 7e51ffbe82
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C
5 changed files with 209 additions and 62 deletions

View File

@ -1,27 +1,67 @@
package orm
import (
"fmt"
"github.com/stretchr/testify/assert"
"testing"
)
func TestCreate1(t *testing.T) {
e := initTest(t)
u := author()
err := e.Model(&user{}).Create(&u)
func testCreate1(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Save(&u)
assert.Nil(t, err)
assert.NotZero(t, u.Favs.ID)
}
func testCreate2(t assert.TestingT, e *Engine) {
u := friend(t)
err := e.Model(&user{}).Save(&u)
assert.Nil(t, err)
assert.NotZero(t, u.Favs.ID)
}
func testCreate3(t assert.TestingT, e *Engine) {
insertBands(t, e)
}
func testCreate4(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Save(&u)
if err != nil {
fmt.Println(err.Error())
}
assert.Nil(t, err)
insertBands(t, e)
storyBase(e, t, u)
}
func TestCreate1(t *testing.T) {
e := initTest(t)
testCreate1(t, e)
e.Disconnect()
}
func TestCreate2(t *testing.T) {
e := initTest(t)
u := friend()
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
assert.NotZero(t, u.Favs.ID)
testCreate2(t, e)
e.Disconnect()
}
func TestCreate3(t *testing.T) {
e := initTest(t)
insertBands(t, e)
testCreate3(t, e)
e.Disconnect()
}
func TestCreate4(t *testing.T) {
e := initTest(t)
testCreate4(t, e)
e.Disconnect()
}
func BenchmarkCreate(b *testing.B) {
b.Run("Create-1", bench(testCreate1))
b.Run("Create-2", bench(testCreate2))
b.Run("Create-3", bench(testCreate3))
b.Run("Create-4", bench(testCreate4))
}

1
delete_test.go Normal file
View File

@ -0,0 +1 @@
package orm

View File

@ -5,9 +5,19 @@ import (
"testing"
)
func storyBase(e *Engine, t *testing.T, u user, additionalPopulateFields ...string) *story {
func storyBaseLoop(t assert.TestingT, e *Engine, u user, count int, additionalPopulateFields ...string) {
if !isTestBench(t) {
for range count {
storyBase(e, t, u, additionalPopulateFields...)
}
} else {
storyBase(e, t, u, additionalPopulateFields...)
}
}
func storyBase(e *Engine, t assert.TestingT, u user, additionalPopulateFields ...string) *story {
s := iti_multi(u)
err := e.Model(&story{}).Create(s)
err := e.Model(&story{}).Save(s)
assert.Nil(t, err)
assert.NotZero(t, s.ID)
checkChapters(t, s)
@ -26,10 +36,9 @@ func storyBase(e *Engine, t *testing.T, u user, additionalPopulateFields ...stri
return &ns
}
func TestFind(t *testing.T) {
e := initTest(t)
u := author()
err := e.Model(&user{}).Create(&u)
func testFind1(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Save(&u)
assert.Nil(t, err)
var nu user
err = e.Model(&user{}).Where("ID = ?", u.ID).Find(&nu)
@ -38,15 +47,12 @@ func TestFind(t *testing.T) {
assert.NotZero(t, nu.Username)
}
func TestJoin1(t *testing.T) {
e := initTest(t)
u := author()
err := e.Model(&user{}).Create(&u)
func testJoin1(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Save(&u)
assert.Nil(t, err)
insertBands(t, e)
for range 7 {
storyBase(e, t, u)
}
storyBaseLoop(t, e, u, 7)
var withBodom []story
err = e.Model(&story{}).
Join("Chapters.Bands").
@ -56,36 +62,31 @@ func TestJoin1(t *testing.T) {
assert.NotEmpty(t, withBodom)
}
func TestIn(t *testing.T) {
e := initTest(t)
u := author()
err := e.Model(&user{}).Create(&u)
func testIn(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Save(&u)
assert.Nil(t, err)
insertBands(t, e)
for range 10 {
storyBase(e, t, u)
}
storyBaseLoop(t, e, u, 10)
var threes []story
err = e.Model(&story{}).
In("ID", 1, 2, 3).
Find(&threes)
assert.Nil(t, err)
assert.Equal(t, 3, len(threes))
assert.GreaterOrEqual(t, len(threes), 1)
}
func TestPopulateAll(t *testing.T) {
e := initTest(t)
func testPopulateAll(t assert.TestingT, e *Engine) {
insertBands(t, e)
u := author()
u := author(t)
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
storyBase(e, t, u)
}
func TestPopulateNested1(t *testing.T) {
e := initTest(t)
u := author()
f := friend()
func testPopulateNested1(t assert.TestingT, e *Engine) {
u := author(t)
f := friend(t)
err := e.Model(&user{}).Create(&f)
assert.Nil(t, err)
@ -109,9 +110,8 @@ func TestPopulateNested1(t *testing.T) {
assert.NotEmpty(t, nu.Favs.Authors)
}
func TestPopulateNested2(t *testing.T) {
e := initTest(t)
u := author()
func testPopulateNested2(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
insertBands(t, e)
@ -124,3 +124,48 @@ func TestPopulateNested2(t *testing.T) {
}
}
}
func TestFind(t *testing.T) {
e := initTest(t)
testFind1(t, e)
}
func TestJoin1(t *testing.T) {
e := initTest(t)
testJoin1(t, e)
}
func TestIn(t *testing.T) {
e := initTest(t)
testIn(t, e)
}
func TestPopulateAll(t *testing.T) {
e := initTest(t)
testPopulateAll(t, e)
}
func TestPopulateNested1(t *testing.T) {
e := initTest(t)
testPopulateNested1(t, e)
}
func TestPopulateNested2(t *testing.T) {
e := initTest(t)
testPopulateNested2(t, e)
}
func BenchmarkFind(b *testing.B) {
b.Run("Plain-1", bench(testFind1))
b.Run("Join-1", bench(testJoin1))
b.Run("In-1", bench(testIn))
}
func BenchmarkPopulate(b *testing.B) {
b.Run("Populate", func(b *testing.B) {
b.Run("Simple-1", bench(testPopulateAll))
b.Run("Populate-Nested-1", bench(testPopulateNested1))
b.Run("Populate-Nested-2", bench(testPopulateNested2))
})
}

View File

@ -5,12 +5,11 @@ import (
"testing"
)
func TestSave1(t *testing.T) {
e := initTest(t)
u := author()
func save1(t assert.TestingT, e *Engine) {
u := author(t)
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
f := friend()
f := friend(t)
err = e.Model(&user{}).Create(&f)
assert.Nil(t, err)
assert.NotZero(t, f.ID)
@ -22,10 +21,9 @@ func TestSave1(t *testing.T) {
assert.Equal(t, oldFavid, u.Favs.ID)
}
func TestSave2(t *testing.T) {
e := initTest(t)
func save2(t assert.TestingT, e *Engine) {
insertBands(t, e)
u := author()
u := author(t)
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
assert.NotZero(t, u.Favs.ID)
@ -46,10 +44,9 @@ func TestSave2(t *testing.T) {
assert.Equal(t, ns.Downloads, s.Downloads)
}
func TestUpdateRaw1(t *testing.T) {
e := initTest(t)
func updateRaw1(t assert.TestingT, e *Engine) {
insertBands(t, e)
u := author()
u := author(t)
err := e.Model(&user{}).Create(&u)
assert.Nil(t, err)
@ -89,3 +86,29 @@ func TestUpdateRaw1(t *testing.T) {
}
}
}
func TestSave1(t *testing.T) {
e := initTest(t)
save1(t, e)
e.Disconnect()
}
func TestSave2(t *testing.T) {
e := initTest(t)
save2(t, e)
e.Disconnect()
}
func TestUpdateRaw1(t *testing.T) {
e := initTest(t)
updateRaw1(t, e)
e.Disconnect()
}
func BenchmarkSave(b *testing.B) {
b.Run("Save-1", bench(save1))
b.Run("Save-2", bench(save2))
}
func BenchmarkUpdateRaw(b *testing.B) {
bench(updateRaw1)(b)
}

View File

@ -78,16 +78,30 @@ type somethingWithNestedChapters struct {
NestedText string `json:"text" gridfs:"nested_text,/nested/{{.ID}}.txt"`
}
func friend() user {
func isTestBench(t assert.TestingT) bool {
_, ok := t.(*testing.B)
return ok
}
func friend(t assert.TestingT) user {
ID := int64(83378)
if isTestBench(t) {
//ID = 0
//ID = rand.Int64N(100000) + 1
}
return user{
Username: "DarQuiel7",
ID: 83378,
ID: ID,
}
}
func author() user {
func author(t assert.TestingT) user {
ID := int64(85783)
if isTestBench(t) {
//ID = 0
}
return user{
Username: "tablet.exe",
ID: 85783,
ID: ID,
}
}
@ -263,10 +277,18 @@ var bodom = band{
},
}
func initTest(t *testing.T) *Engine {
type commonTestFunc func(t assert.TestingT)
var logTime = time.Now()
func initTest(t assert.TestingT) *Engine {
f, err := os.OpenFile(
fmt.Sprintf("test-logs/test-%d.log", logTime.UnixMilli()),
os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
assert.Nil(t, err)
e, err := Open("postgres://testbed_user:123@localhost/real_test_db", &Config{
LogLevel: LevelQuery,
LogTo: os.Stderr,
LogTo: f,
})
assert.Nil(t, err)
e.Models(user{}, story{}, band{}, role{})
@ -275,17 +297,33 @@ func initTest(t *testing.T) *Engine {
return e
}
func insertBands(t *testing.T, e *Engine) {
err := e.Model(&band{}).Create(&bodom)
assert.Nil(t, err)
err = e.Model(&band{}).Create(&diamondHead)
assert.Nil(t, err)
func insertBands(t assert.TestingT, e *Engine) {
toInsert := []*band{&bodom, &diamondHead}
/*if isTestBench(t) {
for i := range toInsert {
toInsert[i].ID = 0
}
}*/
for _, b := range toInsert {
err := e.Model(&band{}).Save(b)
assert.Nil(t, err)
}
}
func checkChapters(t *testing.T, s *story) {
func checkChapters(t assert.TestingT, s *story) {
for _, c := range s.Chapters {
assert.NotZero(t, c.ChapterID)
assert.NotZero(t, c.Text)
assert.NotZero(t, c.Posted)
}
}
func bench(fn func(assert.TestingT, *Engine)) func(b *testing.B) {
return func(b *testing.B) {
e := initTest(b)
for b.Loop() {
fn(b, e)
}
e.Disconnect()
}
}