性能测试+Jmeter介绍

文章目录

    • 什么是性能测试?
    • 性能测试的目的
    • 性能测试分类
      • 一般性能测试
      • 负载测试
      • 压力测试
      • 大数据量测试
      • 配置测试
      • 稳定性测试
    • 性能测试术语
      • 虚拟用户
      • 并发及并发用户数
      • 响应时间
      • 每秒事务数
      • 吞吐量、吞吐率
      • 点击率
      • 性能计数器
      • 资源利用率
    • 性能测试流程
      • 测试计划阶段
      • 测试设计阶段
      • 测试开发阶段
      • 测试执行阶段
      • 测试结果阶段
      • 测试报告阶段
    • 常见的性能问题
      • 资源泄露
      • 资源瓶颈
      • CPU使用率达到100%、系统被锁定等。
      • 线程死锁、线程阻塞等造成系统越来越慢,甚至系统挂起或出现异常错误、系统混乱局面等。
      • 查询速度慢或列表效率低
      • 受外部系统影响越来越大,最终造成应用系统越来越慢
    • JMeter简介
    • JMeter特点
    • JMeter安装
    • JMeter目录结构分析
    • JMeter工作区介绍
    • JMeter常用功能
    • JMeter运行原理
    • JMeter使用
      • 创建测试计划
      • 新建线程组
      • 开发脚本
        • Http请求设置-保持默认
        • 线程组设置
      • 运行场景
      • 查看监控
        • 聚合报告
        • 添加监听器
      • Badboy录制脚本
      • 代理方式录制脚本

什么是性能测试?

性能测试针对系统的性能指标,建立性能测试模型,制定性能测试方案,制定监控策略,在场景条件之下执行性能场景,分析判断性能瓶颈并调优,最终得出性能结果来评估系统的性能指标是否满足既定值。
在这里插入图片描述

性能测试的目的

  • 压测系统看系统的前端以及后端是否满足预期
  • 压测系统看系统是否可以承受的最佳压力和最大压力,来判断系统的承受极限
  • 压测系统看系统在长时间运行下是否可以正常处理请求(疲劳测试)
  • 容量规划

性能测试分类

一般性能测试

  • 一般性能测试主要验证软件在正常环境和系统条件下,即不施加任何压力情况下重复使用系统验证其是否能满足性能指标,如响应时间、系统资源占有情况等。
  • 性能基准测试,较早进行。

负载测试

  • 负载测试主要是在“基于或模拟系统真实运行环境及用户真实业务使用场景”情况下,通过不断给系统增加压力或在一定压力下延长系统运行时间,来验证系统各项性能指标的变化情况,直到系统性能出现“拐点”,即某个性能指标达到了事先约定的指标阈值(极限值)。

压力测试

压力测试主要是在“模拟系统已处于极限负载下或某指标已经处于饱和状态”情况下,继续给系统增加负载或运行时间,观察系统性能表现,验证系统是否出现内存泄露、系统宕机等严重异常。

大数据量测试

  • 大数据量测试主要是指使用大批量数据对系统产生压力或影响,同时验证系统各项指标运行是否正常。
    • 某些容器(如数据库、存储设备等)中有较大数量的数据;
    • 进行并发或某些操作时动态创建大量数据。

配置测试

  • 通过对被测系统的软硬件环境的调整,了解各种不同对系统的性能影响的程度,从而找到系统各项资源的最优分配原则。
  • 正交实验法进行用例设计
  • 目的:了解各种不同因素对系统性能影响的程度。

稳定性测试

  • 稳定性测试主要强调的是连续运行被测系统,检查系统运行时的稳定程度。通常采用MTBF(错误发生的平均时间间隔)来衡量系统的稳定性,MTBF越大,系统的稳定性越强。

性能测试术语

虚拟用户

Vuser→真人

并发及并发用户数

  • 并发:大量用户且同时对服务器的操作
    • 系统允许500个用户并发访问系统
    • 系统支持500个用户并发进行登录操作
  • 系统用户数:系统可有1000个使用用户
  • 在线用户数:系统允许800个用户同时在线
  • 参考公式:使用系统的用户数量*(5%~20%)

响应时间

  • 请求响应时间:从客户端发出请求到得到响应的整个过程的时间,单位通常为“秒”或“毫秒”。网络响应时间 + 服务器端响应时间 TTLB(Time to last byte)
  • 事务响应时间:完成该事务所用的时间。其包含一个或多个“请求响应时间”。
  • 事务相应时间>=请求响应时间

每秒事务数

  • TPS指每秒钟系统能够处理的交易或事务的数量。
  • 取款业务成功率达到1000次/s。

吞吐量、吞吐率

  • 吞吐量:单次业务中,客户端与服务器端进行的数据交互总量。通常,该参数受服务器性能和网络性能的影响。
  • 吞吐率:吞吐量除以传输时间。
  • 吞吐量也被称为TPS(单位时间内能完成的事物数)
  • exa:1个用户登录需要1秒,支持10个用户登录,且响应时间为1秒,
    则系统吞吐率为10个/秒

点击率

  • HPS指每秒钟内,用户向Web服务器提交的HTTP请求数。
  • 点击率越大,表明对服务器产生的压力也越大

性能计数器

  • 一系列用于描述各类服务器或操作系统性能的指标,在进行资源监控和系统瓶颈分析中起着重要的作用。
  • 在Windows任务管理器中使用的内存数(Memory In Usage)、CPU使用率(%Processor time)、进程时间(Total Process Time)。

资源利用率

3000用户并发进行登录操作时,服务器的CPU使用率不超过75%,内存占有率不超过10%”
在这里插入图片描述
上图横坐标是并发用户数
绿线是CPU使用率;
紫线是吞吐量,即tps;
蓝线是响应时间

性能测试流程

测试计划阶段

  1. 明确测试对象
  2. 定义测试目标
  3. 定义测试通过的标准
  4. 规划测试进度
  5. 规划测试参与人员(需求、开发、测试、运维和配置)
  6. 申请测试资源
  7. 风险控制

测试设计阶段

  1. 设计测试用例
  2. 设计测试数据
  3. 设计测试场景

测试开发阶段

  1. 测试环境搭建
  2. 测试过程文档定义以及配置
  3. 测试脚本开发、调试
  4. 测试数据准备
  5. 基准测试

测试执行阶段

  1. 执行测试用例模型,包括执行脚本和场景
  2. 测试过程监控,包括查看log、监控服务器资源、数据库和中间件等

测试结果阶段

  1. 根据测试结果和监控结果进行测试分析
  2. 根据性能测试目标,分析出系统存在的性能瓶颈,并给出优化建议

测试报告阶段

  1. 测试范围
  2. 测试执行以及参与人员
  3. 基准测试数据
  4. 测试执行的详细步骤
  5. 场景设计)
  6. 测试数据记录、监控结果
  7. 测试结果对比以及总结性评价

常见的性能问题

资源泄露

  • 包括内存泄漏。系统占用的资源(如内存、CPU等)随着运行时间的不断增长,而降低了系统性能。系统响应越来越慢,甚至系统出现混乱。只有重启系统才能恢复到最初水平。
  • 这类问题产生的主要原因是有些对象(如GDI使用、JDBC连接等)没有及时被销毁、内存没有释放干净、缓冲区没有回收等。

资源瓶颈

  • 内部资源(线程池、连接池)变得稀缺。随着负载增加,系统越来越慢甚至系统挂起或出现异常错误。
  • 这类问题产生的主要原因是线程过度使用或资源分配不足。

CPU使用率达到100%、系统被锁定等。

  • 代码中可能存在无限循环、缺乏保护(如对失败请求不断的重试)等问题,
  • 对网络应用系统,问题常常出现在数据库服务器上,如频繁对数据库存取、未使用连接池或者连接池配置参数不当、单个SQL请求的数据量过多、没有使用高速缓存等。

线程死锁、线程阻塞等造成系统越来越慢,甚至系统挂起或出现异常错误、系统混乱局面等。

  • 可能是由程序对事务并发处理上的错误、 资源争用引起锁阻塞和死锁等引起的
  • 例如线程获得顺序的算法不对而造成死锁、线程同步点上备份过多而造成通信阻塞等

查询速度慢或列表效率低

主要原因是列表查询未使用索引、过于复杂的SQL语句、分页算法效率低等;也可能是查询结果集过大或不规范的查询,如查询全部字段而不是所需字段、返回全部的数据等。

受外部系统影响越来越大,最终造成应用系统越来越慢

主要原因有向后端系统发出太多的请求、页面内容过多、经第三方系统认证比较复杂、网络连接不稳定或延迟等。

JMeter简介

JMeter是免费、开源、纯Java开发的性能测试工具,JMeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下的测试它们的强度和分析整体性能。能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序是否返回了你期望的结果,JMeter允许使用正则表达式来创建断言。
JMeter官网

JMeter特点

  • 能够对HTTP和FTP服务器进行性能测试,也可以对任何数据库进行同样的测试(通过JDBC)
  • 完全的可移植性和100%纯java
  • 完全多线程框架,允许通过多线程开发取样和通过单独的线程组对不同的功能同时取样
  • 各种负载统计表和可链接的计时器可供选择
  • 数据分析和可视化插件提供了很好的可扩展性以及个性化
  • 具有提供动态输入到测试的功能

JMeter安装

  • JMeter是Java应用程序,需要有JDK环境
  • 官网下载:http://JMeter.apache.org

JMeter目录结构分析

  • Bin:放置了各项配置文件(如JVM设置、日志设置)、启动文件、示例脚本等
    • JMeter.properties:JMeter的系统配置文件,可以针对JMeter做各种配置操作,比如:远程负载机等
    • remote_hosts=127.0.0.1
    • remote_hosts=127.0.0.1:1099,172.168.1.13:1099, 172.168.0.16:1099
    • server_port=1099
  • Docs:放置了JMeter API离线帮助文档
  • Extras:JMeter辅助功能,提供与Ant、Jenkins集成的可能性,利用Ant与Jenkins来构建性能测试自动化构架
  • Lib: JMeter组件以jar包形式放置在lib/ext目录下,如果要扩展JMeter组件,扩展后的jar包即放在此目录
  • printable_docs:JMeter的离线帮助文件放置目录

JMeter工作区介绍

在这里插入图片描述

  • 区域1:目录树,存放测试设计过程中使用到的元件;
    • 执行过程默认从根节点开始顺序遍历树上的元件
    • 元件:比如HTTP请求就是一个元件
  • 区域2:菜单栏,图标是菜单快捷方式
  • 区域3:测试元件编辑区域

JMeter常用功能

  • 测试计划:用来描述一个性能测试,所有内容都是基于这个计划的。
  • 线程(虚拟用户)
    • 一般线程组:设置JMeter按照什么场景来运行(添加/Threads/线程组)
    • setUp Thread Group:可用于执行预测试操作。这些线程行为完全像一个正常的线程组元件。类似于LR 的init方法。
    • tearDown Thread Group:可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。类似于LR的end方法。
    • Sampler取样器:是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter原生支持多种不同的Sampler
    • 逻辑控制器:用来控制测试脚本的逻辑判断,编程中的逻辑控制if,循环等。
    • 定时器:设置操作之间的等待时间,一旦设置,对所有请求有效。
    • 前置处理器:发送请求之前的处理,例如参数化。
    • 后置处理器:发送请求之后得到的服务器响应进行处理(LR关联)。
    • 断言:对实际结果和预期结果的判断(LR检查点)。
    • 监听器:对测试结果进行可视化展示。

JMeter运行原理

JMeter以线程方式运行,通过线程组来驱动多个线程(类似LoadRunner中的
虚拟用户)运行测试脚本对被测试服务器发起负载,每个负载机上都可以运行
多个线程组。

JMeter使用

创建测试计划

  • 测试计划:是JMeter测试的起点,是存放脚本的容器,JMeter中一个脚本即是一个测试计划。
  • 测试计划四要素:
    • 脚本中计划只能有一个
    • 至少要有一个线程组
    • 至少有一个取样
    • 至少有一个监听器
  • 在测试计划里面可以配置用户的一些全局变量
  • 独立运行每个线程组:一个测试计划下面可能会包含多个线程组,勾选此项的话,则会顺序执行每个线程组,而不是同时启动所有的线程组

新建线程组

  • 线程组:相当于有多个用户,同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值
  • 启动线程组的方法:
    • Test Plan 右键——Adds——Threads—Thread Group

开发脚本

手工书写、JMeter使用代理方式录制

Http请求设置-保持默认
  • 名称:用于标识一个取样器,建议采用一个有意义的名称。
  • 注释:对于测试没有任何作用,仅记录用户可读的注释信息。
  • 端口号:目标服务器的端口号,默认80。
  • 协议:向目标服务器发送HTTP请求时的协议,可以是https或者是http,默认是http。
  • 方法:发送http请求的方法,可用方法包括GET、HEAD、POST、PUT、OPTIONS、TRACE、DELETE等。
  • Content encoding:内容的编码方式。
  • 路径:目标URL路径(不包括服务器的地址和端口)
  • 自动重定向:如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter自动重定向到新的页面
  • Use keep Alive:当该选项被选中时,JMeter和目标服务器之间是有Keep-Alive方式进行HTTP通信,默认选中。
  • Use multipart/from-data for HTTP POST:当发送HTTP POST 请求时,使用Use multipart/from-data 发送,默认不选中。
  • 同请求一起发送参数:在请求中发送URL参数,对于带参数的URL,JMeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应URL中的名称1=值1)
  • 同请求一起发送文件:在请求中发送文件,通常,HTTP文件上传行为可以通过这种方式模拟。
  • 从HTML文件获取所有内含的资源:选中时,JMeter在发出HTTP请求并获得响应的HTML文件内容后,还对该HTML进行Parse并获取HTML中包含的资源。默认不选中,如果用户只需要获取页面中的特定资源,可以在下方中的URLs must match文本框中填入需要下载的特定资源表达式,这样,只有匹配成功的资源才会被下载。
  • 用作监视器:此取样器被当成监视器,在Monitor Results Listener中可以直接看到基于该取样器的图形统计信息。默认不选中。
  • Save response as MD5 hash:选中时,在执行时仅记录服务器端响应数据的MD5值,而不记录完整的响应数据。在需要进行数据量大的测试时,建议选中该项以减少取样器记录响应数据的开销。
线程组设置
  • 线程数:虚拟用户数
  • ramp up period:设置的虚拟用户需要多长时间全部启动。如果线程数为20,时间为10,也就是每秒钟启动2个线程
  • 循环次数:每个线程发送请求的次数。如果线程数为20,循环次数为100,那么每个线程发送100次请求。总请求数为20*100=2000。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。
  • 调度器:可以灵活设置运行时间
  • Scheduler:调度器
    • Duration(seconds):持续时间,测试计划持续多长时间
    • Startup delay(seconds):启动延时。点击启动按钮后,仅初始化场景,不运行线程,等待延时时间到才运行

运行场景

查看监控

JMeter 中使用监听器元件收集取样器记录的数据并以可视化的方式来呈现。JMeter有各种不同的监听器类型,这里添加聚合报告来查看结果
在这里插入图片描述

聚合报告
  • 注意:单位是毫秒,后缀是jtl
  • Label:定义请求的名称,就是我们在进行测试的httprequest sampler的名称
  • Samples:这次测试中一共发给服务器的请求数量
  • Average:单个请求的平均响应时间,单位是毫秒。当使用了Transaction Controller时,也可以以Transaction 为单位显示平均响应时长。
  • Median:中位数,50%的请求的响应时间
  • 90%Line:90%的请求的响应时间
  • 95%Line:95%的请求的响应时间
  • 99%Line:99%的请求的响应时间
  • Min:访问页面最小的响应时间
  • Max:访问页面最大的响应时间
  • Error%:错误率=错误的请求的数量/请求的总数
  • Throughput::吞吐量即表示每秒完成的请求数。当使用了Transaction Controller时,也可以表示Transaction per Second数
  • Received KB/sec::每秒从服务器端接收到的数据量
添加监听器
  • View Results Tree:如果我们的请求成功发送给服务器,那么结果树里面的模拟请求会显示为绿色,可以通过取样器结果里面的响应状态码信息来判断
  • 里面有我们发送的请求的方法、协议、地址以及实体主体数据,以及数据类型,大小,发送时间,客户端版本等信息

Badboy录制脚本

  • Badboy是用C++开发的,被用于测试和开发复杂的动态应用。它提供了强大的屏幕录制和回放功能,同时也提供了丰富的图形结果分析功能
  • 下载Badboy:http://www.badboy.com.au/
  • 使用Badboy录制脚本,然后将录制的脚本导出为JMeter格式的脚本,最后将该脚本导入到JMeter,借助于JMeter强大的测试功能模拟大量的虚拟用户,进行复杂的性能测试
  • 在Badboy中,step就类似于Loadrunner中事务的概念,我们可以通过添加
    step的方式来定义事务
  1. badboy下载:www.badboy.com.au
  2. 点击工具栏上的红色原型按钮,在地址栏目输入被测地址。
  3. 录制完成后,点击工具栏旁边的黑色按钮,结束录制。选
    择“文件”/“Export to JMeter”
  4. 打开JMeter工具,选择“文件”/“打开”选择刚才保存的
    文件(.jmx类型),将文件导入

代理方式录制脚本

  1. 创建模板【录制方式】
  2. 配置浏览器的代理为 “127.0.0.1” 端口是8888
  3. HTTP(S) Test Script Recorder 点击【run】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL中实现行列转换

目录 方法一:sum case when 方法二:sum if 方法三:pivot 现在有一张表class_gender,内容如下: classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表,统计得到下…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

java学习之路(2)-编译java文件运行Java文件

创建.java后缀文本文件HelloWorld .java 写入代码: public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } } 运行cmd命令 找到代码所在目录 输入javac编译Java文件生成HelloWorld.class 编译:…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件,其主要有三部分组成:行星服务器Planet、月亮服务器Moon、客户端节点LEFA,行星服务器是ZeroTier的根节点,可以采用ZeroTier官方的服务器,也可以使用开源代码自行搭建 月…

Android中下载 HAXM 报错 Intel® HAXM installation failed,如何解决?

最近在搭建 Flutter 环境,但是在 Android Studio 中安装 Virtual Device 时,出现了一个 问题 Intel HAXM installation failed. To install Intel HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructio…

深度强化学习(王树森)笔记09

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

【Servlet】Smart Tomcat插件简化Servlet开发流程及解决常见问题

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、Smart Tomcat插件二…

【2023地理设计组一等奖】基于GIS的桥梁隧道三维建模与可视化

作品介绍 1 设计背景和意义 随着我国基础建设规模不断扩大和深入,构建桥梁可视化管理模型,全面推动智慧桥梁,已成为现代隧道桥梁建设行业的发展趋势。传统的桥梁建模工作需要复杂的算法设计并需要熟练编程实践技能,实现周期长。开发自主知识版权的桥梁建模软件系统或专用插…

时间复杂度解释

时空复杂度概述 首先o(1), o(n), o(logn), o(nlogn)是用来表示对应算法的时间复杂度,这是算法的时间复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行这个算法所需要…

Keepalived + DR 集群

目录 1、Keepalive VRRP 说明 故障切换 工作原理 核心组件 2、Keepalived DR 集群 拓扑规划 前期准备 配置 Httpd 服务 配置 Nginx 服务 配置 LVS 主 node_01 配置 LVS 从 node_02 测试 LVS 集群 测试主备切换 3、Keepalived 脑裂现象 4、Keepalived 心态检测 …

C++字符串的常用操作函数全总结

文章目录 1.string、string.h和cstring的区别2.字符串定义3.求字符串的长度(也可以求array对象长度)4.输入字符串5.分割截取字符串4.在字符串中查找指定子字符串,并返回其第一次出现的位置5.替换字符串中的一部分6.在字符串指定位置插入字符串7.复制字符…

【漏洞通告】 Jenkins CLI 任意文件读取漏洞

漏洞概况 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。Jenkins 有一个内置的命令行界面(CLI)&…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大&#xff0…

在Spring Boot中使用iTextPDF创建动态PDF文档

最近,我们的系统新增了一个客服模块,其中一个重要功能是能够以PDF格式导出客服与用户之间的聊天记录。这些聊天记录包含文字、图片和文件等多种内容。为了实现这一功能,我们首先使用了itextpdf 5.x版本制作了一个Demo。今天,我将与…

kubernetes-快速部署一套k8s集群

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行…

力扣题目训练(5)

2024年1月29日力扣题目训练 2024年1月29日力扣题目训练345. 反转字符串中的元音字母349. 两个数组的交集350. 两个数组的交集 II96. 不同的二叉搜索树97. 交错字符串44. 通配符匹配 2024年1月29日力扣题目训练 2024年1月29日第五天编程训练,今天主要是进行一些题训…

短视频与小程序:如何实现完美结合?

在短视频日益成为人们娱乐、社交和信息获取的重要渠道的今天,如何在短视频平台进行小程序推广成为了许多企业和品牌关注的焦点。本文将介绍如何利用短视频平台进行小程序推广,提升品牌曝光和用户互动。 首先,打开乔拓云-门店系统的后台&#…

使用new操作符,一定是在堆上申请内存么?

《法华经》曰:“ 世尊导师,安隐天人,我等闻记,心安具足。” 一、引言 我们常常张嘴就来,我们在堆上申请内存使用malloc() 或者new操作符,但是反过来说,使用new操作符,就一定是在堆…

###C语言程序设计-----C语言学习(7)#(调试篇)

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 程序调试 1.程序调试介绍: 程序调试是软件开发过程中非常重…

海外云手机对于亚马逊卖家的作用

近年来,海外云手机作为一种新型模式迅速崭露头角,成为专业的出海SaaS平台软件。海外云手机在云端运行和存储数据,通过网页端操作,将手机芯片放置在机房,通过网络连接到服务器,为用户提供便捷的上网功能。因…