Docker容器内时间获取对比测试失败 时区配置问题咨询
Docker容器时区不一致导致自动化时间校验失败问题
问题现象
编写了一套自动化测试脚本,核心逻辑为获取当前时间,将该时间与前端Web页面展示的时间做对比校验。
- 本地机器运行时测试可正常通过,脚本打印时间与本机系统时间完全一致,例如本机显示上午9点时,脚本打印时间为
09:37:57 - 测试任务放到Docker容器中运行时测试失败,脚本打印时间为
01:37:57,与预期时间存在8小时固定偏差
需要明确是否需要对Docker做相关配置使其使用与服务器/应用一致的时区,以及如何解决容器内时区不一致导致的时间取值偏差、对比测试失败问题。
涉及测试代码
音频上传当前时间获取逻辑
Get Current Audio Upload Time ${time}= Get Current Date ${current-time}= Convert Date ${time} result_format=%H:%M:%S Log To Console time when uploading audio is ${current-time} Set Global Variable ${current-time}
页面时间对比校验逻辑
Verify Audio Time ${time-elem} Get Table Cell Element .ant-table-content > table "Time" "Dual-Channel-Audio-${RandomNumber}" ${UI-time} Get Text ${time-elem} Log To Console time displayed at UI is ${UI-time} ${time-substract-result}= Subtract Time From Time ${UI-time} ${current-time} Log To Console subtract time is ${time-substract-result} Run Keyword And Continue On Failure Should Be True ${time-substract-result} <= 300 time displayed at UI is more than 5 seconds than expected time
解决方案
首先明确:出现8小时固定偏差的核心原因是Docker容器默认使用UTC零时区,而国内业务服务一般使用东八区(Asia/Shanghai)时区,必须对齐容器与被测服务的时区配置才能解决该问题,可通过以下几种方式配置:
- 启动容器时临时指定时区
执行docker run命令启动测试容器时,添加环境变量与时区文件挂载参数,直接复用宿主机时区配置:docker run -e TZ=Asia/Shanghai -v /etc/localtime:/etc/localtime:ro 你的测试镜像名 - 构建测试镜像时固化时区配置
如果是自定义Dockerfile构建测试执行镜像,直接在构建阶段写入时区配置,避免每次启动都要加参数:- 基于Debian/Ubuntu的基础镜像:
ENV TZ=Asia/Shanghai RUN apt-get update && apt-get install -y --no-install-recommends tzdata \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ && apt-get clean - 基于Alpine的基础镜像:
ENV TZ=Asia/Shanghai RUN apk add --no-cache tzdata \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone
- 基于Debian/Ubuntu的基础镜像:
- 脚本层兜底优化
现有测试脚本中Get Current Date关键字默认读取系统本地时间,可显式指定时区参数,从代码层规避环境差异影响,修改为:
另外注意现有校验逻辑存在配置错误:注释标注判断阈值为5秒,但代码中判断值写的是300(对应5分钟),可根据实际校验需求修正阈值。${time}= Get Current Date time_zone=Asia/Shanghai
内容的提问来源于stack exchange,提问作者Tester two DS
相关产品推荐
相关产品推荐

