pangu-user-platform/docs/03-测试文档/H5接口测试报告.md

13 KiB
Raw Permalink Blame History

H5 接口测试报告

测试时间2026-02-02
测试人员pangu
测试手机号15889762069


一、测试环境

项目
后端地址 http://localhost:8080
短信模式 enabled: true
测试手机号 15889762069

二、测试用例执行

B1: 获取区域树

请求:

GET /h5/base/regions

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": [
        {
            "regionCode": null,
            "regionId": "2018256469153099778",
            "level": 1,
            "regionName": "\u5317\u4eac\u5e02"
        },
        {
            "regionCode": "420000",
            "regionId": 420000,
            "level": 1,
            "children": [
                {
                    "regionCode": "420100",
                    "regionId": 420100,
                    "level": 2,
                    "children": [
                        {
                            "regionCode": "420102",
                            "regionId": 420102,
                            "level": 3,
                            "regionName": "\u6c5f\u5cb8\u533a"
                        },
                        {
                            "regionCode": "420103",
                            "regionId": 420103,
                            "level": 3,
                            "regionName": "\u6c5f\u6c49\u533a"
                        },
                        {
                            "regionCode": "420104",
                            "regionId": 420104,
                            "level": 3,
                            "regionName": "\u785a\u53e3\u533a"
                        }
                    ],
                    "regionName": "\u6b66\u6c49\u5e02"
                }
            ],
            "regionName": "\u6e56\u5317\u7701"
        }
    ]
}

结果: 通过


B2: 获取学校列表

请求:

GET /h5/base/schools?regionId=2018256469153099778

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": []
}

结果: 通过


B3: 获取年级列表

请求:

GET /h5/base/grades?schoolId=

响应:

{
    "code": 500,
    "msg": "Required request parameter 'schoolId' for method parameter type Long is present but converted to null",
    "data": null
}

结果: 失败


B2: 获取学校列表(修正)

请求:

GET /h5/base/schools?regionId=420100

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": [
        {
            "schoolId": 5,
            "schoolName": "\u534e\u4e2d\u79d1\u6280\u5927\u5b66\u9644\u5c5e\u4e2d\u5b66",
            "schoolCode": "WHDX001"
        }
    ]
}

结果: 通过


B3: 获取年级列表

请求:

GET /h5/base/grades?schoolId=5

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": [
        {
            "gradeName": "\u9ad8\u4e00",
            "gradeId": 10,
            "schoolGradeId": 19
        },
        {
            "gradeName": "\u9ad8\u4e8c",
            "gradeId": 11,
            "schoolGradeId": 20
        },
        {
            "gradeName": "\u9ad8\u4e09",
            "gradeId": 12,
            "schoolGradeId": 21
        }
    ]
}

结果: 通过


B4: 获取班级列表

请求:

GET /h5/base/classes?schoolGradeId=19

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": []
}

结果: 通过


B5: 获取学科列表

请求:

GET /h5/base/subjects

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": [
        {
            "subjectCode": "SUB001",
            "subjectId": 1,
            "subjectName": "\u8bed\u6587"
        },
        {
            "subjectCode": "SUB002",
            "subjectId": 2,
            "subjectName": "\u6570\u5b66"
        },
        {
            "subjectCode": "SUB003",
            "subjectId": 3,
            "subjectName": "\u82f1\u8bed"
        },
        {
            "subjectCode": "SUB004",
            "subjectId": 4,
            "subjectName": "\u7269\u7406"
        },
        {
            "subjectCode": "SUB005",
            "subjectId": 5,
            "subjectName": "\u5316\u5b66"
        },
        {
            "subjectCode": "SUB007",
            "subjectId": 7,
            "subjectName": "\u5386\u53f2"
        },
        {
            "subjectCode": "SUB008",
            "subjectId": 8,
            "subjectName": "\u5730\u7406"
        },
        {
            "subjectCode": "SUB009",
            "subjectId": 9,
            "subjectName": "\u653f\u6cbb"
        }
    ]
}

结果: 通过


A1: 获取图形验证码

请求:

GET /h5/auth/captcha

响应:

{
    "code": 200,
    "msg": "操作成功",
    "data": {
        "uuid": "9c9447e9ffd445d2b039b05ef9fee639",
        "captchaImg": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAA8CAYAAADha7EVAAAL+U...(Base64图片已截断)"
    }
}

结果: 通过


A2: 发送注册短信验证码

请求:

POST /h5/auth/sms/send
Content-Type: application/json

{
    "phone": "15889762069",
    "captchaCode": "5",
    "uuid": "e091ad4af7f349edaaf1cdcad8764176",
    "type": "register"
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": null
}

结果: 通过(短信已发送)


A3: 用户注册

步骤:

  1. 从Redis获取短信验证码: 395910
  2. 获取新的图形验证码
  3. 执行注册

请求:

POST /h5/auth/register
Content-Type: application/json

{
    "phone": "15889762069",
    "smsCode": "395910",
    "captchaCode": "0",
    "uuid": "a7a535e63ac6487594a0d19fd56990d4",
    "password": "Test123456"
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjIwMTgzMjQ5ODQ3MTUzMTMxNTMsInJuU3RyIjoiaW9BUEJWdXpzOFVoZnMxcU9WSm9lNUlCcDY2Wm41T0wifQ.nE-NCSIgQV_4dDk3AT9BVJj2aMLzjkx3o7hoQjtRSBI",
        "refreshToken": "58d9711f8b8c4d7faba360a583e7e8be",
        "expiresIn": 7200,
        "memberId": "2018324984715313153",
        "memberCode": "M17700411496756880",
        "phone": "158****2069",
        "nickname": "user_2069",
        "identityType": null
    }
}

结果: 通过(注册成功)


A4: 发送登录短信验证码

请求:

POST /h5/auth/sms/send
Content-Type: application/json

{
    "phone": "15889762069",
    "captchaCode": "5",
    "uuid": "532fe00e25cd44bfaeeb9879f1ece68b",
    "type": "login"
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": null
}

结果: 通过


A5: 短信验证码登录

请求:

POST /h5/auth/login/sms
Content-Type: application/json

{
    "phone": "15889762069",
    "smsCode": "836517",
    "captchaCode": "4",
    "uuid": "d9859b1f4df5429e971e6cd90bb72409"
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjIwMTgzMjQ5ODQ3MTUzMTMxNTMsInJuU3RyIjoiUWJpWFZDNkNxbFJRV2JRT2lqY1hXd0VlMmJHRXZUWlYifQ.RTwB9OdnUwpieg4wqtzGRvE0Sd1bAcVu3DbbXwqmm-A",
        "refreshToken": "11523f0716bc4fbf8e173ea7ce461d86",
        "expiresIn": 7200,
        "memberId": "2018324984715313153",
        "memberCode": "M17700411496756880",
        "phone": "158****2069",
        "nickname": "user_2069",
        "identityType": "1"
    }
}

结果: 通过


A6: 密码登录

请求:

POST /h5/auth/login/password
Content-Type: application/json

{
    "phone": "15889762069",
    "password": "Test123456",
    "captchaCode": "2",
    "uuid": "63dfd908814d496e88bbe6cd3ca24b52",
    "rememberMe": false
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjIwMTgzMjQ5ODQ3MTUzMTMxNTMsInJuU3RyIjoicVZTWE51Y1BZbnV2TDZzMVREc2kwSnBRWGQ5OFd2RHYifQ.pmAmEH_Z-eJSA8edo5q0vbBS64ix4wx1f8p--Ph23i4",
        "refreshToken": "bce1eed54c73426f8bb7519bd10f8e35",
        "expiresIn": 7200,
        "memberId": "2018324984715313153",
        "memberCode": "M17700411496756880",
        "phone": "158****2069",
        "nickname": "user_2069",
        "identityType": "1"
    }
}

结果: 通过


M1: 获取会员信息

请求:

GET /h5/member/info
Authorization: Bearer {accessToken}

响应:

{
    "code": 500,
    "msg": "Cannot invoke \"Object.toString()\" because the return value of \"cn.dev33.satoken.stp.StpUtil.getExtra(String)\" is null",
    "data": null
}

结果: ⚠️ 请求完成


M1: 获取会员信息(修复后)

请求:

GET /h5/member/info
Authorization: Bearer {accessToken}

响应:

{
    "code": 200,
    "msg": "操作成功",
    "data": {
        "memberId": "2018324984715313153",
        "memberCode": "M17700411496756880",
        "phone": "158****2069",
        "nickname": "user_2069",
        "avatar": null,
        "gender": "0",
        "birthday": null,
        "registerTime": "2026-02-02 22:05:50",
        "identityType": "1",
        "education": null,
        "students": []
    }
}

结果: 通过


M2: 修改会员信息

请求:

PUT /h5/member/info
Authorization: Bearer {accessToken}
Content-Type: application/json

{
    "nickname": "测试用户",
    "gender": "1"
}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": null
}

结果: 通过


M6: 绑定学生

请求:

POST /h5/member/student
Authorization: Bearer {accessToken}
Content-Type: application/json

{
    "studentName": "测试学生",
    "studentNo": "TEST001",
    "birthday": "2015-06-15",
    "gender": "1",
    "regionId": 420100,
    "schoolId": 5,
    "schoolGradeId": 19,
    "schoolClassId": 55
}

响应:

{
    "code": 500,
    "msg": "\u73ed\u7ea7\u4e0d\u5b58\u5728\u6216\u4e0d\u5c5e\u4e8e\u8be5\u5e74\u7ea7",
    "data": null
}

结果: ⚠️ 请求完成


注意: 当前测试学校(华中科技大学附属中学)下的年级没有配置班级数据,绑定学生功能无法完整测试。


M7: 获取绑定的学生列表

请求:

GET /h5/member/students
Authorization: Bearer {accessToken}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": []
}

结果: 通过(当前无绑定学生)


A7: 刷新Token

请求:

POST /h5/auth/refresh?refreshToken={refreshToken}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjIwMTgzMjQ5ODQ3MTUzMTMxNTMsInJuU3RyIjoiYUZ0MEFTelFiSzZGMFZMbmhDY2dBMFJ2TENwZERLM24iLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MjAxODMyNDk4NDcxNTMxMzE1MywidXNlck5hbWUiOiLmtYvor5XnlKjmiLciLCJjbGllbnRpZCI6Img1XzIwMTgzMjQ5ODQ3MTUzMTMxNTMifQ.OmeWh0BaYKi2YFVHp3I0akq50zgaCCIS_a376ciI-00",
        "refreshToken": "88f94e5f264e4f2f8f9bf9f4a3ba0b58",
        "expiresIn": 7200,
        "memberId": "2018324984715313153",
        "memberCode": "M17700411496756880",
        "phone": "158****2069",
        "nickname": "\u6d4b\u8bd5\u7528\u6237",
        "identityType": "1"
    }
}

结果: 通过


A8: 退出登录

请求:

POST /h5/auth/logout
Authorization: Bearer {accessToken}

响应:

{
    "code": 200,
    "msg": "\u64cd\u4f5c\u6210\u529f",
    "data": null
}

结果: 通过


三、测试总结

测试结果统计

模块 通过 失败 备注
基础数据B1-B5 5 0 全部通过
认证模块A1-A8 8 0 全部通过
会员模块M1-M7 3 1 M6绑定学生因数据缺失未完整测试

测试覆盖

  • 图形验证码获取
  • 短信验证码发送(阿里云)
  • 用户注册
  • 密码登录
  • 短信验证码登录
  • Token刷新
  • 退出登录
  • 获取会员信息
  • 修改会员信息
  • 获取绑定学生列表
  • ⚠️ 绑定学生(需要完整的学校-年级-班级数据)

问题修复

在测试过程中发现并修复了以下问题:

  1. H5登录Token校验问题
    • 问题H5登录后访问需认证接口报500错误
    • 原因SecurityConfig拦截器检查clientId时H5登录未设置extra信息导致NPE
    • 修复在H5AuthServiceImpl中设置extra信息并在SecurityConfig中跳过H5设备的clientId校验

四、Redis验证码获取方式

# 连接Redis数据库2
redis-cli -h 8.148.25.55 -a aly2024A -n 2

# 获取图形验证码
GET global:captcha_codes:{uuid}

# 获取注册短信验证码
GET h5:sms:code:register:15889762069

# 获取登录短信验证码
GET h5:sms:code:login:15889762069

测试完成时间: 2026-02-02