【免费下载链接】go-admin
A golang framework helps gopher to build a data visualization and admin panel in ten minutes
本文以 go-admin 仓库 tests/web/README_CN.md 的功能测试清单为骨架,系统梳理 go-admin 后台管理系统的登录、导航、表格、表单、详情页与内置权限/角色/管理员/菜单管理等模块的验收测试覆盖范围,并结合 tests/web/web_test.go、tests/tables/user.go 等源码,逐项说明每个测试点在真实项目中的落地实现、对应 UI 组件与 XPath 定位方式。读完本文,你将掌握 go-admin Web 端功能验收测试的完整清单、UAT 测试框架的启动与运行机制,以及每个测试条目背后的表格字段配置与组件实现原理。
一、清单概览:测试覆盖了哪些界面能力
该清单是一份面向 go-admin 后台管理界面的功能测试覆盖表,按“模块 → 子功能 → 具体检查点”三级组织,使用[x](已完成)与[ ](待完成/未覆盖)标注状态。从清单可以看出,当前覆盖重点集中在表格页(含功能按钮、行更新、筛选、导出、列选择、列排序、列功能按钮)与表单页(组件显示、按钮显示、联动)两大类高频交互区域,同时对登录、导航栏、详情页及权限/角色/管理员/菜单的增删改查做了基础覆盖。
测试目标的载体是一个内置的用户表(users)测试页面,其完整字段与按钮配置位于 tests/tables/user.go:信息列表页定义了Name(可内联编辑、可模糊筛选)、Gender(自定义显示、开关编辑、单选筛选)、Experience、Drink(下拉筛选)、City(可筛选)、Book(联表字段)、Avatar、CreatedAt(时间范围筛选)、UpdatedAt等字段,并挂载了jump、popup、ajax三个顶部功能按钮与google、Audit、Preview三个行级操作按钮。清单中几乎所有表格类检查点,都能在这个测试表上找到对应的真实配置。
二、测试框架:Web 端 UAT 自动化测试是怎么跑起来的
在逐项拆解清单之前,先了解清单背后的执行框架,这有助于理解每个[x]检查点的验证方式。
2.1 测试入口与执行流程
清单对应的自动化实现是TestWeb函数,位于 tests/web/web_test.go。它通过UserAcceptanceTestSuit依次执行:
func TestWeb(t *testing.T) { UserAcceptanceTestSuit(t, func(_ *testing.T, page *Page) { defer page.Destroy() testLogin(page) testInfoTablePageOperations(page) testNewPageOperations(page) testEditPageOperations(page) testDetailPageOperations(page) testRolePageOperations(page) testPermissionPageOperations(page) testMenuPageOperations(page) testManagerPageOperations(page) testPermission(page) }, startServer, debugMode, optionList...) }执行链路是:启动测试用 go-admin 服务(gin + admin 插件)→ 拉起 ChromeDriver → 打开无头浏览器页面 → 按顺序跑各模块用例 → 关闭窗口与驱动 → 关闭测试服务。
2.2 浏览器驱动与页面封装
驱动与页面操作封装在 tests/web/test.go 与 tests/web/page.go:
- 浏览器驱动:基于
github.com/sclevine/agouti启动 ChromeDriver,默认启用--headless(非本机调试时)、--window-size=1500,900、--incognito等参数;本机调试模式(最后一个命令行参数为true时)则关闭 headless 便于肉眼观察。 - 页面断言封装:
Page结构体提供了Contain(页面 HTML 包含某文本)、NoContain(不包含)、Css(校验 CSS 样式值)、Text(校验元素文本)、Value(校验表单值)、Click(点击并等待)、Fill(填充输入框)、NavigateTo(跳转并等待)等断言方法,所有用例的[x]状态最终都由这些断言给出结论。
2.3 测试服务与数据库准备
测试服务端同样定义在 tests/web/web_test.go:使用engine.Default()加载 admin 插件、注册posts/authors/external三个内置生成器并额外添加user生成器,从 tests/web/config.json 读取数据库配置(默认指向 MySQL 的go-admin-test库),最后监听:9033端口。测试页 URL 统一由http://localhost:9033/admin前缀拼接而成(见 tests/web/test.go)。
与之配套的是 API 层面的黑盒测试: tests/test.go 中的Cleaner会先清空goadmin_users、goadmin_roles、goadmin_permissions、goadmin_menu等内置表并重置自增、灌入 admin/operator 两个预置账号与菜单数据,保证每次测试环境一致;tests/common/common.go 的Test/ExtraTest则通过 httpexpect 对登录、权限、角色、管理员、菜单、操作日志、外部数据源与普通表格接口做 HTTP 级验证。
三、登录与导航栏测试
3.1 登录(3 项)
清单中登录模块包含 3 个检查点:
| 检查点 | 状态 | 源码对应 |
|---|---|---|
| 输入正确的账号密码 | [x] | tests/web/web_test.gotestLogin |
| 输入错误的账号密码 | [ ] | 待补充用例 |
| 带验证码的登录页面正常登录 | [ ] | 依赖验证码插件(plugins/admin/modules/captcha)的接入 |
已完成的“正确账号密码”用例实现为:跳转/admin/login→ 通过 XPath//*[@id="username"]、//*[@id="password"]填充admin/admin→ 点击Login按钮 → 等待 3 秒后断言页面包含main-header(登录成功进入主框架的标志)。错误密码场景可从 tests/test.go 预置的 bcrypt 密码(如$2a$10$TEDU/aUxLkr2wCxGxI62/...)反向构造断言,但尚未写成 UAT 用例。
3.2 导航栏与侧边栏(3 项)
| 检查点 | 状态 | 源码对应 |
|---|---|---|
| 导航栏菜单的显示点击与关闭 | [x] | tests/web/web_test.go 中navLinkBtn/navCloseBtn相关操作(注释状态) |
| 导航栏菜单过长情况的判断 | [ ] | 待补充响应式/溢出场景 |
| 导航栏功能按钮的点击 | [ ] | 待补充 |
侧边栏菜单点击在菜单管理用例中已落地,例如 tests/web/web_test.go 通过sideBarManageDropDown展开侧边栏的 Admin 分组、点击menuPageBtn进入菜单管理页。navLinkBtn与navCloseBtn(顶部导航链接的打开与关闭)的 XPath 常量已定义在 tests/web/web_test.go,对应用例暂时被注释,说明导航链接的“显示-点击-关闭”已具备定位基础但仍待正式启用。
四、表格页面测试(重点覆盖区)
表格页是清单中条目最密集、完成度最高的模块,共分 8 个子类。所有检查点围绕 tests/tables/user.go 的 users 表信息页展开,页面路由为/admin/info/user。
4.1 功能按钮(3 项,全部完成)
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 弹出按钮的点击显示关闭 | [x] | popup按钮(tests/tables/user.go)绑定action.PopUp("/admin/popup", ...)返回<h2>hello world</h2>;用例点击后断言弹层display: block且包含hello world,点关闭后断言display: none(tests/web/web_test.go) |
| Ajax 按钮的点击显示关闭 | [x] | ajax按钮绑定action.Ajax("/admin/ajax", ...)返回Oh li get;用例点击后断言页面包含该文案且告警层可见,点OK后不可见(tests/web/web_test.go) |
| 下拉选择按钮的点击 | [x] | gender下拉(action.FieldFilter("gender")挂接筛选),用例展开后逐项断言men/women文本并选中(tests/web/web_test.go) |
这里体现了 go-admin 表格页三类“动作按钮”的完整形态:弹窗(PopUp)、异步请求(Ajax)、字段筛选(FieldFilter),其定义分别位于 template/types/action/popup.go、template/types/action/ajax.go、template/types/action/fieldfilter.go。
4.2 行更新(2 项)
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 表格项文本更新功能 | [x] | Name字段配置FieldEditAble(editType.Text)(tests/tables/user.go);用例点击单元格 → 填充DukeDukeDuke→ 保存 → 断言表格中出现该文本(tests/web/web_test.go) |
| 表格项选择更新功能 | [ ] | Gender字段已配置FieldEditAble(editType.Switch),切换控件与选项(👦/👧)均已定义,等待补齐“点击选择器并保存”的用例 |
4.3 筛选框(3 项)
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 筛选框显示 | [x] | 用例点击filter-btn后断言.filter-area的display: none(隐藏状态验证),并可直接展开/收起筛选区域(tests/web/web_test.go) |
| 筛选框文本筛选功能 | [x] | Name配置FieldFilterable(FilterOperatorLike)(模糊匹配);用例在筛选输入框填充Jack→ 点击搜索 → 重置(tests/web/web_test.go) |
| 筛选框选择筛选功能 | [ ] | Gender(单选)、Drink(下拉)、Experience(radio)的筛选选项均已配置(tests/tables/user.go),CreatedAt还配置了时间范围筛选form.DatetimeRange,等待对应交互用例 |
筛选框的字段级开关由FieldFilterable系列方法控制,筛选表单布局可通过SetFilterFormLayout(form.LayoutThreeCol)指定(tests/tables/user.go)。
4.4 导出功能(3 项)
| 检查点 | 状态 | 说明 |
|---|---|---|
| 导出按钮,导出当前页 | [x] | users 表配置了Exportable: true;用例点击行选择下拉中的exportBtn并提交(tests/web/web_test.go) |
| 导出按钮,导出全部 | [ ] | 待补充全量导出断言 |
| 导出按钮,导出选择的 | [ ] | 依赖行选择器勾选(rowSelector与列复选框已定义,见 tests/web/web_test.go),待串联导出参数 |
导出接口的 HTTP 层验证已存在:tests/common/normal.go 中POST /export/user返回 200 即为通过。
4.5 列选择(1 项,完成)
列选择按钮显示选择点击[x]:用例点击rowSelector展开列选择菜单,勾选City、Avatar两列后提交,随后断言页面不再包含guangzhou(即该列已被隐藏),验证列显隐切换生效(tests/web/web_test.go)。
4.6 列排序(2 项,完成)
正序[x]、倒序[x]:ID字段配置了FieldSortable()(tests/tables/user.go);用例连续点击idOrderBtn(//*[@id="sort-id"])两次,分别触发正序与倒序切换(tests/web/web_test.go)。排序能力在 tests/tables/posts.go 中同样以FieldSortable()配置。
4.7 列功能按钮(2 项,完成)
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 弹出操作点击显示关闭 | [x] | 行操作Preview绑定action.PopUp("/admin/preview", ...)返回<h2>preview content</h2>;用例展开行下拉 → 点击 Preview → 断言弹层显示并包含preview content→ 关闭(tests/web/web_test.go) |
| Ajax 操作点击显示关闭 | [x] | 行操作Audit绑定action.Ajax("/admin/audit", ...);用例展开行下拉 → 点击 → 断言告警弹层显示 → 关闭(tests/web/web_test.go) |
行级操作按钮通过info.AddActionButton注册(tests/tables/user.go),与顶部功能按钮(info.AddButton)是两套独立的按钮体系。
4.8 按钮的隐藏(10 项,全部未完成)
清单中列出的可隐藏元素包括:筛选框、新建按钮、导出按钮、编辑按钮、删除按钮、详情按钮、筛选按钮、列选择按钮、分页条、查询信息。这些元素在 go-admin 中均有对应的全局开关或字段级配置:
- 新建/编辑/删除/导出按钮对应 tests/tables/user.go 中
table.Config的CanAdd、Editable、Deletable、Exportable四个开关; - 筛选区域由筛选表单控制,可通过字段筛选配置决定筛选项数量;
- 分页条与查询信息由信息面板配置控制。
该项待补充的用例本质上是验证“开关关闭后对应 UI 元素不再渲染”,属于配置驱动型测试。
4.9 列的显示(14 项,全部未完成)
这部分对应 go-admin 表格列的14 种显示类型,均为InfoPanel提供的显示链方法,定义集中位于 template/types/info.go:
| 检查点 | 实现方法(template/types/info.go) | 说明 |
|---|---|---|
| 标签显示 FieldLabel | FieldLabel | 彩色标签,FieldLabelParam支持颜色与类型 |
| 图片显示 FieldImage | FieldImage(width, height, prefix...) | 按宽高渲染图片,可带路径前缀 |
| bool 值显示 FieldBool | FieldBool(flags...) | 按布尔值切换显示 |
| 链接显示 FieldLink | FieldLink(src, openInNewTab...) | 文本渲染为链接,可新窗口打开 |
| 文件大小显示 FieldFileSize | FieldFileSize() | 自动格式化字节为可读大小 |
| 日期显示 FieldDate | FieldDate(format) | 按指定格式格式化日期 |
| icon 显示 FieldIcon | FieldIcon(icons, defaultIcon) | 按值映射图标,带默认图标 |
| 点显示 FieldDot | FieldDot(icons, defaultDot) | 状态点,颜色枚举为 danger/info/primary/success |
| 进度条显示 FieldProgressBar | FieldProgressBar(data...) | 进度条,FieldProgressBarData支持 Style/Size/Max |
| loading 显示 FieldLoading | FieldLoading(data) | 加载动画 |
| 下载链接显示 FieldDownLoadable | FieldDownLoadable(prefix...) | 渲染为可下载链接 |
| 可复制文本显示 FieldCopyable | FieldCopyable(prefix...) | 点击复制,自动注入复制脚本 |
| 图片轮播显示 FieldCarousel | FieldCarousel(fn, size...) | 通过FieldGetImgArrFn返回多图数组轮播 |
| 二维码显示 FieldQrcode | FieldQrcode() | 渲染二维码,自动注入二维码脚本 |
各显示类型的具体渲染实现位于 template/types/display 目录(bool.go、image.go、progressbar.go、qrcode.go、carousel.go、copy.go、date.go、dot.go、downloadable.go、filesize.go、icon.go、label.go、link.go、loading.go)。这些检查点尚未编写 UAT 用例,但其“显示链”机制已经完整,属于测试用例缺口而非功能缺口。
五、表单页面测试
表单页测试对象是 users 表的新建/编辑表单,表单字段配置在 tests/tables/user.go,并按 Tab 分组:input组(文本、数字、URL、邮箱、日期时间、密码、IP、多文件、货币、富文本)与select组(开关、SelectBox、单选、下拉、radio 等),由SetTabGroups/SetTabHeaders控制(tests/tables/user.go)。
5.1 组件显示(15 项)
已完成 4 项:
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 单选的点击显示选择 | [x] | Work Experience字段(form.SelectSingle,tests/tables/user.go);用例展开下拉并断言 two/three/four/five years 四个选项文本(tests/web/web_test.go) |
| 多选的点击显示选择 | [x] | Drink字段(form.Select,选项 Beer/Juice/Water/Red bull,tests/tables/user.go);用例展开多选输入框并逐项断言选项(tests/web/web_test.go) |
| selectbox 的点击显示选择 | [x] | Fruit字段(form.SelectBox,选项 Apple/Banana/Watermelon/Pear,tests/tables/user.go);用例断言左侧未选列表的 Apple/Banana/Watermelon(tests/web/web_test.go) |
| 文本框的输入 | [x] | Name字段(form.Text);通过fillNewForm填充 name/age/password/ip/amount 等(tests/web/web_test.go) |
待完成 11 项:富文本(Content字段form.RichText,带文件上传,tests/tables/user.go)、单/多文件选择(Cert字段form.Multifile,maxFileCount: 10)、时间选择(Birthday字段form.Datetime)、时间选择范围、Array 组件、Table 组件(AddTable定义于 template/types/form.go)、IconPicker(菜单页已用,见 tests/web/web_test.go)、滑动组件、代码组件(form.Code类型判断位于 template/types/form.go)、数字组件(Age字段form.Number)、数字范围组件、自定义字段(CustomContent/CustomJs/CustomCss支持位于 template/types/form.go)。
5.2 按钮显示(3 项,完成)
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 保存错误框显示 | [x] | 空表单直接点击saveBtn,断言页面出现error提示(tests/web/web_test.go) |
| 重设按钮的点击 | [x] | 填充表单后点击resetBtn,验证表单被清空(tests/web/web_test.go) |
| 继续编辑的选择 | [x] | 勾选continueEditCheckBox后保存,页面停留在编辑状态可继续填写(tests/web/web_test.go) |
5.3 联动(6 项,未完成)
联动检查点chooseMapJS、chooseJS、chooseAjax、chooseHideJS、chooseShowJS、chooseDisableJS对应表单字段的联动手法。源码中已有完整示例:
- chooseAjax(异步联动):
Country字段配置FieldOnChooseAjax("city", "/choose/country", ...),选择国家后异步返回城市选项(北京/上海/广州/深圳等,tests/tables/user.go); - chooseJS/chooseMapJS/chooseHideJS/chooseShowJS/chooseDisableJS:对应
template/types/form.go中choose*系列的联动表单配置能力,这些 UI 联动的对应模板位于 template/types/tmpls(choose.tmpl、choose_ajax.tmpl、choose_custom.tmpl、choose_disable.tmpl、choose_hide.tmpl、choose_map.tmpl、choose_show.tmpl)。
上述联动配置能力均已存在,但都还没有对应的浏览器交互用例。
六、详情页与内置管理模块测试
6.1 详情页
清单中“详情页”暂无勾选项,对应的testDetailPageOperations目前是空实现(tests/web/web_test.go),但详情页路由(detailBtn、预览弹层previewPopup)与详情展示的 XPath 均已定义。详情接口的 HTTP 层已由 tests/common/api.go 之外的外部数据源用例部分覆盖(tests/common/external.go 验证/info/external/edit返回 200)。
6.2 权限、角色、管理员的增删改查
清单将权限、角色、管理员三块的“增删改查”整体列出,其中管理员子项有两项已完成:
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 新建管理员 | [x] | testManagerPageOperations中为 operator 新建user_view权限并挂载(tests/web/web_test.go);testPermission中用 operator/admin 登录验证权限生效(tests/web/web_test.go) |
| 新建管理员正常登录 | [x] | 用新建账号执行登录流程并通过页面断言 |
这三块的 CRUD 接口与数据由 tests/common/common.go 中的permissionTest、roleTest、managerTest通过 HTTP 黑盒方式覆盖(权限、角色、管理员、操作日志均在内),而浏览器端用例(testRolePageOperations、testPermissionPageOperations)暂时留空待补。
6.3 菜单的增删改查
菜单模块是 UAT 用例完成度最高的内置管理模块(testMenuPageOperations,tests/web/web_test.go):
| 检查点 | 状态 | 实现细节 |
|---|---|---|
| 新建菜单 | [x] | 选择父级(ROOT/Dashboard/Admin/Users 树形选项断言)、角色(administrator/operator)、IconPicker 选图标,填写Test//info/user后保存 |
| 删除菜单 | [x] | 点击新建的testMenuItem的删除按钮 → 确认弹窗 → 确认 |
| 改变菜单顺序 | [ ]] | 拖拽排序逻辑(MouseToElement+HoldClick)已注释,待启用 |
| 三级菜单的新建与显示 | [ ] | 依赖树形父级选择扩展,待补充 |
菜单编辑用例还验证了headFieldInput(标题)修改并保存后生效(tests/web/web_test.go)。
七、清单状态总结与扩展建议
综合 tests/web/README_CN.md 与源码实现,可以得出如下结论:
- 完成度最高的区域是表格页与表单页的“主交互路径”:弹出/Ajax 按钮、内联文本编辑、筛选、导出、列显隐、列排序、单/多选组件、保存/重设/继续编辑,均有可运行的 agouti 浏览器用例支撑。
- 大量未勾选项并非功能缺失而是用例缺口:14 种列显示类型、15 种表单组件、6 种联动方式在 template/types/info.go 与 template/types/form.go 中均已实现,测试表 tests/tables/user.go 也挂载了相应字段配置,只差对应的浏览器交互断言。
- 按钮隐藏类检查点适合做成配置驱动测试:通过调整 tests/tables/user.go 中
table.Config的CanAdd/Editable/Deletable/Exportable开关,即可断言对应按钮的渲染与隐藏。 - 登录验证码、菜单排序、三级菜单等条目需要依赖验证码插件(plugins/admin/modules/captcha)与树形拖拽的进一步支持,属于待扩展的功能测试范围。
对于希望为 go-admin 补充 UAT 覆盖的开发者,建议的路径是:参照 tests/web/web_test.go 中已有的 XPath 常量与Page断言方法(tests/web/page.go),按清单逐项补齐testDetailPageOperations、testRolePageOperations、testPermissionPageOperations等空实现,并优先处理“列显示”“表单组件”“按钮隐藏”三组高密度检查点,从而让清单整体从“核心交互已覆盖”走向“全功能矩阵覆盖”。
【免费下载链接】go-admin
A golang framework helps gopher to build a data visualization and admin panel in ten minutes
相关推荐
BigBlueButton 发版测试指南:逐功能验收清单与 Playwright 自动化测试实践
BigBlueButton 发版测试指南:逐功能验收清单与 Playwright 自动化测试实践 BigBlueButton 是面向虚拟课堂与在线协作的开源 W
教育音视频后端前端gin-vue-admin测试策略:自动化测试体系
gin vue admin测试策略:自动化测试体系 概述 在现代软件开发中,自动化测试已成为保障代码质量、提升开发效率的关键环节。gin vue admin作为
后端前端认证鉴权低代码任务调度PowerToys Peek 功能验收指南:人工测试清单与自动化 UI 测试的逐项对照
PowerToys Peek 功能验收指南:人工测试清单与自动化 UI 测试的逐项对照 导读 Peek 是 Microsoft PowerToys 中的“文件快
桌面应用开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考