尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

JMeter接口自动化测试实战:从核心概念到性能压测

JMeter接口自动化测试实战:从核心概念到性能压测
📅 发布时间:2026/7/6 10:16:13

1. 项目概述:为什么选择JMeter进行接口测试?

如果你是一名测试工程师、后端开发,或者正在学习软件测试,那么“接口测试”这个词对你来说一定不陌生。在微服务架构和前后端分离成为主流的今天,接口作为系统间通信的契约,其质量直接决定了整个应用的稳定性和用户体验。手动测试接口?效率太低,回归测试更是噩梦。这时候,一个趁手的自动化测试工具就成了刚需。

市面上工具不少,Postman、Apifox、SoapUI各有拥趸,但当我需要模拟高并发、进行压力测试、或者构建一个包含复杂逻辑(如参数化、断言、条件判断)的自动化测试套件时,我的首选始终是Apache JMeter。原因很简单:它开源、免费、功能强大且极其灵活。虽然它常被贴上“性能测试工具”的标签,但其在接口功能自动化测试领域的潜力,常常被新手低估。

很多人第一次打开JMeter,会被它略显复古的界面和复杂的元件树吓退,觉得学习曲线陡峭。但我想说,一旦你掌握了它的核心逻辑,你会发现用它来搭建稳定、可重复、可报告的接口自动化测试框架,效率非常高。这篇教程,我将以一个资深测试的角度,带你从零开始,不仅学会用JMeter“点”通一个接口,更要理解其背后的设计思想,掌握构建健壮测试脚本的完整方法论,并分享那些官方文档里不会写的实战经验和避坑指南。

2. JMeter核心概念与测试计划设计

在动手之前,我们必须先理解JMeter的几个核心概念。这就像学开车,你得先知道方向盘、油门、刹车在哪,而不是直接上路。

2.1 理解JMeter的元件层次结构

JMeter的测试脚本结构是一棵树,根节点是测试计划(Test Plan)。你可以把它想象成一个项目容器,里面装着你所有的测试资产。

  • 线程组(Thread Group):这是测试计划的执行单元,定义了虚拟用户(线程)的数量和行为。比如,你想模拟10个用户同时操作,或者让用户一个接一个地执行,都在这里配置。它是所有取样器、逻辑控制器、监听器的“父亲”。
  • 取样器(Sampler):这是真正干活的部分,负责向服务器发送请求。最常用的就是HTTP请求取样器,用来测试RESTful API或HTTP接口。此外还有JDBC请求(测数据库)、TCP请求等。
  • 逻辑控制器(Logic Controller):它决定了取样器的执行顺序和逻辑。比如,循环控制器可以让请求重复执行;仅一次控制器确保某个请求只在每个线程的第一次迭代中执行;如果(If)控制器可以根据条件决定是否执行其子元件。这是实现复杂测试逻辑的关键。
  • 配置元件(Config Element):为取样器提供预备数据或配置。例如,HTTP信息头管理器用来设置请求头(如Content-Type: application/json);CSV数据文件设置可以从外部文件读取测试数据;用户定义的变量可以设置全局变量。
  • 前置处理器(Pre Processor)和后置处理器(Post Processor):分别在取样器执行前和后执行。前置处理器常用于修改请求,后置处理器则用于从响应中提取数据(如使用JSON提取器或正则表达式提取器提取一个token,供后续请求使用)。
  • 断言(Assertion):用来验证响应结果是否符合预期。这是自动化测试的“检查官”。响应断言可以检查响应文本、代码、头信息;JSON断言则专门用于验证JSON格式的响应体。
  • 监听器(Listener):用来收集、查看和分析测试结果。查看结果树让你能看到每个请求和响应的详情,是调试神器;聚合报告和汇总报告则提供吞吐量、响应时间、错误率等关键性能指标的统计视图。

我的经验:新手最容易犯的错误就是直接在“测试计划”下添加取样器。记住,取样器必须放在“线程组”或“逻辑控制器”之下,否则无法执行。JMeter的执行引擎是从线程组开始,向下遍历其子元件的。

2.2 设计一个可维护的测试计划结构

一个杂乱无章的测试脚本就像一团乱麻,维护起来极其痛苦。在创建第一个请求前,我强烈建议你规划好脚本结构。一个好的结构能极大提升脚本的可读性和可维护性。

我通常采用以下模块化结构来组织我的测试计划:

  1. 全局配置区(放在线程组外部):

    • 用户定义的变量:存放环境URL(如base_url = https://api.example.com)、全局账号密码等。这样切换测试环境(从测试环境切到预发布环境)只需改这一个地方。
    • HTTP请求默认值:如果你有多个请求都访问同一个服务器和端口,可以在这里统一设置,后面的HTTP请求取样器会自动继承,避免重复填写。
    • HTTP信息头管理器(全局):设置一些通用的请求头,比如User-Agent。
  2. 线程组(根据测试场景划分):

    • 冒烟测试组:包含核心接口的简单验证,线程数设为1,快速验证服务是否可用。
    • 功能测试组:包含完整的业务流程测试用例,可以使用循环控制器和CSV数据文件设置来实现数据驱动测试。
    • 性能测试组:专门用于压力测试,设置更高的线程数和循环次数。
  3. 线程组内部结构:

    • 使用事务控制器(Transaction Controller)将一组相关的请求(如“登录-查询-登出”)打包,JMeter会统计这组请求的整体响应时间,这对于衡量业务流程性能非常有用。
    • 将通用的配置(如针对特定API的请求头)放在事务控制器或更高级别的逻辑控制器下,实现配置的继承和复用。

下面是一个简单的结构示例:

测试计划 ├── 用户定义的变量 (base_url, username...) ├── HTTP请求默认值 (服务器名称: ${base_url}) ├── 线程组: 用户登录流程 │ ├── CSV数据文件设置 (读取用户账号) │ ├── 事务控制器: 登录并获取用户信息 │ │ ├── HTTP请求: POST /login (使用JSON提取器获取token) │ │ ├── HTTP信息头管理器 (添加 Authorization: Bearer ${token}) │ │ ├── HTTP请求: GET /user/profile │ │ └── 响应断言 (验证profile接口返回状态码200) │ └── 查看结果树 (监听器) └── 线程组: 商品查询压测 ├── 吞吐量控制器 (控制压力分布) └── HTTP请求: GET /products

3. 从零开始:第一个JMeter接口测试脚本实战

理论讲得再多,不如动手操作一遍。让我们从一个最简单的HTTP GET请求开始,逐步添加核心功能。

3.1 环境准备与JMeter安装

首先,确保你的电脑已经安装了Java 8或更高版本(JMeter基于Java)。在命令行输入java -version可以验证。

然后,去Apache JMeter官网下载最新版本。建议下载“Binaries”压缩包(如apache-jmeter-5.6.3.zip),解压即用,绿色便携。解压后,进入bin目录,双击jmeter.bat(Windows)或运行./jmeter(Mac/Linux)即可启动。

避坑指南:启动时如果遇到闪退或报错“Not able to find Java executable”,通常是环境变量JAVA_HOME没有正确设置。你需要设置系统环境变量JAVA_HOME,指向你的JDK安装目录(例如C:\Program Files\Java\jdk-17),并将%JAVA_HOME%\bin添加到Path变量中。

3.2 创建测试计划与线程组

  1. 启动JMeter,你会看到一个空白的“测试计划”。
  2. 右键点击“测试计划” -> “添加” -> “线程(用户)” -> “线程组”。一个线程组就创建好了。
  3. 在线程组面板中,我们配置基础的负载模型:
    • 线程数(用户):设为1。这表示我们模拟1个虚拟用户。功能测试时通常设为1。
    • Ramp-Up时间(秒):设为0。这表示所有线程立即启动。在压力测试中,你可以设置为10,表示在10秒内逐步启动所有线程,给系统一个缓冲。
    • 循环次数:设为1。表示每个线程只执行一次其内部的请求。勾选“永远”会让测试一直运行,直到手动停止。

3.3 添加并配置HTTP请求取样器

现在,我们来测试一个免费的公共API:https://jsonplaceholder.typicode.com/posts/1,它会返回一篇示例博客文章。

  1. 右键点击“线程组” -> “添加” -> “取样器” -> “HTTP请求”。
  2. 在HTTP请求控制面板中填写:
    • 协议:https
    • 服务器名称或IP:jsonplaceholder.typicode.com
    • HTTP请求:GET
    • 路径:/posts/1
    • 其他参数(如端口、请求参数、消息体数据)暂时留空。

3.4 添加监听器查看结果

没有监听器,我们就不知道请求是否成功,响应是什么。

  1. 右键点击“线程组” -> “添加” -> “监听器” -> “查看结果树”。
  2. 点击工具栏上的绿色“开始”按钮(或按Ctrl+R)运行测试。
  3. 在“查看结果树”中,点击你刚发送的请求,你会在右侧看到“取样器结果”、“请求”和“响应数据”三个标签页。在“响应数据”中,你应该能看到一个JSON格式的博客文章数据,并且“取样器结果”显示为绿色,状态码为200。恭喜,你的第一个JMeter接口请求成功了!

3.5 为请求添加断言

自动化测试的核心是“自动判断”。我们不能每次都用人眼去看响应。断言就是我们的自动判断器。

  1. 右键点击刚才创建的“HTTP请求” -> “添加” -> “断言” -> “响应断言”。
  2. 我们添加两个断言来验证这个接口:
    • 验证状态码:在响应断言面板,“要测试的响应字段”选择“响应代码”;“模式匹配规则”选择“等于”;“要测试的模式”点击“添加”,输入200。
    • 验证响应体包含特定内容:再添加一个响应断言。“要测试的响应字段”选择“响应文本”;“模式匹配规则”选择“包含”;“要测试的模式”输入"userId": 1(因为返回的JSON中应该包含这个字段)。

再次运行测试。在“查看结果树”中,即使响应正确,断言也会被执行。如果断言失败,对应的请求会显示为红色,并在“断言结果”标签页(需要额外添加“断言结果”监听器)中看到失败详情。

实操心得:查看结果树监听器在调试时非常有用,但它会消耗大量内存,尤其是运行大量请求时。在正式进行压力测试或长时间运行的自动化测试时,务必禁用或删除它,改用聚合报告、汇总报告等轻量级监听器,或者将结果写入文件(使用Simple Data Writer监听器)。

4. 进阶技巧:构建复杂、健壮的测试脚本

只会测一个简单的GET请求远远不够。真实的业务场景要复杂得多:需要登录、传递各种参数、处理动态数据、检查复杂的响应。

4.1 处理POST请求与JSON请求体

测试创建资源的接口(如创建用户、发布文章)通常需要使用POST方法和JSON格式的请求体。

  1. 在“线程组”下再添加一个“HTTP请求”取样器。
  2. 配置如下:
    • 协议:https
    • 服务器名称或IP:jsonplaceholder.typicode.com
    • HTTP请求:POST
    • 路径:/posts
    • 内容编码:utf-8(通常保持默认)
  3. 最关键的一步:传递JSON请求体。
    • 在“消息体数据”标签页下的文本框中,直接输入JSON内容,例如:
      { "title": "foo", "body": "bar", "userId": 1 }
  4. 必须告诉服务器我们发送的是JSON。右键点击这个“HTTP请求” -> “添加” -> “配置元件” -> “HTTP信息头管理器”。
  5. 在信息头管理器中,点击“添加”,设置:
    • 名称:Content-Type
    • 值:application/json

现在运行这个POST请求,在“查看结果树”中查看,如果成功,响应状态码应为201(Created),并且返回的JSON中会包含你发送的数据和一个新生成的id字段。

4.2 使用JSON提取器实现接口关联

这是自动化测试中最关键的技巧之一。一个接口的响应输出,可能是另一个接口的输入。例如,登录接口返回一个token,查询用户信息接口需要携带这个token。

我们以JSONPlaceholder的API为例模拟这个流程:先调用GET /posts/1获取文章ID,再调用GET /comments?postId={id}获取该文章的评论。

  1. 首先,确保你有第一个请求(GET /posts/1)。
  2. 右键点击这个请求 -> “添加” -> “后置处理器” -> “JSON提取器”。
  3. 配置JSON提取器:
    • 变量名称:article_id(这是你定义的变量名,后续用${article_id}来引用)
    • JSON路径表达式:$.id(这个表达式指向响应JSON中的id字段。$代表根节点)
    • 匹配数字:1(如果返回的是数组,0表示第一个,1表示第二个,依此类推;对于单个对象,填1或0都可以)
  4. 添加第二个HTTP请求(GET /comments)。
  5. 在它的“路径”或“参数”中,使用刚才提取的变量。例如,在“路径”中填写:/comments?postId=${article_id}。或者,在“参数”表中添加一个参数,名称为postId,值为${article_id}。

运行测试,JMeter会自动将第一个请求返回的id(比如是1)传递给第二个请求,实现接口间的数据关联。

4.3 数据驱动测试:使用CSV文件

当我们需要用多组数据测试同一个接口时(例如测试登录功能,使用正确密码、错误密码、空密码等多种情况),手动修改脚本非常低效。数据驱动测试是解决之道。

  1. 准备一个CSV文件(可以用记事本或Excel创建,保存为test_data.csv),内容如下:

    username,password,expected_code correct_user,correct_pass,200 wrong_user,wrong_pass,401 ,empty_pass,400

    注意:文件不要有表头(第一行就是数据),或者你在JMeter配置中忽略表头。

  2. 在线程组下,右键 -> “添加” -> “配置元件” -> “CSV数据文件设置”。

  3. 配置CSV数据文件设置:

    • 文件名:浏览选择你的test_data.csv文件。强烈建议使用绝对路径,或者将文件放在JMeter的bin目录下使用相对路径,避免脚本移动后找不到文件。
    • 文件编码:UTF-8
    • 变量名称(逗号分隔):username,password,expected_code(这定义了三个变量,对应CSV文件的三列)
    • 忽略首行(仅当文件包含列名时使用):如果CSV第一行是列名,就勾选True。
    • 遇到文件结束符再次循环?:False(数据用完就停止)
    • 遇到文件结束符停止线程?:True
  4. 修改你的登录HTTP请求:

    • 在“消息体数据”中,使用变量:{"username":"${username}","password":"${password}"}
    • 修改你的响应断言,将期望的状态码改为变量:${expected_code}
  5. 将线程组的“循环次数”设置为与CSV数据行数一致(例如3),或者设置为“永远”,并设置“CSV数据文件设置”中的循环选项。

运行脚本,JMeter会依次读取CSV文件中的每一行数据,代入到请求和断言中执行,实现一次脚本编写,多组数据测试。

4.4 使用逻辑控制器组织测试流程

逻辑控制器让你能像编程一样控制测试流程。

  • 循环控制器:将其子元件重复执行N次。把它放在线程组里,可以控制整个场景的重复次数;放在某个请求外面,可以单独重复该请求。
  • 仅一次控制器:每个线程在整个测试过程中,只执行一次其内部的元件。常用于登录操作,你肯定不希望每个迭代都登录一次。
  • 如果(If)控制器:根据条件决定是否执行。条件可以使用JMeter函数或变量。例如,${JMeterThread.last_sample_ok}可以判断上一个请求是否成功,据此决定是执行成功流程还是失败流程。
  • 事务控制器:前面提到过,它把多个取样器合并为一个事务进行统计。在事务控制器面板,勾选“Generate parent sample”,那么在监听器中,你只会看到这个事务控制器的结果,而不是其内部每个请求的细节,这能让报告更清晰。

一个典型的使用场景:将“登录”请求放在“仅一次控制器”内,后面跟着“查询用户信息”、“修改资料”等请求。这样,每个虚拟用户只在开始时登录一次,然后执行后续操作,更符合真实用户行为。

5. 测试执行、结果分析与性能测试初探

脚本写好了,如何运行并解读结果?

5.1 运行模式与结果收集

  • GUI模式运行:点击绿色开始按钮。仅用于调试和脚本开发。因为GUI本身会消耗大量系统资源,影响测试结果的准确性。
  • 非GUI(命令行)模式运行:这是进行正式压力测试和生成报告的正确方式。打开命令行,进入JMeter的bin目录,执行:
    jmeter -n -t your_test_plan.jmx -l result.jtl -e -o ./report_folder
    • -n: 非GUI模式
    • -t: 指定测试脚本(.jmx文件)
    • -l: 指定结果日志文件(.jtl)
    • -e: 测试结束后生成HTML报告
    • -o: 指定HTML报告的输出目录(必须为空目录或不存在)

生成的HTML报告非常专业,包含了各种图表和统计数据,可以直接分享给团队。

5.2 关键性能指标解读

在“聚合报告”或HTML报告中,你会看到以下关键指标,理解它们对性能测试至关重要:

指标含义解读
样本数(Samples)总共发出的请求数量。总负载量。
平均值(Average)请求的平均响应时间(毫秒)。整体响应速度。通常与“中位数”结合看,如果平均值远大于中位数,说明有少量极慢的请求拉高了均值。
中位数(Median)50%的请求响应时间小于此值。更能代表“典型”用户的体验。
90%/95%/99%百分位(90% Line)90%的请求响应时间小于此值。黄金指标。例如90% Line=2000ms,意味着90%的用户在2秒内得到了响应。这比平均值更能反映用户体验。
最小值(Min)/最大值(Max)最快和最慢的响应时间。观察异常值。
异常%(Error %)失败请求的百分比。必须关注的指标,理想情况下应为0%。
吞吐量(Throughput)服务器每秒处理的请求数(requests/second)。系统处理能力的核心指标。在并发用户数增加时,吞吐量先增后平甚至下降,那个拐点就是系统的瓶颈点。
接收/发送KB/sec网络吞吐量。辅助判断网络或带宽是否成为瓶颈。

5.3 一个简单的压力测试场景配置

让我们把之前的简单GET请求,配置成一个持续30秒的压力测试。

  1. 修改“线程组”配置:

    • 线程数(用户):50(模拟50个并发用户)
    • Ramp-Up时间(秒):5(在5秒内逐步启动这50个用户,避免对服务器造成瞬时冲击)
    • 循环次数:勾选“永远”
    • 调度器:勾选“调度器”,设置“持续时间(秒)”为30。
  2. 添加监听器:“聚合报告”和“用表格查看结果”。

  3. 重要:在运行前,在“测试计划”级别,勾选“独立运行每个线程组”和“在主线程结束后运行tearDown线程组”(通常保持默认即可)。更重要的是,移除或禁用“查看结果树”监听器,因为它会严重消耗内存。

  4. 保存脚本,使用命令行模式运行。

运行结束后,分析“聚合报告”中的吞吐量、错误率和90%百分位响应时间。如果错误率飙升或响应时间急剧增加,就说明在当前配置下,系统可能已经达到了性能瓶颈。

6. 常见问题排查与实战经验分享

即使按照教程操作,你也可能会遇到各种问题。这里我总结了一些高频问题和解决方案。

6.1 请求发送失败或响应异常

  • 问题:响应数据乱码。
    • 排查:检查HTTP请求中的“内容编码”是否设置为UTF-8(特别是POST请求体含中文时)。检查“HTTP信息头管理器”是否设置了正确的Content-Type,如application/json;charset=utf-8。
  • 问题:连接被拒绝 (java.net.ConnectException)。
    • 排查:检查“服务器名称或IP”和“端口”是否正确;检查目标服务器服务是否启动;检查本地防火墙或网络策略是否阻止了连接。
  • 问题:Address already in use: connect。
    • 排查:这是Windows系统上一个常见问题,由于本地端口耗尽导致。JMeter作为客户端,每个线程的每个连接都会使用一个本地端口。当短时间内发起大量连接时,Windows的TCP/IP端口释放和重用机制可能导致此问题。
    • 解决:
      1. 减少线程数或增加Ramp-Up时间,降低新建连接的速度。
      2. 在HTTP请求的“高级”选项卡中,勾选“Use KeepAlive”,允许连接复用。
      3. 修改Windows注册表,缩短WaitToFail和MaxUserPort等TCP参数的时间(需谨慎,可搜索相关教程)。

6.2 断言失败但响应看起来正确

  • 问题:响应断言匹配不到文本。
    • 排查:首先在“查看结果树”中确认“响应数据”标签页里确实包含你期望的文本。注意大小写和空格。如果响应是JSON,尝试使用“JSON断言”而不是“响应断言”,它更精确。
    • 技巧:在响应断言的“要测试的模式”中,可以尝试使用正则表达式。例如,如果你想检查响应中包含“success”或“Success”,可以写(?i)success,(?i)表示忽略大小写。

6.3 变量未正确替换或提取

  • 问题:${variable} 没有被替换,原样显示在请求中。
    • 排查:
      1. 检查变量名拼写是否正确,JMeter变量引用是大小写敏感的。
      2. 检查定义该变量的元件(如“用户定义的变量”、“JSON提取器”、“正则表达式提取器”)是否在作用域内,并且先于当前请求执行。JMeter的执行顺序是:配置元件 -> 前置处理器 -> 定时器 -> 取样器 -> 后置处理器 -> 断言 -> 监听器。一个元件只能引用在其之前执行的元件所定义的变量。
      3. 使用调试工具:添加一个“调试取样器(Debug Sampler)”和一个“查看结果树”,运行后查看调试取样器的响应,里面会列出JMeter当前可用的所有变量及其值。

6.4 性能测试结果不准确

  • 问题:本机资源成为瓶颈。
    • 现象:运行压力测试时,自己的电脑CPU或内存占用率100%,而服务器监控显示负载很低。
    • 解决:
      1. 使用非GUI模式:这是最基本也是最重要的一条。
      2. 减少监听器:只保留必要的轻量级监听器(如聚合报告),或将结果写入文件。
      3. 分布式测试:如果单台机器无法产生足够压力,可以使用JMeter的分布式测试功能。在一台机器上作为控制机,在其他多台机器上启动JMeter Server(执行机),由控制机统一调度和收集结果。这需要配置jmeter.properties文件中的远程主机列表。
      4. 调整JMeter自身配置:编辑bin/jmeter.bat(Windows)或jmeter(Linux/Mac),调整JVM堆内存参数,例如将HEAP从默认的-Xms1g -Xmx1g改为-Xms2g -Xmx4g(根据你的机器内存调整),避免JMeter自身因内存不足而频繁GC,影响测试。

6.5 脚本维护与最佳实践

  • 模块化与复用:将通用的配置(如登录、头部信息)保存为“片段”。在JMeter中,你可以通过“测试片段”和“模块控制器”来实现模块的复用。或者,更简单的方法是将常用配置保存为一个独立的.jmx文件,在其他脚本中用“包含控制器”来引用。
  • 参数化一切:不要将服务器地址、端口、路径等硬编码在请求中。使用“用户定义的变量”集中管理。这样,一套脚本只需修改变量值,就能轻松在不同环境(开发、测试、生产)中运行。
  • 善用定时器:在压力测试中,为了更真实地模拟用户操作,需要在请求之间加入思考时间。使用“固定定时器”、“高斯随机定时器”等来模拟用户等待。
  • 结果文件管理:命令行运行生成的.jtl结果文件是纯文本,可以用“聚合报告”监听器再次加载分析。定期清理旧的报告文件,并建议将脚本、测试数据、结果报告一起进行版本管理(如Git)。

最后,JMeter的功能远不止于此。你可以通过安装插件来扩展其能力,例如使用Custom Thread Groups插件实现更复杂的压力模型,使用PerfMon插件监控服务器资源(CPU、内存)。学习JMeter是一个持续的过程,从简单的接口测试入手,逐步深入到性能测试、分布式压测、持续集成,你会发现这个开源工具的强大和魅力。

相关新闻

  • 为何技术博客标题必须包含可执行信息
  • MATLAB精馏塔动态仿真GUI:塔板数、回流比等参数一键调节,实时查看组分与温度变化
  • 智能测试平台构建指南:从AI用例生成到Agent驱动执行

最新新闻

  • 根据long long类型判断c、c++遵循的标准版本
  • 3个技巧:如何用DriverStore Explorer彻底解决Windows驱动堆积问题
  • WPS-Zotero插件:5分钟搞定跨平台文献引用的终极解决方案
  • ObjToSchematic:让3D模型在Minecraft世界完美重生的魔法工具
  • Frida Hook Native 层:无导出函数偏移计算与 Interceptor 实战,覆盖 2 种寻址场景
  • 抖音无水印批量下载工具终极指南:免费获取高清视频的完整解决方案

日新闻

  • AI智能体安全防护框架AgentGuard:从原理到实战部署指南
  • KMX63与PIC18F26K40硬件组合及低功耗设计实践
  • 基于YOLO13改进的门体检测模型:C3k2模块与PoolingFormer技术解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号