自动化调研及总结
一、基础知识
1、Python 语言介绍
Python 是一种高级、解释型、通用的编程语言,由Guido van Rossum于1989年发明,以简洁易读著称。
核心特点:
- 语法简洁:使用缩进表示代码块,代码量少,适合自动化小白
- 解释执行:无需编译,逐行运行,便于快速调试
- 动态类型:变量无需声明类型,如
a = 10后可直接a = "hello"
- 丰富的生态:超过20万个第三方库可任意调用
- 跨平台:Windows、Linux、macOS均可运行
自动化测试使用Python 的优势:
- 入门快:测试人员无需深厚编程背景即可上手
- 测试框架成熟:unittest、pytest、Robot Framework等
- 驱动工具支持:Selenium(Web)、Appium(移动端)、Requests(接口)
- 高效编写:用Python 写的测试脚本长度往往是Java的1/3
Python 在自动化测试中的短板与局限性:
- 执行效率较低:用例过多时执行效率低,运行时间上和java有较大差距
- 移动端支持弱:对于底层由java实现的Appium,使用Python可能会出现超时、驱动不稳定问题
- 工程化能力较弱:大型测试框架的工程化能力弱于 Java,Java 的 Spring Boot + TestNG 能构建非常规范的大型测试平台,Python 较少用于此
2、Java 语言介绍
Java 是一种 高级、编译型、面向对象 的编程语言,由 Sun Microsystems 公司于1995年发布,以 "一次编写,到处运行" 的跨平台能力著称。
核心特点:
- 语法严谨:强类型检查,变量必须声明类型,如
int a = 10;不能后续赋值为字符串
- 编译执行:源代码编译为字节码,在 JVM(Java虚拟机)上运行,执行效率高
- 面向对象:强制使用类和对象,代码结构清晰,利于大型项目维护
- 丰富的生态:全球最大的开源社区之一,Maven/Gradle 构建工具成熟
- 跨平台:JVM 支持 Windows、Linux、macOS 等主流操作系统
自动化测试使用 Java 的优势:
- 执行效率高:编译型语言 + JIT(即时编译)技术,运行速度是 Python 的 3-5 倍,适合大规模回归测试
- 强类型检查:编译期发现类型错误,避免运行时崩溃,大型脚本维护更可靠
- 移动端支持成熟:Appium、Android UI Automator 等底层由 Java 实现,兼容性和稳定性更好
- 工程化能力强:Maven/Gradle 统一管理依赖,TestNG/JUnit 与 CI/CD 无缝集成
- 企业级生态完善:Spring Boot 可快速构建测试平台,Allure、ExtentReport 等报告工具支持完善
Java 在自动化测试中的短板与局限性:
- 学习门槛较高:面向对象概念(继承、多态、泛型)、JVM 原理等需要系统学习,上手周期长
- 代码量较大:相同功能的测试脚本,Java 代码量通常是 Python 的 2-3 倍
- 语法不够灵活:需要显式处理异常、定义 getter/setter、编写类型转换等样板代码
- 快速验证能力弱:不支持交互式命令行(REPL),调试小段代码需完整编写 main 方法或借助 IDE
- 启动开销较大:JVM 启动和类加载需要一定时间,对于少量用例的快速反馈场景不如 Python 敏捷
3、总结
项目轻量化、小型灵活的回归测试优先 Python;企业级大规模自动化、移动端测试、性能敏感场景优先 Java。
二、自动化框架介绍
1、Python生态
1.1 Pytest — 接口自动化
用途:通用主流的测试框架,适合接口自动化、单元测试
特点或能力:
- 组织用例方便:简单灵活,能轻松组织自动化测试用例
- 测试范围广:既能做简单的单元测试,也能做复杂的功能测试
- 扩展性强:拥有大量第三方插件,且支持自定义扩展
- 用例状态处理:支持跳过(skip)和失败(fail)测试用例的处理
1.2 Selenium — Web Ui自动化
用途:针对浏览器自动化测试工具
特点或能力:
- 模拟用户:能模拟真实用户操作,包括点击、输入、选择下拉框、鼠标移动、滚动页面等
- 提供多种定位方式:可通过id、name、class、CSS选择器、XPath等8种方式定位页面元素
- 多语言支持:可用Python、Java、C#、JavaScript、Ruby等多种编程语言编写脚本
- 等待机制:显式等待(WebDriverWait)、隐式等待
1.3 pyautogui、pynput — 系统层键鼠控制
用途:用来控制系统层面的键鼠操作
特点或能力:
- PyAutoGui操作模拟:可实现坐标判断、控制键鼠、故障保险时间、以及截图等多种功能
- pynput事件监听:调用pynput库可以监听鼠标、键盘的输入事件
相关知识文档:键鼠控制 | 星期八营业
1.4 Appium — 移动端自动化
用途:跨平台移动端测试框架,可适用于Android、IOS
特点或能力:
- 语法简单:基于 WebDriver 协议,语法与 Selenium 高度相似
- 扩展性强:可适配真机,也可适配模拟器实现手势操作等
相关知识文档:Appium自动化 | 星期八营业
2、Java生态
2.1 TestNG — 接口/单元测试框架
用途:企业级单元测试和接口自动化测试框架,功能全面
特点或能力:
- 注解丰富:提供
@Test、@BeforeMethod、@DataProvider等注解,组织用例清晰
- 数据驱动:通过
@DataProvider实现数据与用例分离,支持从Excel/XML读取数据
- 依赖管理:支持用例间的依赖关系设置(
dependsOnMethods),控制执行顺序
- 报告完善:自动生成HTML测试报告,可与Allure、ExtentReport集成
相关知识文档:TestNG官方文档
2.2 Selenium — Web UI自动化
用途:浏览器自动化测试工具(Java版本)
特点或能力:
- 语法一致:与Python版Selenium API高度一致,降低切换成本
- 页面对象模式:Java的强类型系统非常适合封装Page Object Model
- 执行效率高:Java编译型语言特性,大规模UI用例运行速度明显快于Python
- WebDriverManager:自动管理浏览器驱动版本,无需手动下载配置
- 稳定性更好:企业级长期运行场景下,Java版本的内存管理更成熟
相关知识文档:Selenium Java官方文档
2.3 Appium — 移动端自动化
用途:跨平台移动端测试框架,支持Android/iOS(Java版本)
特点或能力:
- 底层同源:Appium服务端由Java实现,Java客户端兼容性和稳定性最佳
- 驱动管理:支持AndroidDriver、IOSDriver,与Android SDK/iOS工具链集成成熟
- 手势操作:
TouchAction、MultiTouchAction等API完善,模拟双指缩放等复杂手势
- 混合应用支持:WebView切换、上下文管理比Python版更稳定
- 企业级案例多:大型App自动化项目首选Java版本,社区问题解答更丰富
相关知识文档:Appium Java Client
三、自动化测试基础案例
基于智能译制系统自动化测试的可行性分析,现已做两项基础测试
3.1 登录测试
3.1.1 测试内容:模拟用户输入用户名密码,点击登录,并判断是否登录成功
3.1.2 文件用途讲解:

.venv是python的虚拟环境,当然如果不是大数据方向的可以不用管,直接用本地的解释器就好了
allure-results是用来存储测试用例的执行日志的,在之后可以直接生成测试报告,条件是要在测试用例中标注
file是放配置文件的文件夹,现在主要考虑的是一些动态的数据用ini文件管理起来,比如元素的XPATH,token
conftest.py文件是运行前会执行的前置代码,比如数据库连接、浏览器driver等等
- 本次测试要讲解的文件是框起来的这两个
3.1.3 conftest解析
- 首先是设置一些配置项,这一个文件会先于所有文件执行。注意:这是一个固定的文件,用pytest运行时会先读取这一个文件,因此文件名不可被改变
- 启动浏览器这里会直接下载最新的chromedriver文件(前提是谷歌会自动更新,如果不是还需要去下载对应当前谷歌版本的文件下载内容 | ChromeDriver | Chrome for Developers)
- 需要注意给一个隐式等待时间,来让页面完成加载,之后的元素判断中则使用显示等待(可以理解为,如果我需要流程往下走,那就需要隐式等待来让页面完全加载;如果我只想获取后一个元素的值,那就用显示等待,只获取这一个值即可;如果是需要手动操作,则使用强制等待)
- 使用yield可以和return一样返回数据(这里返回的是一个浏览器操作对象),但是不会终止任务,等用例执行完毕之后就会关闭链接
- 不同配置参数的效果差异

3.1.4 login_page解析
- 需要现在页面上找到元素的xpath,可以用开发者工具复制
- 这里的函数主要是描述步骤,比如输入、点击、拖动等,这里的验证码最好是手动拖动,因为有好几种验证码,用代码实现收益不高
- 最后判断是否成功登录用的是系统右上角显示的第一个字
3.1.5 test_login解析
- 这里就是测试用例了,用例规范是:文件和函数都要以test开头
- 每一个函数是一条测试用例,测试用例的的定义是执行步骤或者是数据校验
- 这里的装饰器allure就是执行日志了,运行时会写入json文件并保存到指定文件夹中
- assert断言的作用是判断这一条用例是否通过,语法是:
assert 条件, "失败时显示的提示信息"
- driver来源于conftest中yield返回的实例化对象
3.1.6 执行
3.2 接口测试
3.2.1 测试内容:登录译制系统后,检查首页的进行中、待处理、已逾期的任务数是否正确
3.2.2 文件用途讲解
主要用到框起来的这三个文件

3.2.3 config.ini讲解
- 这里是直接手动获取的token数据,必须要的有四个字段:Authorization、Orgcode、Userid、Usersingledevice
3.2.4 index_page讲解
- 这个文件就是做请求和数据处理的,全部放在测试用例里的话也可以 只是会显得比较长;看个人习惯
- 关键点是在设置请求头这里带入token数据就可以跳过登录直接请求接口
3.2.5 test_index解析
- url也可以用配置文件管理起来,这样方便后期管理,这里制作测试演示
- 在这里调用请求,获取到的数据与数据库中的数据进行比较
- 如果要链接数据库,流程是在conftest中配置数据库连接并yield一个实例化对象到test_index中,就可以查询了
3.2.6 执行
四、相关技术方案
4.1 验证码滑块
- 先读取并保存验证码底图和滑块图
- 转换成灰度图,调用多尺度匹配方法计算相似度
- 记录最高分位的坐标
- 计算拖动距离
不一定识别得出来或者说识别准确度待优化,循环验证?提升识别方法?目前来看第一个更容易实现
4.2 快速开发与调试—jupyter notebook
这个工具的好处是:
- 便捷,如果只做调试用可以只安装jupyter库,
pip install jupyter
- 使用上可以让代码单行执行但不结束本次运行;例如创建了数据库链接后不用关闭(在结束调试时执行关闭即可)、使用selenium打开浏览器时可以逐步调试
4.3 错词处理
还没有想好怎么优雅的处理错词,现在最简单的想法是,把所有的字幕都替换成同样的维语
如果后面完成度检测那里还有错词,就先把那一行字幕替换成1
4.4 翻译模型的选择
这两个有个不好弄的点是如果选中了模型四模型五,就会出现等待时间很长的问题
备注:进入测试前先配置好
五、项目备注
5.1 conftest.py
driver()类,这个类用于创建浏览器连接,保证在所有代码前运行
config()类,这个类用于读取配置文件中的内容
fullpage_screenshot、pytest_sessionstart、manage_driver、pytest_runtest_makereport这四个是运行失败时会自动截图并添加到allure中,做了下适配,如果当前并非全屏,会根据当前浏览器类型调用不同的截图方法,但最好是使用谷歌浏览器哈
- 注意:如果文件名不是
test_*.py或者*_test.py,就不会被归纳到测试文件中并注入,因此无法在py文件中直接的调用fixture类。如果想要调用,可以通过在测试文件中将fixture作为参数传入其他非测试类
5.2 文件夹介绍
page文件夹是对页面数据或者逻辑的处理,比如在输入框中输入数据、滑动验证码、点击确定以及成功校验
testcases是编写测试文件以及运行测试文件的目录,需要注意命名规范,主要编写方法是按日常操作的流程来,关键节点断言用例是否通过
jupyter是用来做调试的,这个工具在开发或是调试中能提供极大的帮助,特别是针对流程比较长的场景
img这个文件夹存放过程性图片fail_pic存放运行失败截图slide存放验证码图片
utils这一个文件夹中放着一些接口和脚本config_util.py配置文件读取解耦方法,如果不想使用conftest读取配置文件可以使用这个接口decorators.py装饰器delete_run_result.py删除运行结果文件夹,需要传入element_select.py元素查询,如果你想将element防入配置文件中读取出来,可以试试这个方法,具体配置文件的格式需要看config.yaml中的示例log_util.py日志的输出与保存login_page.py登录逻辑,独立出来是为了放到conftest.py中的driver调用opencv_photo.py登录验证码拖动距离识别
logs日志文件夹,每次运行会生成一个log文件
allure运行记录,可以用来生成测试报告,每次运行会生词一个文件夹,文件夹内是本次的运行数据
config存放配置文件
5.3 日志
- 第一个日志是log文件夹中记录的,这里面是每次运行都会新建一个日志文件,记录控制台的输出,因此,如果不熟悉日志操作的话可以直接在代码中写
print打印,打印的内容也会记录到日志中
- 第二个日志是allure,严格来说这个是用来生成测试报告的,但需要写在代码里,具体的格式详见:allure | 星期八营业
- 用例执行失败的日志会被记录成error,判断逻辑是是否截图,触发截图就会保存写入失败的日志
- 常用方法
- 日志等级,Logger只会处理大于等于设定等级的日志信息,默认Logger等级是WARNING
备注-日志操作:
等级 | 数值 | 说明 | 使用场景 |
DEBUG | 10 | 调试细节 | 开发阶段,详细追踪问题 |
INFO | 20 | 普通流程信息 | 常规操作,程序运行状态 |
WARNING | 30 | 警告(程序还能跑,但可能出问题) | 需要注意但不是错误的情况 |
ERROR | 40 | 错误(程序某些功能无法继续) | 运行出错,但不会导致崩溃 |
CRITICAL | 50 | 严重错误(整个程序可能崩掉) | 紧急情况,程序无法继续运行 |
5.4 运行
- 直接运行main文件即可
- 详细运行参数最好在
pytest.ini中配置,在main中配置参数的话会新增/更新文件中配置的参数
- 所有的文件夹放在
main.py中创建以保证文件名统一,并且需要添加文件夹/文件路径到环境变量中,方便后续的调用
5.5 停止运行
pytest运行过程中触发停止运行的信号,但要注意:触发时不要捕获异常
5.6 超时处理
如果元素获取超时了会弹出异常,但如果每一个元素获取都加try-except会显得很冗余,这里提供装饰器的方法,可以防止运行记录很冗余,提升日志可读性
5.7 测试前配置
这一个逻辑是必须要执行完成的,并且如果权限被改变了,需要测试终止并重新运行才行
5.8 用例执行顺序
5.9 执行失败跳过
设置了文件中如果有一条用例失败后就会跳过这个文件,主要是这个流程有点长,不跳过的话可能会一直错下去,最好是人工检查下错误原因。
这样做会引发其他限制:内存集合在不同进程之间不共享,所以不能使用多进程,普通串行是可以的
现在的实现范围是全局文件,先这样写着,如果后面只想作用于部分文件,可以修改conftest文件中的skip_rest_tests_in_failed_file函数的范围
六、tips
1、循环读取某一个有序列表
2、条件输出
这是个纯野路子写法,如果后一个输出语句需要依赖两个条件,想减少代码量的话可以试试这个:
3、引用格式相同的xpath
4、强制等待
如果遇到调试时无异常,但整和到pytest中运行失败、元素定位异常、数据计算错误等情况,大概率是代码的运行速度远大于了页面的响应速度,并且元素一直存在,导致显示等待并无实际作用。最简单有效的解决方法是给每一个模拟操作加一个强制等待
time.sleep(2) 这里的时间随意,不宜太长或太短,0.5-2s均可。再一个事情是selenium的显示等待,默认是每0.5s查询一次元素是否存在,如果元素显现的时间太短,强制等待的时间最好是设置为0.5s

5、强制元素可见
有时候会遇到:打开F12可以看到元素,但是调用时又不可用,此时可以强制将元素可见,示例代码:
注意:不是所有情况都可用,具体要改什么参数要看页面情况,不确定可以找一下前端同学或者AI同学
6、区域测试
用于某个用例的单独运行测试,需要在测试用例执行时给run_data字段赋值,当前只有这些,后续继续补充
7、打开新页面
如果打开了新页面需要做聚焦,聚焦到新页面才可继续操作,若想返回主页面可以用定位的方法,定位到主页面切换即可
8、表格内容读取
因为页面的表格格式设计都差不多,所以集成了一套方案
使用示例:
注意:存在局限性,如果聚焦在输入框上,点击需要触发两次才能生效,第一次点击是聚焦到页面,第二次点击才是触发按钮
9、数据查找(hover按钮)
如果遇到按钮需要hover调试,可以选择保存整个页面,也可以选择在浏览器上调试
方法一:
保存页面的方式如下:
保存后切记要美化一下页面,不然找不到
方法二:
页面调试,F12-找到element,打开hover状态

方法三:
借助ai,将页面代码和要查找的数据发给ai查找。但效率低,准确度不高
上一篇
allure
下一篇
大模型试用后综合报告
Loading...