自动化测试实战:QTP、Selenium、LoadRunner选型与组合应用指南

📅 2026/6/26 2:23:01
自动化测试实战:QTP、Selenium、LoadRunner选型与组合应用指南
1. 项目概述为什么我们需要综合自动化测试干了十几年测试从手工点点点到脚本满天飞我最大的感触就是测试这行光会一种工具已经远远不够了。今天咱们聊的这个“综合自动化测试”听起来挺高大上其实说白了就是根据不同的测试需求把最合适的工具组合起来用让它们各司其职形成一个完整的战斗力闭环。这就像打仗你不能指望一把狙击枪去冲锋也不能让冲锋枪去打几百米外的目标。QTP现在叫UFT、Selenium和LoadRunner就是测试领域的“狙击枪”、“突击步枪”和“重火力支援”。很多新手甚至一些工作了几年的同行容易陷入一个误区学了Selenium就觉得UI自动化天下无敌或者用了LoadRunner就觉得性能测试高枕无忧。结果呢用Selenium去模拟几千用户并发脚本跑得吭哧吭哧资源监控一塌糊涂想用LoadRunner去录一个复杂的Web 2.0应用流程发现对象识别各种问题脚本维护成本巨高。这就是典型的工具错配。我们这个实战指南核心目的就是帮你理清楚什么场景下该用什么工具以及如何让它们协同工作。这不是一个简单的工具教程堆砌而是一套关于测试策略和工程化落地的思考框架。适合谁来读如果你是刚入行的测试工程师想系统地了解自动化测试的全貌避免在单一工具上钻牛角尖如果你是有一定经验但感觉自己的技术栈遇到瓶颈测试效率难以提升或者你是测试负责人正在为团队规划技术选型和落地路线。那么这篇结合了我个人大量踩坑经验总结的内容应该能给你带来一些实实在在的启发。接下来我会把这三大神器的定位、实战中的组合拳打法以及那些官方手册里不会写的“坑”和“技巧”掰开揉碎了讲给你听。2. 三大神器定位与核心选型逻辑在开始折腾任何代码和脚本之前我们必须先给这三款工具一个清晰的战略定位。选型错误是自动化项目失败的最主要原因之一钱花了人累了最后产出却为零。2.1 QTP/UFT企业级GUI自动化的“重装战士”首先得正名QTP早就改名叫UFTUnified Functional Testing了但大家叫惯了QTP我们就沿用这个更广为人知的名字。它的核心定位是企业级、商业化的GUI功能自动化测试工具尤其擅长传统客户端软件如C/S架构的桌面应用、Java Applet、Delphi、PowerBuilder等当然对Web支持也不错。为什么选它核心优势就两个字稳定和对象识别。对象库管理这是QTP的魂。它通过插件识别不同技术开发的控件并生成一个结构化的对象库Object Repository。脚本里不直接写XPath或CSS Selector而是引用这个库里的对象。好处是什么当界面元素属性比如id变了发生变化时你通常只需要在对象库里更新一次所有引用该对象的脚本就都生效了。这对于大型、长期的项目来说维护成本比基于坐标或纯属性定位的脚本低得多。关键字驱动它提供了一套接近自然语言的关键字如ClickSetCheckProperty即使不懂编程的测试人员通过录制和关键字视图也能快速上手降低了自动化门槛。与企业级工具链集成和HP ALMQuality Center等测试管理工具无缝集成用例、脚本、执行结果、缺陷可以形成一个完整的管理闭环非常适合有严格流程要求的大中型企业。那么什么情况下你应该优先考虑QTP/UFT你的被测系统主要是Win32、.NET、WPF、SAP、Oracle EBS等重型客户端应用。在这些领域Selenium基本无能为力。测试团队人员技术背景多元需要让业务测试人员也能参与自动化脚本的创建和维护。项目周期长对脚本的长期可维护性要求极高能接受较高的前期授权成本。注意QTP对动态Web应用大量Ajax、前端框架如React/Vue的支持在敏捷开发频繁变动的场景下其对象库的维护优势可能会被削弱有时反而不如Selenium直接定位灵活。而且商业许可费用是必须考虑的成本。2.2 SeleniumWeb UI自动化的“开源利刃”Selenium是Web UI自动化测试的绝对王者尤其是Selenium WebDriver即Selenium 2之后它提供了更强大、更符合程序员思维的控制能力。它的定位是免费、开源、跨浏览器、跨平台的Web自动化测试框架。为什么是它核心优势是灵活、生态强大和零成本。真正的编程接口WebDriver提供了一套基于HTTP协议JSON Wire Protocol的标准接口你可以用任何支持HTTP Client的语言Java, Python, C#, JavaScript, Ruby等来编写测试脚本。这意味着你可以使用你最熟悉的语言、最喜欢的IDE、最趁手的断言库和构建工具。庞大的生态系统围绕Selenium生长出了庞大的生态。测试框架TestNG, JUnit, pytest, NUnit、行为驱动开发BDD工具Cucumber, Behave、页面对象模型Page Object Model设计模式、分布式执行工具Selenium Grid、云测试平台集成等。你可以像搭积木一样构建最适合自己项目的自动化测试框架。直接驱动浏览器WebDriver直接调用浏览器原生API进行操作模拟用户行为更真实避免了早期Selenium RC的JavaScript注入限制。Selenium是你的首选当被测系统是纯Web应用且需要覆盖Chrome, Firefox, Edge, Safari等多种浏览器。团队开发人员技术能力强追求技术栈的统一和深度定制。项目追求快速迭代需要自动化框架能紧密集成到CI/CD如Jenkins, GitLab CI流水线中。预算有限无法承担商业工具的费用。实操心得Selenium入门容易但精通难。最大的挑战不在于写find_element而在于如何稳定地处理异步加载、动态元素、iframe、弹窗以及如何设计可维护的框架结构。直接写“面条代码”式的脚本初期很快但超过一百个用例后维护就是噩梦。2.3 LoadRunner性能压测的“战略威慑武器”LoadRunner及其社区免费版OpenText LoadRunner Developer是性能测试领域的标杆。它模拟成千上万的虚拟用户Vuser对系统施加压力从而评估系统的性能表现和瓶颈。定位是企业级负载与性能测试工具。它的核心价值在于“全链路”和“可分析性”。多协议支持这是LoadRunner的看家本领。从最常见的HTTP/HTTPS到数据库协议ODBC, Oracle NCA再到中间件Tuxedo, MQ、Socket、Citrix、SAP、Web Services等等。对于复杂的混合架构系统前端Web、中间件、后端核心它可以在一套脚本里模拟整个用户操作链条这是很多开源工具难以做到的。强大的资源监控与分析压测不只是发请求。LoadRunner可以集成监控服务器Windows/Linux的各项资源指标CPU、内存、磁盘IO、网络以及数据库、应用服务器如WebLogic, Tomcat的关键性能计数器。它的Analysis组件能将这些数据与事务响应时间、吞吐量关联起来生成丰富的图表和报告帮助快速定位瓶颈是在网络、服务器、还是数据库。丰富的场景设计能力可以精细控制虚拟用户的加载方式如逐步加压、瞬间加压、波浪式、思考时间、迭代次数、集合点Rendezvous等模拟出各种真实或极限的业务场景。什么时候必须请出LoadRunner系统架构复杂涉及多种协议交互需要端到端的性能测试。测试目标非常严肃如系统验收、容量规划、故障排查需要出具权威、详细的性能分析报告。压测规模极大需要模拟上万甚至数十万的并发用户。团队有专业的性能测试工程师能够深入分析结果。避坑指南LoadRunner学习曲线陡峭脚本录制容易但调试和增强参数化、关联、检查点需要深厚功底。它的“重”也体现在资源消耗上一个控制台Controller可能就需要一台不错的机器大量虚拟用户更需要庞大的负载生成器Load Generator集群。对于简单的HTTP接口压测用JMeter或Gatling可能更轻快。3. 实战组合拳从单点工具到测试体系理解了各自的定位我们来看看怎么打组合拳。一个中等规模的互联网产品测试理想的自动化体系应该是分层的不同工具负责不同层次。3.1 场景一以Web为核心的产品线这是目前最常见的场景。假设我们有一个电商平台前端是React单页应用后端是Java微服务。底层接口自动化Python/Java Requests pytest/TestNG这是自动化金字塔的基石性价比最高。我们不直接用LoadRunner或Selenium做日常接口测试。而是用编程语言如Python的Requests库发送HTTP请求配合单元测试框架进行断言。这部分脚本运行极快、稳定性极高可以放入CI流水线每次代码提交都执行。工具选型理由轻量、快速、与开发栈同源便于协作和问题定位。中间层Web UI 关键业务流程自动化Selenium Page Object pytest用于覆盖核心的、稳定的前端用户旅程比如“用户登录-搜索商品-加入购物车-下单支付”。我们使用Selenium实现但必须采用页面对象模型Page Object Model, POM设计模式。每个页面封装成一个类页面的元素定位和操作作为类的方法。测试脚本只调用这些方法不包含任何定位细节。这极大提升了脚本的可读性和可维护性。工具选型理由Selenium对现代Web技术支持好生态丰富能集成到CI中做冒烟测试或回归测试。POM模式是应对UI变化的有效手段。顶层端到端性能测试LoadRunner/ JMeter在版本发布前我们需要进行全链路的性能压测。这里使用LoadRunner的WebHTTP/HTML协议。录制或编写脚本模拟用户从登录到下单的完整流程。关键操作参数化将脚本中的用户名、商品ID等数据替换为参数从文件中读取模拟不同用户。关联处理服务器返回的动态值如Session ID、订单号将其保存为变量供后续请求使用。事务将“加入购物车”、“提交订单”等关键步骤定义为事务以便单独分析其性能。集合点在“秒杀”场景设置集合点让所有虚拟用户在同一时刻点击“抢购”制造瞬时高压。工具选型理由LoadRunner的场景控制、监控和分析能力强大适合做正式的性能验收。如果团队更熟悉开源JMeter是很好的替代但多协议支持和资源监控集成需要更多手工配置。3.2 场景二混合架构C/S客户端 Web后台假设我们是一个股票交易系统用户使用Windows桌面客户端可能是.NET WPF开发进行交易后台有Web管理端。客户端GUI自动化QTP/UFT对于交易客户端的下单、撤单、查询等核心功能使用QTP进行自动化。利用其强大的对象识别能力稳定地操作桌面控件。实操要点充分利用描述性编程Descriptive Programming作为对象库的补充。当某些动态对象无法被正常识别到对象库时可以直接在脚本中通过对象的属性描述来定位它增加脚本的灵活性。Web管理端自动化Selenium后台的运营管理、风控审核等Web功能使用Selenium框架进行测试。两者完全独立。接口与性能测试客户端与服务器之间的通信接口可能是Socket或私有协议可以使用LoadRunner的Windows Sockets协议进行录制和压测验证服务器在高并发交易请求下的处理能力。Web管理端的接口同样用PythonRequests做自动化用JMeter/LoadRunner做性能测试。如何协同虽然工具不同但测试用例管理、缺陷管理、持续集成可以统一。例如所有自动化脚本的执行都可以通过Jenkins等CI工具来调度。QTP脚本可以通过调用命令行执行Selenium脚本本身就是代码LoadRunner也有命令行控制器。Jenkins收集结果统一报告。4. Selenium 2 (WebDriver) 深度实战与避坑指南这里我们深入最常用的Selenium分享一套可直接落地的实战方案和那些必须知道的坑。4.1 环境搭建与框架选型Python版为例很多人卡在第一步。一个清晰的环境是成功的一半。安装Python与Selenium这很简单pip install selenium。下载浏览器驱动这是第一个坑。驱动版本必须与浏览器版本严格匹配。ChromeDriver去淘宝NPM镜像站或官方下载版本号要对应你的Chrome版本。GeckoDriver for Firefox同样需要版本对应。关键技巧将驱动所在目录添加到系统PATH环境变量或者更简单的在代码中指定驱动路径from selenium import webdriver driver webdriver.Chrome(executable_pathr你的路径/chromedriver.exe) # Windows示例选择测试框架强烈推荐pytest。它比unittest更简洁、功能更强大夹具fixture、参数化、插件生态。项目结构这是区分新手和老手的关键。一个典型的POM项目结构如下project/ ├── pages/ # 页面对象类 │ ├── __init__.py │ ├── login_page.py │ └── home_page.py ├── tests/ # 测试用例 │ ├── __init__.py │ └── test_login.py ├── conftest.py # pytest全局配置、夹具定义 ├── configs/ # 配置文件环境URL、账号等 ├── utils/ # 工具类读取文件、日志、截图等 ├── reports/ # 测试报告 └── requirements.txt # 依赖包列表4.2 等待机制稳定性的生命线元素找不到NoSuchElementException是Selenium脚本失败的首要原因90%以上是因为页面没加载完。有三种等待方式强制等待time.sleep(5)。绝对禁止在正式脚本中使用这是懒惰和不稳定的根源。隐式等待driver.implicitly_wait(10)。设置一个全局等待时间在查找任何元素时如果找不到会轮询等待直到超时。问题它是全局的对不存在的元素也会傻等且无法处理元素可点击、可见等复杂条件。显式等待这是唯一推荐在生产中大量使用的方式。它等待某个条件成立后再继续。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待一个元素可被点击最多等10秒每0.5秒检查一次 element WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, submit-button)) ) element.click()核心技巧封装你自己的等待工具函数比如等待元素出现、消失、包含特定文本等让测试用例更清晰。4.3 高级定位策略与动态元素处理除了基本的ID、Name、XPath、CSS Selector需要掌握更多技巧。相对XPath和CSS Selector避免使用绝对路径如/html/body/div[3]/div[2]/form/input。好的XPath//button[typesubmit and text()登录]//div[classproduct-list]//a[contains(href, item)]好的CSSinput.form-control[nameemail]div.list ul li:first-child处理动态ID/Class前端框架常生成随机字符串。使用contains,starts-with,ends-with等XPath函数//div[starts-with(id, message-)]通过其他稳定属性定位//input[placeholder请输入用户名]处理iframe操作iframe内的元素前必须切换进去。# 通过ID或索引切换 driver.switch_to.frame(iframe-id) # 操作iframe内元素... # 操作完后切回主文档 driver.switch_to.default_content()处理弹窗Alert/Confirm/Prompt# 等待弹窗出现并接受 WebDriverWait(driver, 5).until(EC.alert_is_present()) alert driver.switch_to.alert print(alert.text) alert.accept() # 点击确定 # alert.dismiss() # 点击取消4.4 常见问题排查与实战技巧实录脚本在本地跑得好好的一上CI如Jenkins就失败原因CI服务器通常是Linux无图形界面环境。Selenium需要浏览器而Chrome/Firefox在无界面模式下运行需要额外配置。解决方案使用无头模式Headless Mode。from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) # 无头模式 options.add_argument(--no-sandbox) # 绕过沙盒常在Linux下需要 options.add_argument(--disable-dev-shm-usage) # 解决共享内存问题 driver webdriver.Chrome(optionsoptions)被网站识别为自动化脚本触发反爬或验证码原因浏览器在自动化模式下会暴露一些特征如navigator.webdriver属性为true。缓解措施无法完全避免使用ChromeOptions或FirefoxOptions添加excludeSwitches和arguments。options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False) options.add_argument(--disable-blink-featuresAutomationControlled)更高级的做法是使用undetected-chromedriver这类第三方库但可能涉及版本兼容问题。下拉框Select处理不要用click模拟用Select类。from selenium.webdriver.support.ui import Select select_element Select(driver.find_element(By.ID, country)) select_element.select_by_visible_text(中国) # 按文本选 select_element.select_by_value(CN) # 按value选 select_element.select_by_index(1) # 按索引选文件上传对于input typefile元素直接使用send_keys传入文件本地绝对路径即可。千万不要尝试用click()去打开系统文件选择框那是操作系统级别的Selenium控制不了。driver.find_element(By.ID, file-upload).send_keys(/Users/yourname/Desktop/test.jpg)日志与截图这是调试和生成报告的关键。务必在关键步骤和失败时截图。# 在conftest.py中定义自动截图夹具 import pytest from datetime import datetime pytest.hookimpl(hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield report outcome.get_result() if report.when call and report.failed: driver item.funcargs.get(driver) # 假设driver是夹具注入的 if driver: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) screenshot_path f./reports/screenshot_failure_{item.name}_{timestamp}.png driver.save_screenshot(screenshot_path) # 可以将路径添加到报告里 report.extra [pytest_html.extras.image(screenshot_path, 失败截图)]5. LoadRunner性能测试实战核心流程性能测试是一门系统工程LoadRunner提供了完整的工具链但思路比工具操作更重要。5.1 脚本录制与增强不只是“录”和“放”协议选择这是第一步选错协议录出来的脚本无法回放。对于现代Web应用首选Web - HTTP/HTML协议。如果应用大量使用WebSocket可能需要结合其他方式。录制技巧开始录制前清理浏览器缓存和Cookie确保是一个干净的会话。录制时操作速度适中尽量模拟真实用户思考时间。在需要关注的事务点如登录、搜索前后可以插入事务Transaction和注释Comment。录制后立即在VuGen中回放一遍确保脚本能跑通。脚本增强这是核心价值所在删除冗余自动录制的脚本包含了很多不必要的请求如图片、CSS、JS等静态资源。在“Recording Options”中可以选择只录制HTML或者在脚本中删除这些无关的请求让脚本更干净压测更精准。参数化Parameterization将脚本中的常量如用户名、搜索关键词替换为参数。右键点击值 - “Replace with a Parameter”。数据可以来自文件、数据库或内部函数。这是模拟真实用户的关键。技巧对于唯一性约束的数据如注册用户名选择“Unique”并设置数据块大小。关联Correlation处理服务器返回的动态值。这是LoadRunner脚本开发中最难的部分。最常见的动态值是Session ID、ViewState、Token等。自动关联回放脚本后VuGen可能会提示动态值可以尝试自动关联。手动关联更多时候需要手动。比较录制和回放的服务器响应找到动态变化的部分使用web_reg_save_param_ex等函数将其捕获到变量中并在后续请求中使用。添加检查点Checkpoint使用web_reg_find或web_find函数验证页面是否包含预期的文本确保业务逻辑正确而不仅仅是HTTP 200。添加事务Transaction在VuGen中选中一段代码右键可以插入“Start Transaction”和“End Transaction”。给事务起一个有意义的名称如lr_login。分析报告时我们主要看这些事务的响应时间。5.2 场景设计与执行模拟真实世界脚本准备好后在Controller中设计场景。虚拟用户组可以创建多个组运行不同的脚本模拟不同角色的用户如浏览用户、下单用户。负载生成器Load Generator确保有足够的机器作为负载机并正确连接。负载机本身性能要足够好避免成为瓶颈。调度器Schedule逐步加压Ramp Up虚拟用户数随时间线性增加用于观察系统性能随负载增加的变化趋势找到性能拐点。瞬间加压Flat一开始就达到最大并发用户数用于测试系统的瞬时抗压能力。波浪式Goal-Oriented更复杂用于模拟潮汐流量。集合点Rendezvous在脚本中插入lr_rendezvous(“秒杀”)。在场景中设置该集合点策略让所有用户到达这里后同时释放制造并发峰值。监控器Monitors这是LoadRunner的精华。添加需要监控的服务器资源计数器Windows性能计数器、Linux的SSH或rstatd、数据库计数器等。关键指标CPU利用率70%、内存使用率、磁盘队列长度、网络带宽、应用服务器线程池、数据库连接数、慢查询等。5.3 结果分析与瓶颈定位从数据到结论测试执行完成后用Analysis打开结果进行深度分析。不要只看平均响应时间。首先看“通过/失败”如果有大量错误先解决错误如超时、服务器错误错误下的性能数据没有意义。核心图表分析运行虚拟用户数图确认负载是否按计划施加。事务响应时间图重点关注在负载下关键事务如登录、下单的响应时间趋势。是否随用户数增加而急剧上升找到拐点。每秒点击次数/吞吐量图随着用户增加吞吐量是否线性增长如果到达某点后不再增长甚至下降说明系统达到瓶颈。资源监控图将事务响应时间与服务器CPU、内存、磁盘IO、数据库连接数等叠加查看。经典模式事务时间变长时如果CPU也持续在90%以上则瓶颈很可能在CPU如果CPU不高但磁盘队列很长则瓶颈在磁盘IO如果吞吐量上不去网络带宽已满则瓶颈在网络。生成报告使用Analysis的“报告”功能生成HTML或Word格式的详细报告包含关键图表和数据分析用于归档和汇报。性能测试心法性能测试的目标不是“跑一遍”而是发现瓶颈、定位瓶颈、提出优化建议。一个完整的性能测试周期是测试-分析-调优-再测试。对比调优前后的结果用数据证明优化的效果。6. 自动化测试框架设计与持续集成工具是武器框架是战术CI/CD是将战术转化为持续战斗力的流水线。6.1 设计一个健壮的自动化测试框架无论是用Selenium还是其他工具都需要一个好的框架来支撑。一个最小化的健壮框架应包括配置管理将环境URL、数据库连接、账号密码等与代码分离通过配置文件如YAML、JSON、.env文件或环境变量管理。不同环境测试、预生产切换只需改配置。页面对象模型POM如前所述这是UI自动化的基石。进一步可以引入页面工厂或基类来封装公共操作如等待、截图、日志。数据驱动测试数据与测试脚本分离。使用外部文件Excel、CSV、JSON或数据库来存储测试数据。pytest的pytest.mark.parametrize装饰器是实现数据驱动的利器。日志系统使用Python的logging模块配置不同级别的日志INFO, DEBUG, ERROR输出到文件和控制台便于调试和追溯。报告系统使用pytest-html、Allure等插件生成美观的HTML测试报告。Allure报告尤其强大可以展示用例层级、步骤、附件截图、日志非常直观。异常处理与重试机制网络波动、元素短暂未加载成功可能导致偶发失败。可以实现一个重试机制对某些特定异常如StaleElementReferenceException进行自动重试。工具类封装将常用操作封装成工具函数如随机生成数据、数据库操作、API请求、文件读写等。6.2 集成到CI/CD流水线以Jenkins为例自动化测试只有集成到CI/CD中才能实现其最大价值——持续反馈。Jenkins任务配置源码管理从Git仓库拉取你的自动化测试代码。构建触发器可以定时构建如每晚或通过Git的Webhook触发代码提交后的构建。构建环境可能需要配置Python/Java环境安装依赖pip install -r requirements.txt。构建步骤执行测试命令如pytest tests/ --alluredir./allure-results。后置操作收集测试结果和报告如Allure报告、JUnit XML格式结果。如果测试失败可以配置邮件通知或即时通讯工具如钉钉、企业微信通知相关负责人。将报告发布到Jenkins页面或上传到专门的文件服务器。关键实践分层执行在流水线中先跑快速的单元测试和接口测试再跑较慢的UI测试。可以将UI测试作为夜间构建或发布前的门禁。环境隔离确保CI服务器上的测试环境是独立、稳定的避免与手工测试相互干扰。测试数据管理CI执行时要能自动准备和清理测试数据保证每次测试的独立性。7. 未来展望与技能提升自动化测试领域也在快速演进。传统的工具和模式依然有效但新的趋势值得关注API测试与契约测试在微服务架构下API测试比UI测试更重要、更稳定。契约测试如Pact能确保服务提供者和消费者之间的接口约定不被破坏是更前沿的保障手段。低代码/无代码自动化平台对于业务测试人员像Katalon Studio TestProject等工具提供了更友好的界面。但它们底层可能还是基于Selenium/Appium了解原理依然重要。AI在测试中的应用目前更多是辅助如图像识别定位解决动态元素、测试用例生成、缺陷预测等。完全替代人工还为时尚早但可以提升效率。Playwright与Cypress这是Selenium的现代竞争者。Playwright支持多浏览器Chromium, Firefox, WebKit且由微软开发API设计更现代自动等待机制更好。Cypress则运行在浏览器内部对现代JavaScript框架支持极佳调试体验好。它们代表了下一代Web自动化测试的方向值得学习。给测试工程师的建议不要把自己局限为“QTP工程师”或“Selenium工程师”。工具会变但核心能力永不过时缜密的测试思维、扎实的计算机基础网络、操作系统、数据库、良好的编程能力、快速学习新技术的能力。掌握一门主流的编程语言Python/Java理解HTTP协议会用基本的SQL和Linux命令这些才是你职业生涯的压舱石。在这个基础上再去学习QTP、Selenium、LoadRunner、JMeter、Postman等具体工具你会发现它们不过是不同场景下你手中趁手的兵器而已。