为了提升代码质量,之前给组内定了一个 UT 覆盖率的 OKR ,但 golang 写 UT 时,生成测试数据很麻烦。
一方面每个 model 实例都要手动创建,另一方面由于 golang 的语言特性每个字段也要 set 。进而,自己写 factory 函数也很麻烦,内容上都是重复的劳动。
于是自己写了一个类似于 python 中 factory-boy 的数据生成函数的代码生成工具。用来生成 factory 函数文件。
还有更多的设置可以看该项目 Github 上的 README ,现在这个工具已经通过 makefile 成为公司项目中的一个工具包。
欢迎大家使用,并提意见
补充一下生成factory文件和用法
package booktableorderfactory
import (
"github.com/bxcodec/faker"
"github/zaihui/ent-factory/factories"
"github/zaihui/ent-factory/gen/entschema"
"github/zaihui/ent-factory/service/app"
)
type BookTableOrderFieldSetter func(*entschema.BookTableOrder)
func SetUID(uIDGen string) BookTableOrderFieldSetter {
return func(bookTableOrderGen *entschema.BookTableOrder) {
bookTableOrderGen.UID = uIDGen
}
}
func SetUserUID(userUIDGen string) BookTableOrderFieldSetter {
return func(bookTableOrderGen *entschema.BookTableOrder) {
bookTableOrderGen.UserUID = userUIDGen
}
}
func SetOrderNo(orderNoGen string) BookTableOrderFieldSetter {
return func(bookTableOrderGen *entschema.BookTableOrder) {
bookTableOrderGen.OrderNo = orderNoGen
}
}
func SetType(typeGen string) BookTableOrderFieldSetter {
return func(bookTableOrderGen *entschema.BookTableOrder) {
bookTableOrderGen.Type = typeGen
}
}
func New(s factories.TestSuite, opts ...BookTableOrderFieldSetter) *entschema.BookTableOrder {
data := entschema.BookTableOrder{}
s.NoError(faker.FakeData(&data))
for _, opt := range opts {
opt(&data)
}
return app.EntClient.BookTableOrder.Create().
SetUID(data.UID).
SetUserUID(data.UserUID).
SetOrderNo(data.OrderNo).
SetType(data.Type).
SaveX(s.Context())
}
用法
package main
import (
your_location_of_factories/booktableorderfactory
)
// s is an instance of test suite
order := booktableorderfactory.new(s)
// if you want to customize the value of a field, eg. UID
order2: = booktableorderfactory.new(s, booktableorderfactory.SetUID("your uid"))
1
kindjeff 2023-02-07 14:01:49 +08:00
wow ,正好需要这种东西(点开发现已 star 但没看过,难崩)。
ent 的 code generation 确实是个麻烦事。 |
2
adjusted 2023-02-07 14:02:35 +08:00
看着像用了 ent 源码改的,而不是作为 ent 的插件?
|
3
lxy141 OP @adjusted 没有用 ent 的源码,只是读了 ent 生成的 struct 。项目里的 ent 生成的内容,主要是用于测试的。
|
4
yrzs 2023-02-07 14:10:14 +08:00
可以
|