Jmeter 入门 从0-1 基础篇-实操

简介: ​ Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。

Jmrter入门 从0-1 基础篇



笔记有的图片链接可能失效了,等我修改好了在来编辑哈


文章目录


1 JMeter

1.1 JMeter环境搭建和基本使用

1.1.1 JMeter环境搭建

1.1.2 JMeter常用目录

1.1.3 基本配置-汉化jmeter

1.1.4 jmeter基本操作

1.2 JMeter基本元件

1.2.1 JMeter元件类型

1.2.2 JMeter元件的作用域

1.2.3 JMeter元件执行顺序

1.3 JMeter基本组成部分

1.3 .1 线程组

1.3.1.1 添加线程组

1.3.1.2 线程组的特点

1.3.1.3 线程组分类

1.3.1.4 线程组属性

1.3.2 取样器 HTTP请求

1.3.3 查看结果树

1.4 JMeter 参数化常用方式

2.4.1 用户定义的变量

1.4.2 用户参数

1.4.3 CSV数据文件设置 CSV Data Set Config

1.4.4 函数(_counter)

1.5 JMeter断言

1.5.1 响应断言

1.5.2 JSON断言

1.5.3 断言持续时间

2 使用问题

2.1 jmeter响应中出现乱码时


1 JMeter


Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。


JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。


还可以做接口测试哈哈哈


1.1 JMeter环境搭建和基本使用


1.1.1 JMeter环境搭建


(1)JDK安装


下载jdk:


运行jdk


配置jdk的环境变量


验证jdk是否安装成功。java -version


(2)jmeter安装


下载jmeter

官网下载地址


jmeter版本必须与jdk版本匹配


需要下载binaries的包


安装jmeter:解压缩


配置环境变量


验证jmeter是否安装成功


启动方式有:jmeter.bat/ 双击Apachejmeter.jar/ java.jar Apachejmeter.jar


1.1.2 JMeter常用目录


JMeter文件目录


**bin目录:**用于存放可执行程序、日志文件、配置文件


**docs目录:**存放API文档,主要提供第三方插件开发


**printable_docs:**目录存放用户使用手册


**lib目录:**存放jmeter所支持的jar包,第三方的插件一般放到lib\ext目录下

1. bin目录
存放可执行文件和配置文件
 jmeter.bat: windows的启动文件
 jmeter.log: 日志文件
 jmeter.sh: linux的启动文件
 jmeter.server.bat: windows 分布式测试要用到的服务器配置
 jmeter.server: linux 分布式测试要用的服务器配置
2. docs目录
 docs:是Jmeter的api文档,可打开api-index.html页面来查看
3. printable_docs 目录
  printable_docs的usermanual子目录下的内容是JMeter的用户手册文档
  usermanual 下 component_reference.html是最常用到的核心元件帮助文档
提示:printable_docs的demos子目录下有一些常用的Jmeter脚本案例,可以作为参考

1.1.3 基本配置-汉化jmeter


汉化:


. 临时修改:菜单栏选择–>options-language-choose language-Chinese


. 永久修改: 打开bin目录下-jmeter.propertles,修改language=zh CN,重启jmeter


. 主题修改:选项-主题–选择对应的主题.并重启


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcONnrdk-1660616309244)(image/clip_image002.jpg)]


(1.1.3 汉化)



1.1.4 jmeter基本操作


操作步骤


1.启动jmeter


2.在"测试计划"下添加"线程组"


3.在"线程组"下添加"HTTP请求"取样器


4.填写"HTTP请求"的相关请求数据


5.在"线程组"下添加"查看结果树"监听器


6.点击"启动"按钮运行,并查看结果


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajk9AFSJ-1660616309248)(image/clip_image004.jpg)]


1.2 JMeter基本元件


元件:多个类似功能组件的容器统称


组件:实现独立某个功能的统称(类似函数)


取样器:不同协议实现的组件


1.2.1 JMeter元件类型


*基本元件:*


线程组:模拟用户的


配置元件:进行测试环境和测试数据的初始化。类似自定化脚本中的setup


前置处理器:对要发送的请求进行预处理。类似自动化脚本中的参数化


取样器:往服务器发送请求。类似于自动化脚本中的发送请求代码


后置处理器:对收到的服务器的响应进行数据提取。类似自动化脚本中获取响应中特定字段的语句


断言:将收到的响应结果与预期结果做对比。类似自动化脚本中的断言


监听器:查看测试脚本运行的结果和日志,类似自动化脚本中的测试报告


定时器:等待一定时间。类似自动化脚本中的sleep


测试片段:封装基本功能,不单独执行,需要通过脚本调用才能执行。类似自动化脚本中封装的函数。

image.png

(1.2.1 基本元件)


1.2.2 JMeter元件的作用域


在JMeter中,元件的作用域是靠测试计划树形结构中元件的父子关系来确定的


提示:核心是“取样器”,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。

作用域的原则
1.取样器:元件不和其他元件相互作用,因此不存在作用域的问题;
2.逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用;
3.其他六大元件:除取样器和逻辑控制器外,如果是某个取样器的子节点,则该元件对其父子节点起作用;
4.如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
提示:以上元件中还没开始学习,暂时理解jmeter这种树形结构影响作用域即可。

image.png

(2.2.2 元件的作用域)


作用域的原来:


核心:根据测试计划中的树形结构的父子节点来确定的


原则:


.取样器是没有作用域的


.逻辑控制器:只针对其子节点下的所有元件有小


.其他元件


如果其父节点是取样器,只针对父节点(取样器)有效


如果父节点是非取样器,针对父节点下的所有子节点及子节点有效


1.2.3 JMeter元件执行顺序


1.配置元件(config elements)


2.前置处理器程序(Per-processors)


3.定时器(timers)


4.取样器(Sampler)


5.后置处理程序(Post-processors)


6.断言(Assertions)


7.监听器(listenres)


注意:


.配置元件、前置处理器、后置处理器都需要依赖取样器才能运行


.在同一个作用域下,相同类型元件的执行顺序是从上到下按顺序执行


提示:


.前置处理器、后置处理器、断言等元件功能对取样器器作用(如果在它们的作用域内没有任何取样器,则不会执行)


.如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行

image.png


(1.2.3 元件的执行顺序)


1.3 JMeter基本组成部分


1.3 .1 线程组


线程组是控制JMeter将用于执行测试的线程组数,也可以把一个线程理解为一个测试用户


(作用:通过配置线程组中的线程数来模拟用户。线程数就是用户数,线程组就是用户组)


1.3.1.1 添加线程组


位置:右键点击测试计划–>添加-线程(用户)–线程组


1.3.1.2 线程组的特点


. 模拟多用户:设定线程数(模拟多人操作)


. 取样器(请求)和逻辑控制器必须依赖线程组才能使用


. 一个测试计划下可以添加拖个线程组,他们可以并行或者串行执行


并行:默认情况下线程组为并行执行


串行:在测试计划下勾选“独立运行每个线程组”

image.png

(1.3.1.1 并行) (1.3.1.2 串行)


清除全部执行结果操作[ 快捷键:ctrl+E ]

image.png

1.3.1.3 线程组分类


. setup****线程组:用于测试前的预处理操作,在所有的线程组最先执行


. 普通线程组:用于执行业务测试脚本


. teardown****线程组:用于测试后的后置处理(恢复环境,数据)的操作,在所有的线程组最后执行

image.png

1.3.1.4 线程组属性


线程数:模拟虚拟用户数


Ramp-up****时间:虚拟用户启动所需要的时间


循环次数:


.配置指定次数:控制脚本循环执行的次数


.配置循环永远


。需要和调度器配置使用


。运行时间:脚本执行的时间


。延时启动时间:脚本等待特定的时间才能开始运行


线程数m和循环次数n的关系:


. 如果同时配置,实际发送的HTTP请求数应该为m*n


. 虽然发送请求的次数相同,但不能相互替换


线程组:代表并发用户数,体现服务器的负载量


循环次数:代表执行时间


(线程组名不同1-1——1-10)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWIuYN1t-1660616309253)(image/clip_image020.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHh1ZReP-1660616309254)(image/clip_image022.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDpgT44g-1660616309255)(image/clip_image024.jpg)]


循环次数 (线程组名相同1-1)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcVrow79-1660616309256)(image/clip_image026.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hK7eaaW-1660616309257)(image/clip_image028.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Syqgnmnv-1660616309258)(image/clip_image030.jpg)]


循环次数永远-调度器配置


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYMlhyPk-1660616309259)(image/clip_image032.jpg)]


1.3.2 取样器 HTTP请求


**http****协议:**可以填写为HTTP或者HTTPS,默认不填写为HTTP协议


http****主机名/ip:


**端口:**可以填写为任何值,默认不填写时为80端口


**请求方法:**HTTP协议所支持的所有方法


**路径:**目录+参数


**编码格式:**默认IOS国际标准,推荐使用utf-8


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8h3a8Vt-1660616309260)(image/clip_image034.jpg)]


1.3.3 查看结果树


取样器结果:统计请求相关的信息


请求:HTTP请求的请求头和请求体的详细信息


响应: HTTP响应的响应头和响应体的详细信息


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWVaQP3s-1660616309261)(image/clip_image036.jpg)]


1.4 JMeter 参数化常用方式


2.4.1 用户定义的变量


应用场景:全局参数


添加方式: 测试计划->线程组->配置元件->用户定义的变量


场景样例:


请求:https://www.baidu.com:443


要求:使用用户定义的变量配置被系统的协议、域名和端口


操作步骤:


1.添加线程组


2.添加用户定义的变量


3.添加HTTP请求


4.添加查看结果树


总结


配置:参数名+参数值


使用:在HTTP请求的取样器中引用定义的变量。 ${参数名}


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtSSxSov-1660616309262)(image/clip_image038.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzzIytmT-1660616309263)(image/clip_image040.jpg)]


用户定义的变量2


或者在直接在 测试计划 中配置用户定义的变量


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7W4AIYZw-1660616309264)(image/clip_image042.jpg)]


1.4.2 用户参数


应用场景:可以针对不同的用户获取不同的参数值(不能针对同一个用户循环取不同的值)


添加方式:测试计划->线程组->前置处理器->用户参数


场景样例:


请求:https://www.baidu.com


要求:第一次请求附带参数: name=“张三”&age=28;


第二次请求附带参数: name=“李四”&age=30


操作步骤:


1.添加线程组


2.添加用户参数


3.添加HTTP请求


4.添加查看结果树


总结


参数:添加变量


参数值:添加用户-针对每个用户配置不同的参数值


使用:在HTTP请求的取样器中引用定义的变量。${参数名}


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAtlywu1-1660616309265)(image/clip_image044.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pb7gZ5aM-1660616309266)(image/clip_image046.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3LyvBYE-1660616309267)(image/clip_image048.jpg)]


1.4.3 CSV数据文件设置 CSV Data Set Config


应用场景:针对每个用户每次循环取不同的值


添加方式:测试计划->线程组->配置元件->CSV数据文件设置


场景样例:


请求:https://www.baidu.com


要求:循环3次,每次请求时附带参数username,password,code的值不相同


操作步骤:


1.定义CSV数据文件


2.添加线程组


3.添加csv数据文件设置


4.添加HTTP请求


5.添加查看结果树



编写CSV数据文件(.csv后缀) data.csv


多个参数写为多列,其中用英文逗号分隔


多组参数值,则使用多行来设置


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FuiEA5dP-1660616309268)(image/clip_image049.png)]


配置:


. 文件名:填写CSV文件的路径。建议使用相对路径


. 文件编码:UTF-8


. 变量名称:从CSV数据文件中读取的数据需要保存的变量名,有多个变量时用逗号分隔


. 是否忽略首行: 是否从CSV数据文件第一行开始读取


. 分隔符: 要求与CSV数据文件中多列的分隔符一致


. 遇到文件结束符是否在次循环:默认TRUE


. 遇到文件结束符是否停止线程:当前一个参数为FALSE,改参数有效,一般设置为TRUE


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbFjKBt1-1660616309268)(image/clip_image051.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPOiGGAL-1660616309269)(image/clip_image053.jpg)]


同一个用户循环3次


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1P7nZtS-1660616309270)(image/clip_image055.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xQy2Jnh-1660616309271)(image/clip_image057.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vInoMFvP-1660616309272)(image/clip_image059.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wo7iJysR-1660616309273)(image/clip_image061.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4emytVd9-1660616309273)(image/clip_image063.jpg)]


1.4.4 函数(_counter)


应用场景:当需要参数化的数据只有唯一性要求,但对具体的参数无明确要求时,建议使用函数方式 (不需要提前准备数据,jmeter自动添加计数的方式来完成参数化)


计数函数,一般做执行次数统计使用;


位置:工具条 函数助手 工具按钮


(JMeter5.3 及以后的版本jmeter函数助手生成的字符在置灰无法复制,其实新版的的jmeter点“生成”按钮时 jmeter已经自动复制了,ctrl+v直接粘贴到需要的位置即可)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKg7mlOA-1660616309274)(image/clip_image065.jpg)]


counter:


.TRUE:每个用户使用独立的计数器


.FALSE: 所有用户使用全局的计数器


引用:在取样器中使用${__counter(TRUE,)}来引用对应的值



1.5 JMeter断言


作用:让脚本自动化执行的过程中,能够自动的判断执行结果是否正确,需要添加断言


.响应断言


.JSON断言


.持续时间断言(Duration Assertion)


1.5.1 响应断言


添加方式:测试计划->线程组->HTTP请求->(右键添加)断言->响应断言


场景样例:


请求:https://www.baidu.com


检查:让程序检查响应数据中是否包含"百度一下,你就知道"


操作步骤:


1.添加线程组


2.添加HTTP请求


3.添加响应断言


4.添加断言结果


5.添加查看结果树


配置:


.测试字段:需要检查的字段


.模式匹配规则:需要使用什么规则来进行检查


。且、或者、非


.测试模式:需要校验的值


。填写多个值


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0yxigyo-1660616309275)(image/clip_image067.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxZJK376-1660616309275)(image/clip_image069.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyFLImI6-1660616309276)(image/clip_image071.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gGMOdly7-1660616309277)(image/clip_image073.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNz8p7WI-1660616309278)(image/clip_image075.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JP7COokp-1660616309279)(image/clip_image077.jpg)]


1.5.2 JSON断言


适用于返回的HTTP响应为JSON格式


添加:线程组–HTTP请求–断言–JSON断言


场景样例:


请求:http://www.weather.com.cn/data/sk/101010100.html


检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”


操作步骤


1.添加线程组


2.添加HTTP请求


3.添加JSON断言


4.添加断言结果


5.添加查看结果树



配置:


.JSON PATH: $weatherinfo.city


.勾选“Additonal assert value”


.在expected value 里填写期望值


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tDOHIEE-1660616309280)(image/clip_image079.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciCywE0c-1660616309280)(image/clip_image081.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2Kz1Hss-1660616309281)(image/clip_image083.jpg)]


当期望值没有时


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-unKJw7pI-1660616309282)(image/clip_image085.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9bSsZxf-1660616309283)(image/clip_image087.jpg)]


1.5.3 断言持续时间


适用于性能测试时候,检查HTTP请求的响应时间是否超过预期值


添加:线程组–HTTP请求–断言–断言持续时间


场景样例:


请求:https://www.jd.com


检查:让程序检查响应时间是否大于500毫秒


操作步骤


1.添加线程组


2.添加HTTP请求


3.添加断言持续时间


4.添加断言结果


5.添加查看结果树


配置:预期时间


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6C8w6XqF-1660616309284)(image/clip_image089.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6ZnYTbV-1660616309284)(image/clip_image091.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNcOhzZz-1660616309285)(image/clip_image093.jpg)]


重复访问时间会少


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktyoTJpy-1660616309286)(image/clip_image095.jpg)]


当设置响应时间20毫秒


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPKpqMl0-1660616309287)(image/clip_image096.png)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXguNjxI-1660616309288)(image/clip_image098.jpg)]


2 使用问题


2.1 jmeter响应中出现乱码时


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePUOtMgg-1660616309288)(image/clip_image100.jpg)]


如果响应数据中中文显示乱码可以修改 \bin jmeter.properties配置文件


#sampleresult.default.encoding=ISO-8859-1


改为


sampleresult.default.encoding=UTF-8 重启jmeter


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFXoWUW8-1660616309289)(image/clip_image102.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2aDdBLz-1660616309290)(image/clip_image104.jpg)]


相关文章
|
5月前
|
编解码 NoSQL 测试技术
性能工具之Jmeter HLS 插件(入门篇)
【2月更文挑战第28天】JMeter Redis 数据集 vs CSV 数据集性能对比
173 1
性能工具之Jmeter HLS 插件(入门篇)
|
5月前
|
小程序 Java 编译器
性能工具之JMeter 微信小程序 WebSocket 脚本入门
【5月更文挑战第12天】性能工具之JMeter 微信小程序 WebSocket 脚本入门
184 1
|
5月前
|
JSON 测试技术 数据格式
性能工具之Jmeter关联入门
【4月更文挑战第4天】关联是每个性能测试人员必须掌握的技能,是解决性能脚本中的"金钥匙"。
63 2
性能工具之Jmeter关联入门
|
11月前
|
监控 关系型数据库 MySQL
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
416 2
|
5月前
|
监控 Java Linux
Apache JMeter5.2基础入门实践详解
Apache JMeter5.2基础入门实践详解
144 0
|
存储 Java BI
JMeter入门实践
JMeter(表)即 Apache JMeter,是ApacheSoftwareFoundation开发的压力测试工具。该应用程序是开源软件,旨在对应用程序功能和行为进行测试,以衡量其性能指标。它最初是为测试Web应用程序而设计的,但此后已扩展到其他测试功能。
216 2
JMeter入门实践
|
Java 测试技术 Apache
JMeter与Python的多重交响:从入门到高级应用(上)
在性能测试领域,Apache JMeter已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。但在某些情境下,为了满足特定需求,我们需要更多的灵活性,比如引入Python来进行特定操作或处理复杂逻辑。**”** Jython -----
JMeter与Python的多重交响:从入门到高级应用(上)
|
Java 测试技术 Apache
JMeter与Python的多重交响:从入门到高级应用(下)
在性能测试领域,Apache JMeter已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。但在某些情境下,为了满足特定需求,我们需要更多的灵活性,比如引入Python来进行特定操作或处理复杂逻辑。。
JMeter与Python的多重交响:从入门到高级应用(下)
|
Java 测试技术 Linux
JMeter(1) --- 入门
JMeter(1) --- 入门
99 0
|
JSON 前端开发 测试技术
性能测试(8)——Jmeter基础入门
Get、Post请求(以个人学生管理系统为例) 在线程组中右键新建“用户定义的变量”,添加键值对,如果在请求中需要使用到该变量,则在“值”这一栏下,填写${该变量名称},来引用该变量的值。
208 0
性能测试(8)——Jmeter基础入门