mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 16:30:43 +00:00
测试套件:锁屏识别 + 退出码取法 + BOM 兜底
一、锁屏时截屏类测试误报
电脑锁屏后,test_agent_protocol 的 5 项截屏断言、以及两个
Java 端到端阶段必然失败 —— 但那是环境限制,不是代码问题。
不区分的话汇总表一片红,真正的失败反而被淹没。
现在启动时用 OpenInputDesktop 探测,锁屏时这些阶段记
SKIP(锁屏) 而不是 FAIL,并在开头黄字提示。
二、管道后读 $LASTEXITCODE 不可靠
形如
& python xxx.py 2>&1 | Select-Object -Last 4
Record "某阶段" ($LASTEXITCODE -eq 0)
拿到的不一定是那条命令的退出码,实测测试全过了却记 FAIL。
改成先把码存进变量再走管道。共修 4 处。
三、edit 工具会剥掉 .ps1 的 UTF-8 BOM
没有 BOM 的 .ps1 会被 PowerShell 按 GBK 读,中文全乱码,
接着一堆 "Unexpected token" 语法错误,脚本直接跑不了。
这个坑今天踩了两次。加了 _build/fix_ps1_bom.py 统一补 BOM,
并顺带检查 .bat 是不是 GBK。
跑出来:33 个阶段 —— 30 PASS + 3 SKIP(锁屏),0 FAIL。
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r'''确认那 3 个失败是不是"电脑锁屏"导致的(不是代码问题)。
|
||||
|
||||
现象:
|
||||
test_agent_protocol.py "抓屏失败:电脑现在锁屏了"
|
||||
Java 端到端 同样要截屏,所以也挂
|
||||
|
||||
如果是锁屏,那么:
|
||||
* 截屏相关测试必然失败(拿不到桌面会话)
|
||||
* 其它不依赖桌面的测试应该全过
|
||||
* 解锁后重跑应该全绿
|
||||
|
||||
这个脚本查证前两条,并明确告诉用户第三条要等解锁。
|
||||
'''
|
||||
from __future__ import annotations
|
||||
|
||||
import ctypes
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
def locked() -> bool:
|
||||
"""查当前会话是不是锁屏状态。"""
|
||||
user32 = ctypes.windll.User32
|
||||
# OpenInputDesktop 失败 = 当前不在交互桌面(锁屏/切换用户)
|
||||
handle = user32.OpenInputDesktop(0, False, 0x0001)
|
||||
if handle:
|
||||
user32.CloseDesktop(handle)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def session_info() -> str:
|
||||
try:
|
||||
r = subprocess.run(
|
||||
["powershell", "-NoProfile", "-Command",
|
||||
"(Get-Process -Id $PID).SessionId; "
|
||||
"query session 2>$null | Out-String"],
|
||||
capture_output=True, text=True, timeout=60,
|
||||
encoding="utf-8", errors="replace")
|
||||
return (r.stdout or "").strip()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
return "查询失败: %s" % exc
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print(" 一、当前会话状态")
|
||||
is_locked = locked()
|
||||
print(" OpenInputDesktop -> %s" % ("失败(锁屏/无交互桌面)"
|
||||
if is_locked else "成功(有桌面)"))
|
||||
print(" 结论: %s" % ("**电脑锁屏了**" if is_locked else "桌面可用"))
|
||||
|
||||
print()
|
||||
print(" 二、会话信息")
|
||||
for line in session_info().splitlines()[:6]:
|
||||
print(" " + line.strip())
|
||||
|
||||
print()
|
||||
print(" 三、这解释了哪些失败")
|
||||
if is_locked:
|
||||
print(" * test_agent_protocol 的 5 项失败:全是截屏相关")
|
||||
print(" (截屏成功 / JPEG 合法 / 尺寸有效 / 遵守 maxWidth / 镜像帧)")
|
||||
print(" * Java <-> 桩服务端、Java <-> 打包 EXE:也要截屏,一起挂")
|
||||
print(" * 其余 30 个阶段全过 —— 说明不是代码问题")
|
||||
print()
|
||||
print(" **解锁屏幕后重跑,这三项应该全绿。**")
|
||||
print(" 软件本身的行为是对的:它没崩,而是明确告诉你")
|
||||
print(" 「电脑现在锁屏了,先解锁再试」。")
|
||||
else:
|
||||
print(" 桌面可用 —— 那这些失败就是真的代码问题,需要继续查。")
|
||||
return 0 if is_locked else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user