干货 | 携程APP/Web功能和视觉测试平台-Watcher

 作者简介

 

Felix,携程高级测试经理,关注无线测试、DevOps、测试框架方面的技术和动态。

从自动化测试诞生以来,始终阻碍其成功落地实施的重要因素之一是频繁变更的业务需求,导致自动化测试维护成本极其高昂。尤其是随着近些年敏捷开发,DevOps开发模式的流行,一方面迫切地希望在开发生命周期内提高自动化测试的占比,从而缩短测试时间,增加开发迭代次数来加快开发进度和保证开发质量。而另一方面,随着迭代开发频率加快,需求的频繁变更却进一步加剧了维护自动化测试稳定性的难度。这两者不可调和的矛盾往往导致了自动化测试实施的难以为继,很多时候自动化测试成为了鸡肋,食之无味,弃之可惜。

那么如何减少需求变更对UI自动化测试的影响,如何另辟蹊径顺利地进行UI自动化测试?本文后续一一为你解答。


一、自动化测试不是银弹

 “自动化测试不是银弹” 这个观点已经得到业界的普遍认同,那么为何业界还是如此推崇自动化测试呢?测试完全的自动化固然不太可能,但在合适场景使用合理的自动化测试,却依然可以发挥出巨大的作用,得到较高的收益。

对于UI自动化测试而言,业务频繁变更导致的UI变化是UI自动化测试失败的主要原因。如果我们能尽可能地消除UI变化对自动化测试的影响,则势必会极大地提高自动化测试的稳定性。

梳理下一条UI自动化测试用例的结构,我们可以简单地归纳出如下图所示的关系:

 

自动化测试用例结构简化图

 

UI界面中控件的变化无疑是很频繁的,给自动化测试的实施带来很大的障碍。如果能切断业务操作和结果断言对于控件的依赖,则可以很大程度地提高自动化测试的稳定性。而随着图像识别技术的进步,通过图像识别技术摆脱对控件的依赖正逐渐成为可能。


二、视觉测试

  

UI自动化测试在验证预期结果是否正确时,通常是通过验证预期结果某些关键信息来实现的,比如是否出现某个关键字,是否标题正确等等。这种验证方式固然简单,却也存在不少的不足,其中最大的不足就是无法验证UI的样式。

UI是最终呈现在用户面前直观的东西,UI交互和样式的好坏直接决定了用户对一款产品的直观印象。视觉测试是验证UI是否正确展示给用户的测试手段之一,通过视觉测试可以找出产品在可视化中存在哪些缺陷,比如字体,布局等问题。那么如何实施视觉测试呢,业界最普遍的做法就是图像比对,具体实施步骤网上相关的资料不少,这里就不赘述了。


三、Watcher

Watcher是一个基于图像比对的App和Web视觉测试平台, 主要分为三个部分:SDK,图像比对服务,Watcher比对平台。

Watcher SDK主要用于与自动化测试框架(如Selenium,Appnium , Airtest)结合来实现与Watcher比对平台的交互(比如图片上传,客户端信息收集,验证结果返回等等)。Watcher比对平台则主要进行图像管理,测试配置管理,测试结果查看,人工确认等工作。图像比对服务则提供了图像比对,AI识别等服务。

<think>我们正在解决Spring Cloud Kubernetes中ConfigMap更新后配置不刷新的问题。用户已经配置了`@RefreshScope``spring.cloud.kubernetes.reload`相关属性,但未生效。根据引用[2]的信息,2020.*之后的版本中,旧的热更新机制已被废弃,推荐使用Spring Cloud Kubernetes Configuration Watcher组件。因此,我们需要确认: 1. 用户使用的Spring Cloud Kubernetes版本 2. 如果版本>=2020.0.0,则必须安装Configuration Watcher组件 ### 解决方案步骤: #### 1. 确认版本 首先检查项目中使用的`spring-cloud-starter-kubernetes-config`版本。如果版本低于2020.0.0(对应Spring Cloud版本为Hoxton及更早),则旧机制可能有效,但需要检查配置。如果版本>=2020.0.0,则必须安装Configuration Watcher。 #### 2. 安装Configuration Watcher 如果版本>=2020.0.0,按照引用[2]的说明部署Configuration Watcher- 创建Deployment文件(例如`deployment.yml`): ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: config-watcher spec: replicas: 1 selector: matchLabels: app: config-watcher template: metadata: labels: app: config-watcher spec: containers: - name: watcher image: springcloud/spring-cloud-kubernetes-configuration-watcher:2.1.6 env: - name: SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_HTTP_PORT value: "8888" # 注意:这个端口是Watcher监听的端口,不是应用端口 - name: SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_CONFIGLABEL value: "spring.cloud.kubernetes.config" # 默认使用的标签,可自定义 - name: SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_NAMESPACE value: "default" # 指定要监视的命名空间 ports: - containerPort: 8888 ``` 注意:需要根据实际环境调整命名空间标签。 - 应用部署: ```bash kubectl apply -f deployment.yml ``` #### 3. 确保应用暴露Actuator端点 在应用的配置中,需要暴露`refresh`端点: ```yaml management: endpoints: web: exposure: include: refresh ``` #### 4. 确保ConfigMap有正确标签 Configuration Watcher默认会监视带有标签`spring.cloud.kubernetes.config: true`的ConfigMap(可通过`SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_CONFIGLABEL`环境变量自定义)。因此,需要给需要监听的ConfigMap打上相应标签。例如: ```bash kubectl label configmap application-config spring.cloud.kubernetes.config=true ``` #### 5. 验证 更新ConfigMap后,检查Configuration Watcher的日志: ```bash kubectl logs -l app=config-watcher --tail=100 ``` 应该会看到类似以下内容: ``` Detected change in configmap/application-config, triggering refresh ``` 同时,检查应用日志,应该会看到RefreshScope刷新的日志。 ### 版本兼容性说明 - 对于Spring Cloud Kubernetes 2020.0.0及以上版本(如2021.x, 2022.x, 2023.x),必须使用Configuration Watcher- 对于旧版本(如1.x),则可以使用原生的`spring.cloud.kubernetes.reload`配置,但需要确保配置正确。 ### 如果仍然不生效 - 检查网络:确保Configuration Watcher可以访问应用的`/actuator/refresh`端点。 - 检查权限:确保Configuration Watcher的ServiceAccount有权限读取ConfigMap访问应用的服务。 - 检查日志:详细检查Configuration Watcher应用的日志。 ### 总结 是的,在Spring Cloud Kubernetes 2020.0.0及以上版本中,您需要安装Configuration Watcher组件来实现ConfigMap的自动刷新。旧版本中直接通过`spring.cloud.kubernetes.reload`配置的方式已被废弃。 ### 相关问题 1. 如何为Spring Cloud Kubernetes Configuration Watcher配置多个命名空间? 2. 如何保护`/actuator/refresh`端点避免未授权访问? 3. 如何自定义Configuration Watcher监听ConfigMap的标签? 4. 除了ConfigMap,Secrets的更新如何触发配置刷新? 5. 如何验证Configuration Watcher是否成功监听到ConfigMap变更?</think>### 是否需要安装 Configuration Watcher 组件? **是的,在 Spring Cloud Kubernetes 2020.0.0 及以上版本中,必须安装 Configuration Watcher 组件才能实现 ConfigMap 的自动刷新**。这是新版架构的核心变更,您的配置不生效正是因为缺少此组件[^2]。 --- ### 原因分析 1. **架构变更**: 2020.* 版本后,Spring Cloud Kubernetes 废弃了旧的热更新机制,改用独立的 **Configuration Watcher** 组件监听 ConfigMap 变更并触发刷新[^2]。 2. **工作原理差异**: - 旧版:应用直接监听 ConfigMap(需 `spring.cloud.kubernetes.reload.enabled=true`) - **新版**:由独立 Pod(Configuration Watcher)监听变更 → 调用应用的 `/actuator/refresh` 端点[^2] 3. **您的配置问题**: 虽然设置了 `@RefreshScope` `reload.enabled=true`,但缺少中间组件导致刷新链条断裂。 --- ### 解决方案:部署 Configuration Watcher #### 步骤 1:创建 Deployment ```yaml # config-watcher.yaml apiVersion: apps/v1 kind: Deployment metadata: name: config-watcher spec: replicas: 1 selector: matchLabels: app: config-watcher template: metadata: labels: app: config-watcher spec: containers: - name: watcher image: springcloud/spring-cloud-kubernetes-configuration-watcher:2.1.6 env: - name: SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_HTTP_PORT value: "8888" # 与应用管理端口一致 - name: SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_CONFIGLABEL value: "auto-refresh=true" # 自定义监听标签[^1] ports: - containerPort: 8888 ``` #### 步骤 2:部署到集群 ```bash kubectl apply -f config-watcher.yaml ``` #### 步骤 3:标记需要监听的 ConfigMap ```bash kubectl label configmap application-config auto-refresh=true kubectl label configmap sso-config auto-refresh=true # 为所有需要动态刷新的 ConfigMap 添加相同标签 ``` --- ### 关键配置验证 确保应用端满足: ```yaml management: endpoints: web: exposure: include: refresh # 暴露 refresh 端点 ``` --- ### 新旧版本兼容性对照 | 特性 | 2020.0.0 之前版本 | 2020.0.0 及之后版本 | |---------------------|-------------------------------|-------------------------------| | 刷新机制 | 应用直接监听 ConfigMap | 需独立 Configuration Watcher | | 依赖组件 | 无需额外组件 | 必须部署 Watcher Pod | | 配置方式 | `reload.enabled=true` 足够 | 需标签标记 ConfigMap[^1] | | 日志关键词 | `ConfigReloadAutoConfiguration` | `ConfigurationWatcher` | --- ### 验证是否生效 1. **检查 Watcher 日志**: ```bash kubectl logs -l app=config-watcher | grep "Detected change" # 正常输出:Detected change in configmap/application-config ``` 2. **触发更新测试**: ```bash kubectl patch configmap application-config --patch '{"data":{"test.key":"new-value"}}' ``` 3. **观察应用日志**: ```bash kubectl logs your-app-pod | grep RefreshScope # 正常输出:Refreshing Scope 'refresh' ``` --- ### 常见问题排查 若仍不生效,检查: 1. **端口一致性**:Watcher 的 `HTTP_PORT` 需匹配应用的管理端口(默认 8080) 2. **网络策略**:确保 Watcher 可访问应用服务 3. **RBAC 权限**:Watcher 需要 `get/watch configmap` 权限 4. **标签匹配**:ConfigMap 的标签需与 `SPRING_CLOUD_KUBERNETES_CONFIG_WATCHER_CONFIGLABEL` 值一致 > **关键提示**:当使用 `polling` 模式时,仍需 Configuration Watcher 组件,它负责将变更事件转化为 `/actuator/refresh` 调用[^2]。 --- ### 相关问题 1. 如何为多命名空间部署 Configuration Watcher? 2. 如何保护 `/actuator/refresh` 端点避免未授权访问? 3. Secrets 更新如何触发配置刷新? 4. 如何自定义 Configuration Watcher 的监听标签? 5. 如何验证 Configuration Watcher 到应用的网络连通性?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值