ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PyAutoGUI 单元测试指南:测试覆盖范围、运行方式与平台兼容性

PyAutoGUI 单元测试指南:测试覆盖范围、运行方式与平台兼容性 PyAutoGUI 单元测试指南测试覆盖范围、运行方式与平台兼容性【免费下载链接】pyautoguiA cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse keyboard.项目地址: https://gitcode.com/gh_mirrors/py/pyautogui本指南以仓库 docs/tests.rst 为核心系统梳理 PyAutoGUI 官方单元测试所覆盖的核心 API、测试脚本的实际组织方式、在 Windows / OS X / Raspberry Pi 等平台上的兼容性边界并结合 tests/test_pyautogui.py 与 tox.ini 给出可直接复用的运行方法与底层实现佐证。读完本文你将掌握 PyAutoGUI 测试套件能验证什么、不能验证什么以及如何在目标平台上正确跑通测试。测试覆盖范围七个核心 APIPyAutoGUI 的单元测试目前并不全面文档原文即如此说明它们集中在basicTests.py这一测试脚本中主要覆盖以下七个功能点被测 API类别测试要点onScreen()屏幕查询坐标是否落在主屏幕范围内以及异常参数处理size()屏幕查询返回的宽高是否为大于 0 的整数position()鼠标状态返回当前光标坐标及 x/y 参数覆盖返回值的行为moveTo()鼠标控制绝对移动、列表/元组/序列参数、带 duration 的平滑移动moveRel()鼠标控制相对移动上下左右四个方向与序列参数typewrite()键盘控制逐字符键入、列表参数、interval 间隔、编辑键PAUSE全局配置每次公共函数调用后的暂停时长是否生效对照当前仓库实际测试脚本名为 tests/test_pyautogui.py即文档中所说的basicTests.py的现役版本。其覆盖范围与文档描述基本一致并在此基础上做了明显扩展除了文档列出的 7 项还包含了_normalizeXYArgs参数规范化、scroll/hscroll/vscroll滚动、press/hold键盘操作、hotkey快捷键、_getNumberToken等命令行 token 解析、failsafe 紧急退出机制以及 PyScreeze 截图定位函数locate/locateOnScreen/locateCenterOnScreen等测试类。因此可以把文档中的 7 项视为测试套件的基线覆盖而当前仓库的实际测试范围已超出该基线。测试类与用例的对应关系从源码结构看tests/test_pyautogui.py 按unittest风格把用例组织为多个测试类文档列出的每一项都有对应实现TestGeneral.test_size断言pyautogui.size()返回的宽高均为int且大于 0TestGeneral.test_position验证position(x, None)与position(None, y)时传入的参数会覆盖对应维度的返回值TestGeneral.test_onScreen构造屏幕内/屏幕外的多组坐标点含P(0,0)、屏幕中心、四角邻域等验证返回True/False同时断言传入[0, 0], 0这类非法参数会抛出PyAutoGUIExceptionTestGeneral.test_pause把PAUSE设为 0.35 秒后连续执行三次鼠标移动测量总耗时应落在 1.01.1 秒区间从而验证每次调用后都会暂停TestMouse.test_moveTo与TestMouse.test_moveRel先移动到屏幕中心再执行绝对/相对位移并比对position()结果两者都覆盖了列表、元组、序列对象三种传参方式以及带duration、tween的平滑移动TestKeyboard.test_typewrite系列通过后台线程调用typewrite再在前台用input()接收键入内容并断言相等覆盖普通字符串、列表参数、全部可打印 ASCII 字符码点 32126、interval间隔、退格/方向键/Del/Home/End 等编辑键。值得注意的是测试文件顶部明确标注了一条 TODOclick 相关的功能目前大多未被测试# TODO - note that currently most of the click-related functionality is not tested.。因此文档所述测试不全面并非谦虚之辞click、rightClick、doubleClick、dragTo等高频鼠标操作目前主要依赖手动验证。测试前置依赖运行测试前需要安装必要依赖。tests/test_pyautogui.py 在导入阶段就做了硬性校验缺少pytweening或pyscreeze会直接assert False并提示安装命令try: import pytweening except: assert False, The PyTweening module must be installed to complete the tests: pip install pytweening try: import pyscreeze except: assert False, The PyScreeze module must be installed to complete the tests: pip install pyscreeze这两个模块的职责分别是pytweening提供鼠标移动的缓动tween函数pyscreeze提供截图与图像定位能力。此外tox.ini 的deps段还列出了pymsgbox、pillow、pytest等依赖可据此一次性补齐[testenv] deps pymsgbox pillow pytest pytweening pyscreeze由于键盘测试会真实地向系统注入按键事件测试文件还特别提醒运行键盘测试时承载脚本的终端窗口必须处于前台焦点且不能作为计划任务或远程任务运行见TestKeyboard的类注释。运行测试的方法方式一直接运行测试脚本在仓库根目录执行python tests/test_pyautogui.py脚本入口为if __name__ __main__: unittest.main()会依次执行上述全部测试类。测试脚本开头会先把当前工作目录切换到tests/目录os.chdir(scriptFolder)以便正确引用同目录下的测试图片资源100x100blueimage.png、100x100redimage.png等。方式二通过 tox 批量验证仓库提供了 tox.ini 配置用于在多个 Python 版本的独立虚拟环境中重复跑测试。先安装 tox再在仓库根目录执行pip install tox toxtox 会按envlist依次创建py27, py31, py32, py33, py34, py35, py36, py37共 8 个环境每个环境执行python tests/test_pyautogui.py。这是验证多版本 Python 兼容性最直接的手段。运行时的注意事项failsafe 干扰多个测试类的setUp都会先pyautogui.FAILSAFE False并把鼠标移到(42, 42)避免把光标意外移动到屏幕角落触发FailSafeException测试结束再在tearDown恢复原值。因此测试期间不要手动把鼠标甩到屏幕四角人为干扰TestMouse类注释明确警告——测试过程中用户移动鼠标会导致用例失败NOTE - The user moving the mouse during many of these tests will cause them to fail.键盘焦点键盘相关用例依赖前台终端接收输入跑测试前请先点击终端窗口获得焦点。测试覆盖的平台文档列出的已测试平台如下Python 版本3.4、3.3、3.2、3.1、2.7、2.6、2.5操作系统Windows、OS X、Raspberry Pi这与 tox.ini 的envlist py27, py31, py32, py33, py34, py35, py36, py37基本对应tox 配置还额外覆盖了 3.53.7。若你在其他平台成功跑通了单元测试文档欢迎将结果反馈给维护者alinventwithpython.com。版本兼容性边界PyAutoGUI 不兼容 Python 2.4 及更早版本。测试代码也印证了这一点脚本顶部from collections import namedtuple并注释Added in Python 2.6namedtuple 自 Python 2.6 起加入标准库同时通过sys.version_info[0] 2分支为 Python 2 选择raw_input替代input——这些兼容层设计决定了测试基线至少是 Python 2.6Linux 环境限制键盘相关函数在Windows 上的 VirtualBox 虚拟机内运行 Ubuntu时无法正常工作。这与 PyAutoGUI 在不同平台使用不同后端实现有关——仓库内_pyautogui_x11.py、_pyautogui_win.py、_pyautogui_osx.py分别对应 X11Linux、Windows、macOS 的底层事件注入实现虚拟机环境下键盘事件的注入路径往往不完整从而导致键击丢失。底层实现佐证被测试的函数在源码中的定义为了让读者理解测试断言背后的真实语义下面列出文档中 7 个核心 API 在 pyautogui/init.py 中的实现要点position(xNone, yNone)pyautogui/init.py调用平台模块的_position()取得当前光标坐标若传入x/y参数则覆盖返回值对应维度——这正是test_position中断言传 x 后 x 不变、y 变化的依据size()pyautogui/init.py返回Size(*platformModule._size())命名元组即屏幕宽高resolution是它的别名onScreen(x, yNone)pyautogui/init.py先把参数经_normalizeXYArgs规范化为坐标再判断0 x width and 0 y height。文档/源码注释明确提示该函数不适用于副屏幕secondary screensmoveTo(x, y, duration0.0, tweenlinear, ...)pyautogui/init.py坐标参数None时使用当前鼠标位置浮点会向下取整越界坐标被钳制到屏幕边缘duration0时瞬间移动否则按tween缓动函数在duration秒内插值移动moveRel(xOffset, yOffset, duration0.0, tweenlinear, ...)pyautogui/init.py相对当前光标位置移动move是它的 1.0 版本别名两者最终都汇入内部函数_mouseMoveDragtypewrite(message, interval0.0, ...)pyautogui/init.py对message逐字符调用press(c, _pauseFalse)每个字符之间time.sleep(interval)并在循环中执行failSafeCheck()message可以是字符串或按键名列表write是它的 1.0 版本别名PAUSE全局变量pyautogui/init.py默认0.1秒公共函数通过_genericPyAutoGUIChecks装饰器在调用结束后触发_handlePause睡眠——这正是test_pause能通过耗时测量验证 PAUSE 生效的机制。测试设计的局限与注意事项点击类功能缺测如前所述click 系列是当前测试套件的明确空白属于已知的 TODO 项键盘测试是半自动化typewrite/press/hold用例依赖前台终端交互input()接收键入内容无法在无头或后台环境运行截图定位测试对环境敏感TestPyScreezeFunctions断言locateOnScreen(100x100blueimage.png)应抛出ImageNotFoundException但测试注释特别警告——如果屏幕上恰好有蓝色方块可见该用例会失败failsafe 测试会真实移动鼠标TestFailSafe会主动把鼠标移动到屏幕四角的FAILSAFE_POINTS验证只有人类把鼠标移到角落才会触发FailSafeException而程序自身的moveTo不会触发测试期间请勿抢占鼠标。小结PyAutoGUI 的单元测试虽然规模有限但围绕屏幕查询、鼠标移动、键盘键入与全局暂停这四个维度建立了可自动化的基线保障并辅以 failsafe、参数规范化、token 解析等扩展覆盖。理解这份测试套件既能帮你快速验证 PyAutoGUI 在目标平台Windows / OS X / Raspberry Pi和 Python 版本上的可用性也能让你清楚知道 click 等尚未覆盖的功能需要自行补充回归验证。运行前请确保依赖齐备、终端获得焦点并避免在测试过程中触碰鼠标。【免费下载链接】pyautoguiA cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse keyboard.项目地址: https://gitcode.com/gh_mirrors/py/pyautogui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表