接口测试

This commit is contained in:
zhaocy 2022-07-15 10:37:11 +08:00
parent 7bb8f8254a
commit c87bca9004
10 changed files with 70 additions and 88 deletions

View File

@ -35,6 +35,7 @@ func init() {
var account = flag.String("account", "", "登录账号") var account = flag.String("account", "", "登录账号")
var sid = flag.Int32("sid", 0, "区服ID") var sid = flag.Int32("sid", 0, "区服ID")
var create = flag.Bool("create", false, "是否创建新账号") //false 不创建新账号 var create = flag.Bool("create", false, "是否创建新账号") //false 不创建新账号
var role = flag.Bool("role", false, "创角")
func main() { func main() {
Execute() Execute()
@ -49,6 +50,7 @@ var runCmd = &cobra.Command{
opts.Create = *create opts.Create = *create
opts.Account = *account opts.Account = *account
opts.ServerId = *sid opts.ServerId = *sid
opts.Role = *role
r := robot.NewRobot(opts) r := robot.NewRobot(opts)
r.Run() r.Run()
}, },

View File

@ -1,44 +0,0 @@
package robot
import (
"go_dreamfactory/comm"
"go_dreamfactory/modules/user"
"go_dreamfactory/pb"
)
var (
addResBuilders = []*TestCase{
{
desc: "添加资源",
mainType: string(comm.ModuleUser),
subType: user.UserSubTypeAddRes,
req: &pb.UserAddResReq{
Res: &pb.UserAssets{
A: "item",
T: "10001",
N: 1000,
},
},
rsp: &pb.UserAddResResp{},
enabled: true,
},
{
desc: "添加资源2",
mainType: string(comm.ModuleUser),
subType: user.UserSubTypeAddRes,
req: &pb.UserAddResReq{
Res: &pb.UserAssets{
A: "item",
T: "10011",
N: 1000,
},
},
rsp: &pb.UserAddResResp{},
enabled: true,
},
}
)
func (r *Robot) RunAddRes() {
r.addBuilders(addResBuilders)
}

View File

@ -91,7 +91,7 @@ var (
enabled: true, enabled: true,
} }
tcs = append(tcs, tc) tcs = append(tcs, tc)
robot.addTestCaseAndReq(tcs) //这里一定要调用此方法才会发送请求 robot.addBuilders(tcs) //这里一定要调用此方法才会发送请求
} }
}, },

View File

@ -54,12 +54,12 @@ var (
enabled: true, enabled: true,
}, },
} }
robot.addTestCaseAndReq(tcs) robot.addBuilders(tcs)
}, },
} }
tcs = append(tcs, tc) tcs = append(tcs, tc)
} }
robot.addTestCaseAndReq(tcs) //这里一定要调用此方法才会发送请求 robot.addBuilders(tcs) //这里一定要调用此方法才会发送请求
} }
}, },

View File

@ -60,8 +60,8 @@ func (r *Robot) AccountLogin() {
req: &pb.UserCreateReq{ //设置请求参数 req: &pb.UserCreateReq{ //设置请求参数
NickName: nick, NickName: nick,
}, },
rsp: &pb.UserCreateResp{}, rsp: &pb.UserCreateResp{},
// enabled: r.enable, enabled: r.enable,
} }
tcs = append(tcs, tc) tcs = append(tcs, tc)
r.addBuilders(tcs) r.addBuilders(tcs)

View File

@ -7,6 +7,7 @@ type Options struct {
Create bool Create bool
Secretkey string //秘钥串 Secretkey string //秘钥串
ServerId int32 //区服ID ServerId int32 //区服ID
Role bool //是否创角
} }
func DefaultOpts() *Options { func DefaultOpts() *Options {

View File

@ -12,8 +12,8 @@ var pack_builders = []*TestCase{
mainType: string(comm.ModulePack), mainType: string(comm.ModulePack),
subType: "queryuserpackreq", subType: "queryuserpackreq",
// req: &pb.Pack_Getlist_Req{IType: 1}, // req: &pb.Pack_Getlist_Req{IType: 1},
rsp: &pb.UserCreateResp{}, rsp: &pb.UserCreateResp{},
enabled: true, // enabled: true,
}, },
} }

View File

@ -89,28 +89,28 @@ func (r *Robot) Run() {
if r.opts.Account == "" { if r.opts.Account == "" {
zlog.Fatal("WARNNING: account is required !!!") zlog.Fatal("WARNNING: account is required !!!")
} }
r.enable = r.opts.Role
r.AccountLogin() r.AccountLogin()
} }
go func() { // go func() {
for { // for {
r.handleRsp() // r.handleRsp()
} // }
}() // }()
ticker := time.NewTicker(time.Second * 65) ticker := time.NewTicker(time.Second * 5)
go func() { go func() {
for { for {
select { r.printBuilders()
case <-ticker.C: <-ticker.C
if len(r.builderMap) == 0 { if len(r.builderMap) == 0 {
r.printReport(&TestReport{ r.printReport(&TestReport{
caseTotal: r.caseTotal, caseTotal: r.caseTotal,
caseSuccess: r.caseSuccess, caseSuccess: r.caseSuccess,
caseError: r.caseError, caseError: r.caseError,
}) })
os.Exit(0) os.Exit(0)
}
} }
} }
}() }()
@ -149,13 +149,20 @@ func (r *Robot) addBuilders(builders []*TestCase) {
} }
} }
func (r *Robot) printBuilders() {
for k, v := range r.builderMap {
zlog.Debugf("%v %s.%s", k, v.mainType, v.subType)
}
}
//处理用例,发送请求 //处理用例,发送请求
func (r *Robot) handleReq() { func (r *Robot) handleReq() {
go func() { // go func() {
for len(r.builderMap) > 0 {
for _, b := range r.builderMap { for _, b := range r.builderMap {
if b.enabled && b.req != nil && !b.requested { if b.enabled && b.req != nil && !b.requested {
time.Sleep(time.Millisecond * 500) time.Sleep(time.Millisecond * 500)
r.reqCh <- b.id // r.reqCh <- b.id
b.start = time.Now() b.start = time.Now()
r.start = time.Now() r.start = time.Now()
head := &pb.UserMessage{MainType: b.mainType, SubType: b.subType} head := &pb.UserMessage{MainType: b.mainType, SubType: b.subType}
@ -166,9 +173,12 @@ func (r *Robot) handleReq() {
zlog.Errorf("send to client err:%v", err) zlog.Errorf("send to client err:%v", err)
} }
b.requested = true b.requested = true
r.handleRsp(b.id)
} }
} }
}() }
// }()
} }
//加入用例并执行请求 //加入用例并执行请求
@ -196,12 +206,11 @@ func (r *Robot) handleNotify(uuid string, msg *pb.UserMessage) {
r.printReply(msg, tc) r.printReply(msg, tc)
delete(r.builderMap, uuid) delete(r.builderMap, uuid)
return
} }
} }
//处理响应 //处理响应
func (r *Robot) handleRsp() { func (r *Robot) handleRsp(id string) {
defer func() { defer func() {
r.caseTotal++ r.caseTotal++
}() }()
@ -215,14 +224,19 @@ func (r *Robot) handleRsp() {
zlog.Fatalf("unmarshal err:%v", err) zlog.Fatalf("unmarshal err:%v", err)
} }
uuid := <-r.reqCh uuid, _ := r.findTestCase(msg)
if uuid == "" {
uuid = id
}
// uuid := <-r.reqCh
r.handleNotify(uuid, msg)
if v, ok := r.builderMap[uuid]; ok { if v, ok := r.builderMap[uuid]; ok {
r.handleNotify(uuid, msg)
if v.enabled && // if v.enabled &&
(msg.MainType == v.mainType && // (msg.MainType == v.mainType &&
msg.SubType == v.subType) && // msg.SubType == v.subType) &&
v.requested { // v.requested {
v.hs = time.Since(v.start) v.hs = time.Since(v.start)
if !comm.ProtoUnmarshal(msg, v.rsp) { if !comm.ProtoUnmarshal(msg, v.rsp) {
@ -230,7 +244,6 @@ func (r *Robot) handleRsp() {
} }
//处理下一层用例 //处理下一层用例
// r.goNext(v)
if v.next != nil { if v.next != nil {
v.next(r, v.rsp) v.next(r, v.rsp)
} }
@ -253,7 +266,16 @@ func (r *Robot) handleRsp() {
} }
r.caseSuccess++ r.caseSuccess++
} }
// }
}
func (r *Robot) findTestCase(msg *pb.UserMessage) (string, bool) {
for k, v := range r.builderMap {
if v.mainType == msg.MainType && v.subType == msg.SubType {
return k, true
}
} }
return "", false
} }
//登录回调 //登录回调
@ -439,7 +461,6 @@ func (r *Robot) onUserLoaded() {
//user //user
r.RunUser() r.RunUser()
r.RunAddRes()
//hero //hero
r.RunHero() r.RunHero()
//friend //friend

View File

@ -17,19 +17,19 @@ var user_builders = []*TestCase{
NickName: "乐谷70616", NickName: "乐谷70616",
}, },
rsp: &pb.UserCreateResp{}, rsp: &pb.UserCreateResp{},
enabled: true, // enabled: true,
}, { }, {
desc: "添加资源", desc: "添加资源",
mainType: string(comm.ModuleUser), mainType: string(comm.ModuleUser),
subType: user.UserSubTypeAddRes, subType: "addres",
req: &pb.UserAddResReq{ //设置请求参数 req: &pb.UserAddResReq{
Res: &pb.UserAssets{ Res: &pb.UserAssets{
A: comm.ResGold, A: "item",
T: "", T: "10011",
N: 100, N: 999,
}, },
}, },
rsp: &pb.UserAddResResp{}, rsp: &pb.UserAddResResp{},
// enabled: true, // enabled: true,
}, },
} }

View File

@ -12,6 +12,7 @@ import (
cfg "go_dreamfactory/sys/configure/structs" cfg "go_dreamfactory/sys/configure/structs"
"strconv" "strconv"
"github.com/spf13/cast"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/anypb"
) )
@ -224,7 +225,8 @@ func (this *ModuleBase) DispenseRes(uid string, res []*cfg.Game_atn, bPush bool)
code = this.ModuleUser.AddAttributeValue(uid, v.T, v.N, bPush) code = this.ModuleUser.AddAttributeValue(uid, v.T, v.N, bPush)
} else if v.A == comm.ItemType { //道具资源 } else if v.A == comm.ItemType { //道具资源
resID, _ = strconv.Atoi(v.T) resID = cast.ToInt(v.T)
// resID, _ = strconv.Atoi(v.T)
code = this.ModuleItems.AddItem(source, uid, int32(resID), v.N, bPush) code = this.ModuleItems.AddItem(source, uid, int32(resID), v.N, bPush)
} else if v.A == comm.HeroType { //卡片资源 } else if v.A == comm.HeroType { //卡片资源
resID, _ = strconv.Atoi(v.T) resID, _ = strconv.Atoi(v.T)