Package testgen
Overview ▹
Overview ▾
The testgen plugin generates Test and Benchmark functions for each message.
Tests are enabled using the following extensions:
- testgen - testgen_all
Benchmarks are enabled using the following extensions:
- benchgen - benchgen_all
Let us look at:
github.com/gogo/protobuf/test/example/example.proto
Btw all the output can be seen at:
github.com/gogo/protobuf/test/example/*
The following message:
option (gogoproto.testgen_all) = true; option (gogoproto.benchgen_all) = true; message A { optional string Description = 1 [(gogoproto.nullable) = false]; optional int64 Number = 2 [(gogoproto.nullable) = false]; optional bytes Id = 3 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uuid", (gogoproto.nullable) = false]; }
given to the testgen plugin, will generate the following test code:
func TestAProto(t *testing.T) { popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) p := NewPopulatedA(popr, false) dAtA, err := github_com_gogo_protobuf_proto.Marshal(p) if err != nil { panic(err) } msg := &A{} if err := github_com_gogo_protobuf_proto.Unmarshal(dAtA, msg); err != nil { panic(err) } for i := range dAtA { dAtA[i] = byte(popr.Intn(256)) } if err := p.VerboseEqual(msg); err != nil { t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err) } if !p.Equal(msg) { t.Fatalf("%#v !Proto %#v", msg, p) } } func BenchmarkAProtoMarshal(b *testing.B) { popr := math_rand.New(math_rand.NewSource(616)) total := 0 pops := make([]*A, 10000) for i := 0; i < 10000; i++ { pops[i] = NewPopulatedA(popr, false) } b.ResetTimer() for i := 0; i < b.N; i++ { dAtA, err := github_com_gogo_protobuf_proto.Marshal(pops[i%10000]) if err != nil { panic(err) } total += len(dAtA) } b.SetBytes(int64(total / b.N)) } func BenchmarkAProtoUnmarshal(b *testing.B) { popr := math_rand.New(math_rand.NewSource(616)) total := 0 datas := make([][]byte, 10000) for i := 0; i < 10000; i++ { dAtA, err := github_com_gogo_protobuf_proto.Marshal(NewPopulatedA(popr, false)) if err != nil { panic(err) } datas[i] = dAtA } msg := &A{} b.ResetTimer() for i := 0; i < b.N; i++ { total += len(datas[i%10000]) if err := github_com_gogo_protobuf_proto.Unmarshal(datas[i%10000], msg); err != nil { panic(err) } } b.SetBytes(int64(total / b.N)) } func TestAJSON(t *testing1.T) { popr := math_rand1.New(math_rand1.NewSource(time1.Now().UnixNano())) p := NewPopulatedA(popr, true) jsondata, err := encoding_json.Marshal(p) if err != nil { panic(err) } msg := &A{} err = encoding_json.Unmarshal(jsondata, msg) if err != nil { panic(err) } if err := p.VerboseEqual(msg); err != nil { t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err) } if !p.Equal(msg) { t.Fatalf("%#v !Json Equal %#v", msg, p) } } func TestAProtoText(t *testing2.T) { popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano())) p := NewPopulatedA(popr, true) dAtA := github_com_gogo_protobuf_proto1.MarshalTextString(p) msg := &A{} if err := github_com_gogo_protobuf_proto1.UnmarshalText(dAtA, msg); err != nil { panic(err) } if err := p.VerboseEqual(msg); err != nil { t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err) } if !p.Equal(msg) { t.Fatalf("%#v !Proto %#v", msg, p) } } func TestAProtoCompactText(t *testing2.T) { popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano())) p := NewPopulatedA(popr, true) dAtA := github_com_gogo_protobuf_proto1.CompactTextString(p) msg := &A{} if err := github_com_gogo_protobuf_proto1.UnmarshalText(dAtA, msg); err != nil { panic(err) } if err := p.VerboseEqual(msg); err != nil { t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err) } if !p.Equal(msg) { t.Fatalf("%#v !Proto %#v", msg, p) } }
Other registered tests are also generated. Tests are registered to this test plugin by calling the following function.
func RegisterTestPlugin(newFunc NewTestPlugin)
where NewTestPlugin is:
type NewTestPlugin func(g *generator.Generator) TestPlugin
and TestPlugin is an interface:
type TestPlugin interface { Generate(imports generator.PluginImports, file *generator.FileDescriptor) (used bool) }
Plugins that use this interface include:
- populate - gostring - equal - union - and more
Please look at these plugins as examples of how to create your own. A good idea is to let each plugin generate its own tests.
Index ▹
Internal call graph ▹
Internal call graph ▾
In the call graph viewer below, each node is a function belonging to this package and its children are the functions it calls—perhaps dynamically.
The root nodes are the entry points of the package: functions that may be called from outside the package. There may be non-exported or anonymous functions among them if they are called dynamically from another package.
Click a node to visit that function's source code.
From there you can visit its callers by
clicking its declaring func
token.
Functions may be omitted if they were determined to be unreachable in the particular programs or tests that were analyzed.
func NewPlugin ¶
func NewPlugin() *plugin
func RegisterTestPlugin ¶
func RegisterTestPlugin(newFunc NewTestPlugin)
type NewTestPlugin ¶
type NewTestPlugin func(g *generator.Generator) TestPlugin
type TestPlugin ¶
type TestPlugin interface { Generate(imports generator.PluginImports, file *generator.FileDescriptor) (used bool) }
Portions of this page are modifications based on work created and shared by Google
and used according to terms described in the Creative Commons 3.0 Attribution License.
© 2018 ActiveState Software Inc. All rights reserved. Trademarks.