Gone框架模块化改造之路

🚀 发现 gone-io/gone:一个优雅的 Go 依赖注入框架!💻 它让您的代码更简洁、更易测试。🔍 框架轻量却功能强大,完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目,请给我们点个星!🌟 您的支持是我们前进的动力!🤝 欢迎贡献代码或提出建议,一起让 gone 变得更好!👨‍💻 #golang #依赖注入 #开源 👉github.com/gone-io/gone
本文原地址:https://github.com/gone-io/goner/blob/main/docs/modules_update.md

一、改造背景

1. Gone框架的定位

Gone框架是一个轻量级的依赖注入框架,它通过简洁的API和注解式依赖声明,帮助开发者轻松构建模块化、可测试的应用程序。作为一个轻量级框架,Gone坚持"小而美"的设计理念,只提供必要的核心功能,避免过度臃肿。

2. 可插拔组件的设计

Gone框架提供了一系列可插拔的组件(称为Goner),涵盖了Web开发、数据库访问、配置管理、日志记录等多个方面:

  • gin:Web框架集成
  • gorm:ORM框架集成
  • viper:配置管理
  • redis:缓存服务
  • grpc:RPC服务
  • apollo/nacos:配置中心
  • zap:日志组件
  • 等等

这种设计让开发者可以根据实际需求选择所需组件,实现灵活组合,避免了"全家桶"式的强制依赖。

3. 原有架构的问题

改造前,Gone核心代码和所有Goner组件都在同一个仓库中管理,共享同一个Go module。这种架构存在以下问题:

  • 依赖膨胀:用户即使只需要某一个特定功能(如gin集成),也必须导入整个Gone模块,包含大量不需要的依赖
  • 版本管理困难:所有组件共享同一个版本号,无法针对单个组件进行独立版本迭代
  • 维护成本高:随着组件数量增加,单一仓库的维护难度急剧上升
  • 违背轻量级理念:过多的依赖与Gone框架轻量级的设计理念相矛盾

二、改造过程

1. 仓库分离

首先,我们将Goner组件库从原始的github.com/gone-io/gone仓库中分离出来,独立为一个新仓库:github.com/gone-io/goner

这一步骤包括:

  • 创建新的Git仓库
  • 迁移相关代码,保留提交历史
  • 调整导入路径

2. 单仓库多模块(Mono Repo)改造

github.com/gone-io/goner进行Mono Repo改造,将每个Goner组件作为独立的子模块管理:

github.com/gone-io/goner/
├── g/                  # 基础接口定义
├── gin/                # Gin框架集成
├── gorm/               # GORM框架集成
├── redis/              # Redis客户端集成
├── viper/              # Viper配置管理
├── apollo/             # Apollo配置中心
├── nacos/              # Nacos配置中心
├── zap/                # Zap日志组件
├── grpc/               # gRPC服务集成
├── cmux/               # 连接复用
├── schedule/           # 定时任务
├── tracer/             # 链路追踪
├── urllib/             # HTTP客户端
├── xorm/               # XORM框架集成
└── ...

每个子目录都是一个独立的Go模块,拥有自己的go.mod文件,可以独立版本化和发布。

3. 接口抽象与依赖解耦

为了解决组件间的相互依赖问题,我们采用了"依赖接口,不依赖实现"的设计原则:

  • 创建github.com/gone-io/goner/g子模块,用于定义所有公共接口
  • 所有组件都依赖于这个基础接口模块,而不是直接依赖其他组件
  • 通过接口抽象,实现了组件间的松耦合

例如,在g/tracer.go中定义了链路追踪相关接口,而不是直接依赖于tracer的具体实现:

// /g/tracer.go
package g

// Tracer 用于日志追踪,为同一调用链分配统一的traceId,方便日志追踪
type Tracer interface {
   
   

    //SetTraceId 为调用函数设置traceId。如果traceId为空字符串,将自动生成一个。
    //调用函数可以通过GetTraceId()方法获取traceId。
    SetTraceId(traceId string
<think>好的,我需要为用户提供关于UiAutomator2自动化测试框架的详细介绍和文档指南。首先,我需要回顾之前的对话,确保内容连贯。用户之前询问了Android Studio,现在转向UiAutomator2,所以可能需要强调与Android开发工具的集成。 接下来,查看用户提供的引用内容。引用3和4提到了uiautomator2的Python脚本支持、异步操作、异常处理,以及安装步骤。引用2提到了Android设备层的测试框架,如UIAutomator和UIAutomator2。需要整合这些信息,确保覆盖核心功能、安装配置、基本使用、高级特性、与Android Studio的集成以及最佳实践。 用户需要详细文档和使用指南,因此结构要清晰,分章节说明。要包含代码示例,比如Python脚本,以及环境配置步骤,比如安装命令和初始化。同时,可能需要比较UiAutomator2与其他框架(如Appium)的区别,突出其优势,比如直接访问UI元素、支持Python等。 注意用户可能关心实际应用场景,比如持续集成、复杂手势测试,因此需要相关案例和集成方法。此外,常见问题解答部分可以帮助用户解决典型错误,如设备连接问题或元素定位失败。 需要确保所有技术细节准确,比如依赖库版本、命令的正确性。同时,链接到官方文档和GitHub仓库,方便用户进一步查阅。最后,生成相关问题,帮助用户深入探索,比如性能优化或与其他工具的比较。</think>### UiAutomator2 自动化测试框架深度解析 UiAutomator2 是由 OpenATX 维护的 Android UI 自动化测试框架,支持通过 Python 脚本实现设备交互。以下从核心架构到实战应用进行全面说明,并提供关键代码示例与调试技巧。 --- #### 一、框架核心特性 1. **跨进程操作** - 直接访问任意应用的 UI 元素,无需注入代码 - 通过 `Android Debug Bridge (ADB)` 与设备通信 $$ \text{测试机} \xrightarrow{\text{Python脚本}} \text{ADB} \xrightarrow{\text{JSON-RPC}} \text{设备端服务} $$ 2. **多语言支持** - 原生支持 Python 编写测试用例 - 集成其他语言(如 Java)需通过 HTTP 接口调用[^2] 3. **异步执行机制** ```python # 异步点击示例 import uiautomator2 as u2 d = u2.connect() d.click.async_click(0.5, 0.5) # 非阻塞操作 ``` - 提升长流程测试执行效率 4. **元素定位体系** | 定位方式 | 语法示例 | |------------------|------------------------------| | 资源ID | `d(resourceId="com.example:id/btn")` | | 文本匹配 | `d(text="Submit")` | | 组合选择器 | `d(className="Button", instance=2)` | --- #### 二、环境搭建与配置 1. **设备端依赖安装** ```bash # 初始化设备服务(自动安装atx-agent等) python -m uiautomator2 init ``` - 依赖组件: - `uiautomator-server.apk`:UI 操作服务 - `minicap/minitouch`:屏幕流与触控支持[^4] 2. **开发环境配置** ```bash # 安装Python库(推荐使用虚拟环境) pip install uiautomator2 weditor ``` - 辅助工具: - `Weditor`:可视化元素选择器(启动命令:`weditor --adb`) --- #### 三、基础操作与脚本编写 1. **设备连接管理** ```python # 通过序列号连接指定设备 d = u2.connect("emulator-5554") # 或自动选择首个可用设备 d = u2.connect() ``` 2. **常见交互操作** ```python # 点击操作链 d(text="Settings").click() d.xpath('//*[@content-desc="Network"]').click(timeout=10) # 滑动与拖拽 d.swipe(0.5, 0.8, 0.5, 0.2, duration=0.5) # 从底部滑动到顶部 d.drag(100, 200, 400, 500, duration=0.1) # 模拟拖拽动作 # 文本输入 d(resourceId="com.android.dialer:id/digits").set_text("13800138000") ``` 3. **断言与验证** ```python assert d(text="Welcome").exists(timeout=5), "登录失败" print(d.info) # 获取设备当前状态(屏幕尺寸、电量等) ``` --- #### 四、高级功能与调试技巧 1. **图像识别集成** ```python # 基于OpenCV的图像匹配(需安装opencv-python) d.image.match("screenshot.png").click() ``` - 适用场景:验证界面截图或非标准控件 2. **性能监控** ```python # 获取CPU/Memory数据 perf = d.app_perf("com.android.settings") print(f"CPU使用率: {perf['cpu']}%, 内存占用: {perf['memory']}MB") ``` 3. **异常处理机制** ```python try: d(text="Delete").click() except u2.UiAutomationError as e: d.screenshot("error.png") # 自动保存错误截图 raise e ``` --- #### 五、与 Android Studio 的集成方案 1. **单元测试整合** ```gradle // build.gradle 配置测试依赖 androidTestImplementation 'com.github.openatx:uiautomator2:2.16.0' ``` - 在 `AndroidTest` 目录中编写 Java 测试用例 2. **持续集成流程** ```yaml # GitHub Actions 配置示例 - name: Run UI Tests run: | adb connect ${{ secrets.DEVICE_IP }} pytest tests/ui_automation/ ``` --- #### 六、最佳实践与常见问题 1. **元素定位优化** - 优先使用 `resourceId` 而非 `text`(防止多语言问题) - 对动态元素使用 `XPath` 或 `until` 等待策略: ```python d(text="Loading").until.gone(timeout=20) # 等待加载完成 ``` 2. **常见错误排查** | 错误现象 | 解决方案 | |--------------------------|------------------------------| | `UiAutomation not connected` | 重启设备端服务:`adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub com.github.uiautomator.test/androidx.test.runner.AndroidJUnitRunner` | | 元素定位超时 | 检查是否启用开发者选项中的「指针位置」辅助调试 | --- #### 官方文档与扩展资源 - [GitHub 仓库](https://github.com/openatx/uiautomator2) - [API 文档](https://uiautomator2.readthedocs.io/) - 调试工具推荐: - **Scrcpy**:实时投屏与触控操作 - **STF**:多设备集群管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dapeng-大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值