Appium自动化测试中Android与iOS弱网模拟的工程化实践
1. 项目概述为什么移动端自动化测试必须搞定弱网模拟做移动端自动化测试的朋友尤其是用Appium的肯定都遇到过这种场景脚本在实验室的Wi-Fi环境下跑得飞快一到用户手里就各种卡顿、超时、闪退。问题反馈回来开发一句“我本地是好的”测试这边就哑口无言了。这背后十有八九是网络环境在作祟。真实的用户网络环境千差万别地铁里的信号波动、地下车库的弱覆盖、偏远地区的2G网络这些场景下的应用表现才是真正考验应用健壮性的试金石。所以“弱网模拟”从来都不是一个“锦上添花”的选修课而是移动端质量保障体系中必须攻克的“硬骨头”。它直接关系到用户体验的核心指标应用的可用性和稳定性。一个在弱网下频繁崩溃或功能异常的应用用户流失是分分钟的事。这个项目标题“Appium 弱网模拟Android emulator 网络延迟和 iOS Network Link Conditioner 的集成”精准地指向了自动化测试中弱网模拟的两大核心阵地Android模拟器和iOS模拟器/真机。它不是一个简单的工具使用教程而是一个完整的工程化解决方案。其核心价值在于将弱网模拟能力无缝嵌入到你的Appium自动化测试流水线中让每一次自动化执行都能在可控的、可复现的恶劣网络条件下进行从而提前暴露和修复那些只在特定网络抖动下才会出现的深层次Bug。简单说这个项目要解决的就是如何让Appium自动化脚本像真实用户一样在糟糕的网络里“冲浪”并记录下应用的所有反应。接下来我会结合我多年的实战经验从设计思路到实操细节再到避坑指南为你完整拆解这个方案的实现。2. 整体方案设计与核心思路拆解在动手写一行代码之前我们必须把方案的设计思路理清楚。弱网模拟不是简单地“把网速调慢”它涉及到网络参数的精细化控制、与测试框架的集成方式、以及跨平台Android/iOS的统一管理。2.1 为什么选择Android Emulator的网络延迟和iOS的Network Link Conditioner这是方案选型的核心。市面上弱网模拟工具很多比如Fiddler、Charles的限速功能或者专业的网络损伤仪硬件。但在Appium自动化测试的语境下我们选择这两者是基于以下几个关键考量原生与精准Android Emulator自带的网络延迟模拟和iOS的Network Link Conditioner网络链接调节器都是操作系统或官方模拟器提供的原生能力。它们直接在网络协议栈层面进行干预模拟效果最接近真实硬件网卡的状态比代理工具如Charles在应用层的限速更底层、更准确。特别是对于使用原生TCP/UDP socket或特定网络库的应用代理工具可能无法完全模拟出延迟和丢包的效果。可编程与控制这两者都提供了命令行或API接口允许我们通过脚本进行动态控制。这对于自动化测试至关重要。我们可以在测试用例执行前开启弱网在执行后恢复实现测试场景的自动化切换。与Appium的无缝集成我们的目标是让弱网模拟成为测试用例的一部分。通过将控制命令封装成Appium的before/after钩子函数或者集成到测试框架的setUp/tearDown方法中可以实现网络环境与测试步骤的强绑定。成本与便利性它们都是免费的且与开发/测试环境天然集成。无需额外部署代理服务器或购买昂贵硬件特别适合在CI/CD流水线中大规模使用。整体工作流设计 我们的方案会遵循这样一个流程Appium测试脚本启动 - 根据配置参数判断当前测试设备类型Android Emulator 或 iOS Simulator/Device- 在初始化WebDriver即建立与设备的会话之前或之后调用对应的命令行工具设置预设的网络损伤参数如延迟、丢包率、带宽限制- 执行具体的UI自动化测试用例 - 用例执行完毕或发生异常时恢复网络设置为正常状态 - 生成测试报告其中应包含执行时的网络环境标签。2.2 核心参数解析我们到底在模拟什么弱网模拟不是笼统的“慢”而是对一系列网络质量指标的量化控制。主要参数包括延迟Latency数据包从发送到接收所需的时间单位是毫秒ms。这是影响“响应速度”的关键。例如4G网络延迟通常在30-100ms而3G可能达到200-500ms卫星网络甚至更高。丢包率Packet Loss Rate传输过程中丢失的数据包百分比。即使延迟不高高丢包率也会导致TCP重传、应用层超时表现为请求失败或卡顿。带宽Bandwidth网络通道的数据传输速率上限单位是Kbps或Mbps。限制带宽可以模拟低速网络如2G/3G下大资源如图片、视频加载缓慢的场景。抖动Jitter延迟的变化量。稳定的高延迟可能还能适应但剧烈的抖动如延迟在50ms和500ms之间随机跳动对音视频通话、实时游戏等应用是致命的。注意Android Emulator主要擅长模拟延迟和丢包通过network speed和network delay参数。iOS的Network Link Conditioner则提供了更丰富的预设场景如3G、DSL、高延迟DNS等并允许自定义带宽、延迟、丢包和DNS延迟。在实际项目中我们通常根据测试需求组合使用这些参数来定义如“恶劣3G”、“不稳定Wi-Fi”等具体场景。3. Android Emulator 网络延迟模拟实战Android模拟器的网络模拟功能是其内置的我们主要通过Android SDK中的emulator命令行工具来控制。3.1 通过命令行启动时配置网络参数最直接的方式是在启动模拟器时通过-netdelay和-netspeed参数指定网络状况。# 启动一个AVDAndroid Virtual Device并模拟一个高延迟、低带宽的GPRS网络 emulator -avd Pixel_4_API_30 -netdelay gprs -netspeed gprs # 使用自定义参数延迟200ms抖动50ms丢包率5%下行带宽40Kbps上行带宽20Kbps emulator -avd Pixel_4_API_30 -netdelay 200,50,5 -netspeed 40,20参数详解-netdelay delay: 设置网络延迟。可以接受预设值如gprs,edge,umts,hsdpa等也可以接受自定义格式median,range,deviation中值波动范围丢包率注意这里第三个参数传统上被认为是丢包率但文档已变更更推荐用-netloss。-netspeed speed: 设置网络速度带宽。同样有预设值或自定义格式down,up下行带宽上行带宽单位是Kbps。实操心得 在实际的自动化测试中我们很少在启动时写死网络参数。因为测试用例可能需要切换不同的网络场景。更灵活的做法是先以正常网络启动模拟器然后在测试过程中通过ADB命令动态修改。3.2 动态控制模拟器网络使用ADB命令Android模拟器暴露了一个特殊的network命令可以通过ADB shell来调用实现运行时动态调整。# 1. 首先确保模拟器已启动并通过ADB连接到设备。 adb devices # 2. 进入模拟器的控制台。注意这里的5554是你的模拟器实例的端口号通常是5554。 telnet localhost 5554 # 进入telnet后可以使用以下命令 network delay edge # 设置为EDGE网络延迟 network speed gprs # 设置为GPRS网络速度 network delay 200 100 5 # 设置延迟中值200ms波动100ms丢包率5% network speed 40 20 # 设置速度下行40Kbps上行20Kbps network status # 查看当前网络设置为了在Python或其他语言的Appium脚本中集成我们不能依赖交互式的telnet。我们可以通过subprocess模块执行命令或者使用pexpect库来处理telnet会话。下面是一个Python封装函数的示例import subprocess import time def set_emulator_network(emulator_port5554, delayNone, speedNone): 动态设置Android模拟器的网络参数。 :param emulator_port: 模拟器端口如5554 :param delay: 延迟字符串如 edge, 200,100,5 :param speed: 速度字符串如 gprs, 40,20 try: # 方法通过 adb emu 命令这是更现代和推荐的方式无需telnet if delay: cmd fadb -s emulator-{emulator_port} emu network delay {delay} subprocess.run(cmd, shellTrue, checkTrue, timeout10) print(f[INFO] 设置网络延迟为: {delay}) if speed: cmd fadb -s emulator-{emulator_port} emu network speed {speed} subprocess.run(cmd, shellTrue, checkTrue, timeout10) print(f[INFO] 设置网络速度为: {speed}) # 短暂等待设置生效 time.sleep(2) except subprocess.CalledProcessError as e: print(f[ERROR] 设置网络参数失败: {e}) except subprocess.TimeoutExpired: print([ERROR] 命令执行超时)关键技巧使用adb -s emulator-{port} emu network ...命令是更简洁可靠的方式它直接与模拟器进程通信避免了开启telnet端口的潜在安全问题和不稳定性。每次设置后等待1-2秒让网络栈稳定再进行后续的UI操作。务必在测试结束或用例tearDown时将网络恢复为正常状态如network delay none和network speed full。3.3 集成到Appium测试框架中以Python的pytest框架为例我们可以利用fixture来优雅地管理网络环境。import pytest from appium import webdriver from your_network_module import set_emulator_network, restore_emulator_network # 假设上面函数封装在此 pytest.fixture(scopefunction) # 每个测试函数执行一次 def driver_with_weak_network(request): 提供一个带有弱网环境的Appium driver fixture。 # 1. 准备Appium能力配置 desired_caps { platformName: Android, platformVersion: 11.0, deviceName: Android Emulator, app: /path/to/your/app.apk, automationName: UiAutomator2, udid: emulator-5554, # 指定模拟器 } # 2. 在创建Driver前先设置弱网环境 # 这里从测试用例的marker或参数中读取网络配置 network_profile request.node.get_closest_marker(network_profile) if network_profile: profile network_profile.args[0] set_emulator_network(delayprofile[delay], speedprofile[speed]) # 3. 初始化Appium Driver driver webdriver.Remote(http://localhost:4723/wd/hub, desired_caps) # 4. 测试执行完毕后恢复网络并退出driver yield driver restore_emulator_network() # 恢复网络的函数 driver.quit() # 在测试用例中使用 pytest.mark.network_profile({delay: umts, speed: umts}) def test_login_under_3g(driver_with_weak_network): driver driver_with_weak_network # 你的测试步骤... driver.find_element(AppiumBy.ID, username).send_keys(test) # 断言在弱网下登录是否成功或是否有适当的加载态/超时处理 # ...这样测试用例只需要关注业务逻辑网络环境的准备和清理由fixture自动完成实现了关注点分离。4. iOS Network Link Conditioner 集成详解对于iOS测试无论是模拟器Simulator还是真机Network Link ConditionerNLC都是官方提供的网络模拟利器。它集成在macOS的“附加工具”中提供了图形界面和命令行工具networkQuality和networksetup的某些功能但更核心的是sudo dnctl和sudo pfctl不过苹果对NLC的底层控制并未完全开放命令行API。4.1 安装与启用Network Link Conditioner首先确保NLC已安装打开Xcode。选择菜单栏Xcode-Open Developer Tool-More Developer Tools...。在打开的网页中下载对应你macOS版本的“Additional Tools for Xcode”磁盘镜像。下载并挂载后找到Hardware/Network Link Conditioner.prefPane双击安装到系统偏好设置。启用后你可以在系统偏好设置或菜单栏图标中快速切换网络预设。但对于自动化我们需要命令行控制。4.2 通过命令行控制Network Link Conditioner模拟器对于iOS模拟器我们可以利用xcrun simctl这个强大的命令来管理模拟器但请注意simctl并没有直接提供设置NLC的命令。社区和苹果自身有一些未公开的接口或变通方案。一种经过验证的相对稳定的方法是通过simctl启动模拟器时注入一个已经配置好NLC的.mobileconfig配置文件或者使用第三方工具如comcastGo语言编写在macOS主机层面制造网络损伤从而影响所有从本机发出的流量包括模拟器。然而更贴近“集成”思路的是使用苹果在Xcode 12/iOS 14中引入的networkQuality命令行工具主要用于测量网络质量但它不能直接设置损伤。因此目前对于iOS自动化测试一个更实际且稳定的方案是方案A使用第三方工具在主机层面限速推荐用于CI/CD工具如comcast或Apples Network Link Conditioner CLI (需额外安装)。以comcast为例它可以在你的Mac上创建虚拟网络接口并设置规则影响所有流量。# 安装comcast (需要Go环境) go install github.com/tylertreat/comcastlatest # 设置网络规则延迟100ms丢包率5%带宽1Mbps comcast --deviceen0 --latency100 --loss5 --target-bw1000 # 清除规则恢复网络 comcast --stop然后在你的Appium测试脚本中在启动iOS测试前执行comcast命令测试后执行comcast --stop。方案B针对真机使用配置描述文件.mobileconfig对于iOS真机可以创建一个包含NLC配置的.mobileconfig文件通过MDM移动设备管理或苹果配置器Apple Configurator安装到设备上。在自动化中这通常需要与设备管理平台结合流程较复杂。方案C使用私有API不推荐用于生产有一些逆向工程发现可以通过simctl的spawn命令启动一个进程来间接控制NLC或者使用libMobileGestalt的私有函数。这种方法极其脆弱随系统更新极易失效强烈不推荐在追求稳定性的自动化测试中使用。4.3 在Appium测试中集成主机层面限速鉴于上述情况我们采用方案A作为iOS自动化弱网模拟的推荐实践。下面是如何将其集成到Appium Python脚本中import subprocess import platform import time class NetworkConditioner: def __init__(self): self.system platform.system() def set_ios_weak_network(self, profile3g): 为iOS测试设置弱网环境通过主机层面工具。 :param profile: 预设场景如 3g, dsl, lossy或传递具体参数字典。 if self.system ! Darwin: raise EnvironmentError(iOS弱网模拟仅支持macOS系统。) # 这里以调用一个假设的封装了comcast命令的shell脚本为例 # 实际项目中你需要根据profile映射到具体的comcast或其它工具参数 profile_map { 3g: {latency: 100, loss: 1, target-bw: 750}, edge: {latency: 400, loss: 5, target-bw: 250}, lossy: {latency: 50, loss: 20, target-bw: 1000}, } params profile_map.get(profile, profile_map[3g]) try: # 停止可能存在的旧规则 subprocess.run([comcast, --stop], capture_outputTrue) time.sleep(1) # 应用新规则。假设使用en0接口请根据实际情况调整。 cmd [ comcast, --deviceen0, f--latency{params[latency]}, f--loss{params[loss]}, f--target-bw{params[target-bw]}, ] result subprocess.run(cmd, capture_outputTrue, textTrue, timeout30) if result.returncode 0: print(f[INFO] 已应用{iOS}弱网配置: {profile}) time.sleep(3) # 等待规则生效 else: print(f[ERROR] 设置弱网失败: {result.stderr}) except FileNotFoundError: print([ERROR] 未找到comcast命令请先安装: go install github.com/tylertreat/comcastlatest) except subprocess.TimeoutExpired: print([ERROR] 网络设置命令执行超时) def restore_network(self): 恢复网络到正常状态 try: subprocess.run([comcast, --stop], capture_outputTrue) print([INFO] 网络规则已清除恢复正常网络。) time.sleep(2) except Exception as e: print(f[WARNING] 恢复网络时发生错误: {e}) # 在pytest fixture中使用 pytest.fixture(scopesession) def network_conditioner(): nc NetworkConditioner() yield nc # 测试会话结束后确保网络被恢复 nc.restore_network() pytest.fixture(scopefunction) def ios_driver(request, network_conditioner): # 根据标记决定是否开启弱网 weak_network_profile request.node.get_closest_marker(ios_weak_net) if weak_network_profile: profile weak_network_profile.args[0] network_conditioner.set_ios_weak_network(profile) desired_caps { platformName: iOS, platformVersion: 17.5, deviceName: iPhone 15, automationName: XCUITest, app: /path/to/your/app.app, # ... 其他能力 } driver webdriver.Remote(http://localhost:4723/wd/hub, desired_caps) yield driver driver.quit() # 注意网络恢复通常在session级别的fixture teardown中做避免每个用例频繁切换。 pytest.mark.ios_weak_net(lossy) def test_ios_app_under_lossy_network(ios_driver): # 在丢包严重的网络下测试应用重试机制 # ...这种方式的优点是一次设置影响所有从该Mac发出的网络流量包括Simulator和连接至此Mac的真机通过USB共享网络时。缺点是需要管理员权限sudo来运行comcast在CI环境中需要妥善处理权限问题。5. 跨平台统一管理与最佳实践当你的测试套件需要同时覆盖Android和iOS时一个统一的弱网管理抽象层就显得非常必要。目标是让测试用例编写者无需关心底层是Android还是iOS。5.1 设计一个统一的网络控制层我们可以创建一个NetworkManager类它根据传入的平台platformName和设备标识udid或deviceName调用对应的底层实现。# network_manager.py class NetworkManager: def __init__(self, platform, device_idNone): self.platform platform.lower() self.device_id device_id self._android_helper AndroidNetworkHelper(device_id) if android in self.platform else None self._ios_helper IOSNetworkHelper() if ios in self.platform else None def set_network_profile(self, profile_name): 设置网络配置文件 if self._android_helper: # 将通用profile映射到Android参数 android_params self._map_to_android(profile_name) self._android_helper.set_network(**android_params) elif self._ios_helper: # 将通用profile映射到iOS/comcast参数 ios_params self._map_to_ios(profile_name) self._ios_helper.set_network(**ios_params) else: raise ValueError(f不支持的平台: {self.platform}) def restore_network(self): 恢复网络 if self._android_helper: self._android_helper.restore() elif self._ios_helper: self._ios_helper.restore() def _map_to_android(self, profile): # 配置文件映射逻辑 profiles { good_3g: {delay: umts, speed: umts}, bad_2g: {delay: gprs, speed: gprs}, high_latency: {delay: 500,100,0, speed: full}, } return profiles.get(profile, {}) def _map_to_ios(self, profile): profiles { good_3g: {latency: 100, loss: 1, bandwidth: 750}, bad_2g: {latency: 400, loss: 5, bandwidth: 150}, high_latency: {latency: 500, loss: 0, bandwidth: 10000}, } return profiles.get(profile, {}) # 在conftest.py中创建全局fixture pytest.fixture(scopesession) def network_manager(request): # 可以从命令行参数或配置文件读取默认平台 platform request.config.getoption(--platform) mgr NetworkManager(platform) yield mgr mgr.restore_network()5.2 定义标准化的弱网场景配置文件不要将网络参数硬编码在代码里。使用YAML或JSON文件来管理场景便于维护和共享。# network_profiles.yaml profiles: excellent_wifi: description: 理想Wi-Fi环境用于基准测试 android: delay: none speed: full ios: latency: 0 loss: 0 bandwidth: 100000 average_4g: description: 典型的4G移动网络 android: delay: 100,20,0 speed: 5000,1000 ios: latency: 80 loss: 0.5 bandwidth: 5000 lossy_3g: description: 不稳定、高丢包的3G网络 android: delay: 200,100,5 speed: 750,250 ios: latency: 200 loss: 10 bandwidth: 750在NetworkManager中加载这个配置文件set_network_profile方法根据profile_name和当前平台选择对应的参数集。5.3 与CI/CD流水线集成在持续集成环境中自动化测试通常运行在Docker容器或虚拟机上。这带来了挑战Android模拟器通常运行在Linux容器中emulator命令和ADB可用。网络模拟在模拟器内部完成与宿主机网络隔离性好。iOS模拟器必须运行在macOS宿主机上。如果CI节点是macOS那么使用comcast等主机层面工具是可行的。但需要确保CI脚本有足够的权限通常需要sudo这涉及到CI服务器的安全策略配置。集成步骤建议环境准备在CI镜像或脚本中确保安装了必要的工具Android SDK/emulator,comcast, Appium Server等。参数化构建将“网络场景”作为CI构建的一个参数如Jenkins的Choice Parameter或GitLab CI的variables。测试脚本读取这个参数来决定使用哪个network_profile。步骤编排# 一个简化的.gitlab-ci.yml示例 stages: - test weak_network_test: stage: test script: - echo Starting Appium server in background... - appium --log-level error - sleep 5 - | # 根据变量设置网络 if [ $PLATFORM android ]; then python -m pytest tests/ --platformandroid --network-profile$NETWORK_PROFILE -v elif [ $PLATFORM ios ]; then # 对于iOS需要先设置主机网络需要sudo权限 sudo comcast --deviceen0 --latency100 --loss5 --target-bw750 python -m pytest tests/ --platformios --network-profile$NETWORK_PROFILE -v sudo comcast --stop fi - echo Tests finished. artifacts: paths: - ./test-reports/ variables: PLATFORM: android # 可被覆盖 NETWORK_PROFILE: average_4g # 可被覆盖结果报告确保测试报告如Allure, Pytest-html中明确标记出执行用例时所处的网络环境。这可以通过在测试开始时添加一个环境变量或自定义标签来实现。6. 常见问题、排查技巧与实战心得即使方案设计得再完美在实际落地过程中也一定会踩坑。下面是我总结的一些典型问题和解决思路。6.1 Android Emulator 网络模拟不生效现象通过adb emu network设置了参数但应用测速或行为感觉不到变化。检查1确认命令执行成功。查看命令是否有错误输出。确保你定位到了正确的模拟器实例adb devices列出设备使用-s emulator-5554指定。检查2模拟器版本。非常旧的模拟器版本可能对网络模拟支持不佳。确保使用较新版本的Android Emulator推荐API 30以上。检查3应用是否使用了自定义网络栈有些应用特别是游戏或使用WebRTC的可能使用自己的网络库如Cocos2d-x的网络模块、或直接使用原生Socket这些库可能不直接受系统网络代理设置的影响。此时模拟器底层的网络损伤仍然是有效的但可能需要更精细的测试来验证。检查4尝试使用network status命令。在模拟器控制台或通过adb emu network status查看当前设置是否已应用。终极验证方法在模拟器内打开浏览器访问一个测速网站或者使用ping命令测试延迟。这是最直接的验证。6.2 iOS 主机层面限速影响了CI机器本身现象在macOS CI节点上运行comcast后不仅模拟器连CI runner本身的网络如下载依赖、上传日志都变慢了导致整体作业超时。解决方案这是使用主机层面工具的最大副作用。必须采用精准的清理策略。在before_script或setup阶段记录当前的网络设置如果可能。在测试脚本的teardown部分无论测试成功还是失败都必须调用恢复网络的命令comcast --stop。使用try...finally块确保执行。考虑在CI作业中增加一个最终的“清理”步骤即使测试脚本异常退出也能强制恢复网络。更高级的方案是使用Docker for Mac或虚拟机来隔离测试环境但这会增加复杂性。6.3 弱网下Appium命令超时Timeout问题现象设置弱网后Appium的find_element等命令经常超时失败导致测试用例大量失败。根本原因Appium的默认命令超时时间newCommandTimeout和隐式等待时间可能不足以应对高延迟网络。此外UI交互后应用响应变慢。调整策略增加Appium Server超时在Desired Capabilities中设置较长的newCommandTimeout例如120000毫秒。使用显式等待而非隐式等待彻底避免使用driver.implicitly_wait()而是对每个需要查找的元素使用WebDriverWait并设置合理的超时时间和轮询间隔。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 弱网环境下等待时间可以设长一些 wait WebDriverWait(driver, 30, poll_frequency2) # 等待30秒每2秒检查一次 element wait.until(EC.presence_of_element_located((AppiumBy.ID, login_button)))区分“网络慢”和“元素不存在”超时异常需要被捕获并根据具体错误信息判断是网络问题还是真正的Bug。可以设计重试机制但对于因网络导致的纯超时重试可能有效。优化测试用例在弱网测试中减少不必要的操作和断言。聚焦于核心业务流程的验证。6.4 如何验证弱网模拟的效果不能只凭“感觉”认为网络慢了。需要有客观的验证手段。内置工具在设备上安装一个简单的网络测速App如Speedtest by Ookla在设置弱网前后跑一下速。通过测试脚本验证在自动化脚本中插入一个简单的HTTP请求使用requests库测量其响应时间。import requests import time def measure_network_latency(urlhttp://www.google.com/generate_204): start time.time() try: response requests.get(url, timeout10) latency (time.time() - start) * 1000 # 转为毫秒 print(f网络延迟测量: {latency:.2f} ms) return latency except requests.exceptions.Timeout: print(请求超时网络可能非常慢或不通) return None # 在设置弱网后调用 measured_latency measure_network_latency()日志分析查看应用自身的网络请求日志观察在弱网环境下请求耗时和重试次数的变化。6.5 模拟更复杂的网络场景标准的延迟、丢包、带宽限制有时还不够。我们可能需要模拟断续连接网络时通时断。可以通过写一个脚本周期性地启用/禁用主机网络接口sudo ifconfig en0 down/up或开关飞行模式对于模拟器可通过ADB命令adb shell svc wifi disable/enable来粗略模拟。但这会非常暴力可能直接导致TCP连接断开。带宽波动带宽随时间变化。comcast工具支持--target-addr和--target-proto等参数来更精细地控制可以编写脚本动态改变--target-bw参数来模拟波动。DNS延迟或污染这需要修改系统的DNS设置或使用dnsmasq等工具集成复杂度较高通常需要独立的测试环境。对于这些复杂场景评估其测试收益和实现成本非常重要。很多时候标准的“高延迟高丢包”组合已经能发现绝大多数网络相关缺陷。最后一点心得弱网自动化测试的最终目的不是让测试通过而是让问题暴露。因此当你的测试用例在弱网下开始大量失败时不要第一时间去调整超时时间或修改用例来让它通过。而应该去分析这些失败是应用没有加载态提示是请求超时后没有重试机制是页面布局在加载不全时错乱把这些失败点记录下来提交给开发和产品推动应用本身进行优化这才是弱网模拟测试最大的价值所在。