JDK javax.accessibility 手动测试套件:环境配置、jtreg 执行与人工验证流程
发布时间:2026/9/13 17:35:47 作者:尧图编辑部 阅读量:1,286

JDK javax.accessibility 手动测试套件环境配置、jtreg 执行与人工验证流程【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk本文围绕 OpenJDK 仓库中的 test/jdk/javax/accessibility/manual/README.md 展开讲解 JDKjavax.accessibility手动测试套件manual test suite的完整使用方法如何配置 SwingSet2 与被测辅助功能框架JAWS、NVDA、VoiceOver、如何用 jtreg 发起测试运行、如何在测试 UI 中完成“通过/失败”判定并自动留存失败截图。结合 ManualTestFrame.java 等框架源码你将理解该套件的交互流程、超时机制、截图采集与结果保存的底层实现。手动测试套件是什么javax.accessibility包定义了 AWT/Swing 组件暴露给辅助技术屏幕阅读器、放大镜等的AccessibleContext接口。由于“屏幕阅读器是否正确朗读按钮焦点状态”这类行为无法断言式自动化JDK 为此提供了一套人工操作验证的手动测试套件位于 test/jdk/javax/accessibility/manual/ 目录。该目录下每个测试均带有 jtreg 元数据标签例如 ButtonDemo.java/* test key headful summary manual test for accessibility button demo run main/manual SwingSetTest ButtonDemo */三个要点key headful测试需要图形界面有头模式不能在没有显示器的环境运行main/manualmanual表示人工执行的运行模式jtreg 会将其标记为人工测试多数 Swing 演示测试通过统一的SwingSetTest入口执行参数为演示名如ButtonDemo、TreeDemo。套件中的测试包括测试说明DemoSelection.java验证 SwingSet2 演示项的键盘选择ButtonDemo.java按钮、单选按钮、复选框的可访问性ComboBoxDemo.java组合框可访问性OptionPaneDemo.java选项对话框可访问性SliderDemo.java滑块可访问性TableDemo.java表格可访问性TabsDemo.java选项卡页可访问性TreeDemo.java树组件可访问性TestJProgressBarAccessibility.java独立实现的 JProgressBar 进度条朗读测试每个演示测试都有一个同名.html文件如 ButtonDemo.html其中包含“步骤/场景Scenario 预期结果Expected Result”表格由测试框架加载并展示给测试执行者。TEST.properties 声明该测试族依赖java.desktop模块modulesjava.desktop环境配置SwingSet2SwingSet2 是 JDK 自带的 Swing 组件演示工具其源码位于 src/demo/share/jfc/SwingSet2/SwingSet2.java构建后打包为SwingSet2.jar。测试执行者需要准备一个合适的 JDK 版本demo 目录下自带或独立的 jar。SwingSetTest.java 的 jar 定位逻辑默认位置被测 JDK/demo/jfc/SwingSet2/SwingSet2.jar源码中拼接为System.getProperty(java.home) /demo/jfc/SwingSet2/SwingSet2.jar覆盖机制设置环境变量SWINGSET2_JAR指向任意 jar 文件即可替换默认位置。辅助功能框架按 README 说明测试可以不启动任何辅助功能框架直接进行仅做视觉验证也可以配合以下框架做朗读验证WindowsJAWSNVDAMac OS XVoiceOver框架的选择只影响验证手段听朗读还是看焦点不影响测试流程本身。用 jtreg 执行测试README 给出的执行要点如需要先启动相应的辅助功能框架SwingSet2 jar 的默认位置为tested jdk/demo/jfc/SwingSet2/SwingSet2.jar使用SWINGSET2_JAR环境变量覆盖 jar 位置jtreg ... -e:SWINGSET2_JARfile location -m .../javax/accessibility/manual/...其中-e:VARvalue是向测试进程注入环境变量的 jtreg 语法.../javax/accessibility/manual/...对应本仓库的 test/jdk/javax/accessibility/manual/ 目录。落到具体路径等价于jtreg -a -e:SWINGSET2_JAR/path/to/SwingSet2.jar \ test/jdk/javax/accessibility/manual/...注意SwingSetTest启动时还会打印TEST_IMAGE_DIR环境变量System.getenv(TEST_IMAGE_DIR)这是 jtreg 运行时提供的测试工作目录标记便于定位测试产物。测试交互流程双窗口 UI测试启动后会出现两个窗口测试框架窗口与SwingSet2 窗口或测试自定义窗口。测试框架窗口的标题即测试名内部包含该测试的详细操作说明。SwingSetTest通过ManualTestFrame.showUI(args[0], Wait for SwingSet2 to load, follow the instructions, select pass or fail. Do not close windows manually., instructions)创建框架窗口并加载args[0] .html作为说明页。判定通过的流程按 HTML 说明逐步操作被测 UI键盘导航、空格触发等若一切符合预期点击Pass该测试的 UI 随即关闭测试记录为通过。判定失败的流程若行为与说明不符点击Fail——框架窗口自动展开失败信息区JSplitPane分隔线移动到 0.5并自动截取当前全屏截图同时焦点跳到“失败原因”输入框在输入框中填写问题描述描述为空时 Fail 按钮保持禁用见下文源码分析必要时重新截图若失败状态需要与被测 UI 交互才能呈现如在 SwingSet2 窗口中复现直接点击Retake screenshot若失败状态需要 UI 处于“占用”状态如模态对话框已打开、菜单已展开使得无法操作框架窗口先在延迟输入框填入秒数点击Retake screenshot然后去布置被测 UI 的目标状态等待倒计时结束自动完成截图再次点击Fail确认框架将截图与描述保存下来供后续分析测试窗口关闭。两条重要约束README 原文强调不要手动关闭任何窗口——所有窗口会在测试判定为通过或失败后统一关闭框架窗口设置了DO_NOTHING_ON_CLOSE见源码整个测试框架 UI全程支持键盘导航。源码级实现分析结果模型TestResultTestResult.java 是最终结果载体包含四个字段status是否通过、failureDescription失败描述、screenCaptureBufferedImage截图、exception异常。三种构造对应三种情形异常失败、用户判定失败、通过。双次 Fail 确认alreadyFailed 状态机ManualTestFrame.java 中用一个alreadyFailed标志区分 Fail 按钮的两次点击passFail[0] new PassFailPane((status) - { if (status) { listener.accept(new TestResult()); dispose(); } else { if (!alreadyFailed) { alreadyFailed true; split.setDividerLocation(.5); failureInfoPane.setVisible(true); pack(); image.capture(); // 第一次点 Fail展开面板并自动截图 failureReason.requestFocus(); statusLabel.setText(Enter failure reason, re-take screenshot, push \Fail\); } else { listener.accept(new TestResult(failureReason.getReason(), image.getImage())); dispose(); // 第二次点 Fail提交结果并关闭 } } });第一次点击 Fail 只展开failureInfoPane由FailureReasonPaneScreenImagePane以GridLayout(1,2)组成并触发首次截图只有填写原因后第二次点击才真正提交结果。PassFailPane.java 的按钮在任意一次点击后会disableButtons()防止重复触发FailureReasonPane.java 通过DocumentListener监听输入内容回调passFail[0].setFailEnabled(!reason.isEmpty())——这就是“描述为空时 Fail 被禁用”的实现。延迟截图ScreenImagePaneScreenImagePane.java 实现 README 中“进入延迟秒数 → 布置 UI → 等待自动截图”的流程构造函数读取Toolkit.getDefaultToolkit().getScreenSize()将screenRect设为整个屏幕区域提供JFormattedTextField延迟输入默认 0与 “Retake screenshot” 按钮capture()在独立线程中执行若延迟大于 0逐秒递减并更新标签 “Retaking screenshot in N seconds”给操作者留出布置 UI 的时间随后调用new Robot().createScreenCapture(screenRect)完成全屏截图按面板尺寸等比缩放SCALE_FAST后以ImageIcon展示预览原始BufferedImage存入AtomicReference随TestResult一并提交。阻塞与超时CountDownLatch timeout 系统属性ManualTestFrame.showUI(...)返回的SupplierTestResult会阻塞 jtreg 测试线程直到用户在 UI 上做出判定int timeout Integer.getInteger(timeout, 10); if (!latch.await(timeout, TimeUnit.MINUTES)) { throw new RuntimeException(Timeout : User failed to take decision on the test result.); }即等待上限由系统属性timeout控制默认 10 分钟单位分钟超时或线程被中断时分别抛出运行时异常或返回异常型TestResult测试记为失败。失败产物的保存handleResultManualTestFrame.handleResult(result, testName)负责把结果落盘并决定测试成败失败描述打印到System.err若存在截图以 PNG 写入${test.classes}/${testName}.pngSystem.getProperty(test.classes) separator testName .png即截图保存在 jtreg 为该测试分配的输出目录下文件名与测试类同名TestResult携带异常时包装抛出用户判定失败时抛出Test failed!无结果时抛出No result returned!。SwingSet2 的启动方式URLClassLoader 反射SwingSetTest.java 并非把 SwingSet2 作为依赖编译进来而是在运行时动态加载String swingSetJar System.getenv(SWINGSET2_JAR); if (swingSetJar null) { swingSetJar file:// System.getProperty(java.home) separator demo separator jfc separator SwingSet2 separator SwingSet2.jar; } System.out.println(Loading SwingSet2 from swingSetJar); ClassLoader ss new URLClassLoader(new URL[]{new URL(swingSetJar)}); ss.loadClass(SwingSet2).getMethod(main, String[].class).invoke(null, (Object)new String[0]);这解释了 README 中两条规则的原理SWINGSET2_JAR环境变量在类加载器构造前被读取缺省时回落到被测 JDK 的 demo 目录。之后resultSupplier.get()阻塞等待人工判定再交由handleResult收尾。独立实现的 TestJProgressBarAccessibility.java 则展示了不依赖 SwingSet2 的手动测试写法自行构建JFrameJProgressBar点击鼠标在 0–100 间循环取值在指令文本中要求“鼠标移入进度条时验证 VoiceOver 是否朗读数值 / 放大镜是否显示放大值”然后复用ManualTestFrame收集人工判定结果。实操要点小结事项说明运行模式run main/manualkey headful必须有图形界面SwingSet2 定位默认java.home/demo/jfc/SwingSet2/SwingSet2.jar可用SWINGSET2_JAR环境变量覆盖注入环境变量jtreg 使用-e:SWINGSET2_JARpath语法判定等待默认 10 分钟超时可用系统属性timeout分钟调整失败证据自动全屏截图可填延迟秒数重拍最终以testName.png存入test.classes目录窗口管理禁止手动关窗框架窗口在测试结束后统一关闭辅助框架Windows 可选 JAWS/NVDAmacOS 可选 VoiceOver也可不启动框架直接执行键盘支持框架 UI 全程支持键盘导航通过本文的说明与源码对照你可以独立运行 JDK 可访问性手动测试套件、正确产出可追溯的失败证据描述 截图并能基于ManualTestFrame/TestResult这套轻量框架为其他需要人工验证的 UI 行为编写类似的手动测试。【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考