自动化调研及总结

一、基础知识

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 高度相似
  • 扩展性强:可适配真机,也可适配模拟器实现手势操作等

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工具链集成成熟
  • 手势操作TouchActionMultiTouchAction 等API完善,模拟双指缩放等复杂手势
  • 混合应用支持:WebView切换、上下文管理比Python版更稳定
  • 企业级案例多:大型App自动化项目首选Java版本,社区问题解答更丰富
相关知识文档Appium Java Client

三、自动化测试基础案例

基于智能译制系统自动化测试的可行性分析,现已做两项基础测试

3.1 登录测试

3.1.1 测试内容:模拟用户输入用户名密码,点击登录,并判断是否登录成功
3.1.2 文件用途讲解
notion image
  • .venv是python的虚拟环境,当然如果不是大数据方向的可以不用管,直接用本地的解释器就好了
  • allure-results 是用来存储测试用例的执行日志的,在之后可以直接生成测试报告,条件是要在测试用例中标注
  • file 是放配置文件的文件夹,现在主要考虑的是一些动态的数据用ini文件管理起来,比如元素的XPATH,token
  • conftest.py 文件是运行前会执行的前置代码,比如数据库连接、浏览器driver等等
  • 本次测试要讲解的文件是框起来的这两个
3.1.3 conftest解析
  • 首先是设置一些配置项,这一个文件会先于所有文件执行。注意:这是一个固定的文件,用pytest运行时会先读取这一个文件,因此文件名不可被改变
  • 需要注意给一个隐式等待时间,来让页面完成加载,之后的元素判断中则使用显示等待(可以理解为,如果我需要流程往下走,那就需要隐式等待来让页面完全加载;如果我只想获取后一个元素的值,那就用显示等待,只获取这一个值即可;如果是需要手动操作,则使用强制等待)
  • 使用yield可以和return一样返回数据(这里返回的是一个浏览器操作对象),但是不会终止任务,等用例执行完毕之后就会关闭链接
  • 不同配置参数的效果差异
    • notion image
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 文件用途讲解
主要用到框起来的这三个文件
notion image
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_screenshotpytest_sessionstartmanage_driverpytest_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运行过程中触发停止运行的信号,但要注意:触发时不要捕获异常
notion image
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
notion image
5、强制元素可见
有时候会遇到:打开F12可以看到元素,但是调用时又不可用,此时可以强制将元素可见,示例代码:
注意:不是所有情况都可用,具体要改什么参数要看页面情况,不确定可以找一下前端同学或者AI同学
6、区域测试
用于某个用例的单独运行测试,需要在测试用例执行时给run_data字段赋值,当前只有这些,后续继续补充
7、打开新页面
如果打开了新页面需要做聚焦,聚焦到新页面才可继续操作,若想返回主页面可以用定位的方法,定位到主页面切换即可
8、表格内容读取
因为页面的表格格式设计都差不多,所以集成了一套方案
使用示例:
注意:存在局限性,如果聚焦在输入框上,点击需要触发两次才能生效,第一次点击是聚焦到页面,第二次点击才是触发按钮
9、数据查找(hover按钮)
如果遇到按钮需要hover调试,可以选择保存整个页面,也可以选择在浏览器上调试
方法一:
保存页面的方式如下:
保存后切记要美化一下页面,不然找不到
方法二: 页面调试,F12-找到element,打开hover状态
notion image
方法三: 借助ai,将页面代码和要查找的数据发给ai查找。但效率低,准确度不高
 
上一篇
allure
下一篇
大模型试用后综合报告
Loading...