zoukankan      html  css  js  c++  java
  • JMeter完整入门篇

    什么是 JMeter和为什么选择Jmeter做性能测试

    什么是  JMeter

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


    Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl 脚本,java 对象,数据库和查询,FTP 服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

    为什么选择 JMeter

    下面看看 JMeter 的特色。

    1. 开源许可: Jmeter 是完全免费的,并提供了源码可供自定义开发
    2. 图形界面模式:提供了方便的图形界面来编辑和开发测试脚本
    3. 平台无关:可以轻易在 windows、linux、mac 上运行
    4. 多线程框架:通过线程组,能够轻易的设置不同测试的并发用户。
    5. 图形测试结果:提供了图表、表格、树、文件等格式的结果显示。
    6. 易于安装:jmeter 不需要安装,下载解压即可用。
    7. 高扩展性:jmeter 支持用户自定义测试脚本,同样还提供了各种插件。
    8. 多测试类型支持:支持性能测试、分布式测试、功能测试
    9. 仿真模拟:支持多用户并发测试
    10. 多协议支持:支持 http、jdbc、ldap、soap、jms、ftp 等等协议
    11. 录制&回放:支持用 badboy 或 jmeter 录制,不过笔者从来不用该模式,纯手工最佳。
    12. 脚本测试:jmeter 支持 beanshell 和 selenium

    JMeter 完整的工作原理如图

    JMeter 目录及关键配置分析

    安装插件管理

    从 http://jmeter-plugins.org/downloads/all/下载插件管理包,如图

    将下载的包放至 jmemter 解压根目录的 lib/ext 下即可

     

    jmeter目录说明

    • bin  包含启动、配置等相关命令
    • docs  官方本地文档目录
    • extras  辅助库
    • lib  核心库,包含 JMeter 用到的各种基础库和插件
    • licenses  包含 non-ASF 软件的许可证
    • printable_docs  可打印版本文档目录
    • LICENSE  JMeter 许可说明
    • NOTICE  JMeter 简单信息说明
    • README.md JMeter  官方基本介绍

    下面我们重点看下 bin 目录,如图

    主要介绍 bin 目录下我们最关注几个文件:

    • jmeter.properties JMeter 核心配置文件,各种配置基本在这
    • 完成
    • log4j.conf JMeter 日志配置管理
    • jmeter.log JMeter 运行日志记录,什么输出信息、警告、报
    • 错都在这里进行了记录
    • jmeter.bat windows 下 jmeter 启动文件
    • shutdown.cmd windows 下 jmeter 关闭文件
    • stoptest.cmd windows 下 jmeter 测试停止文件
    • jmeter-server.bat windows 下 jmeter 服务器模式启动文件

    ==注:每一个.cmd 文件都对应一个.sh 文件,.sh 是 linux 下的对
    应功能的文件==

    关键配置说明

    jmeter.properties 配置说明主要包含以下几个方面的配置:

    • SSL 配置:重点关注下面几个配置# 指定 HTTPS 协议层  

       # 指定 HTTPS 协议层
       https.default.protocol=TLS
       # 指定 SSL 版本,实际应用中可能需要修改
       https.default.protocol=SSLv3
       # 设置启动的协议
       https.socket.protocols=SSLv2Hello SSLv3 TLSv1
       # 缓存控制,控制 SSL 是否可以在多个迭代中重用
       https.use.cached.ssl.context=true

    • JMeter 测试项目自动备份配置

       # 设置是否启用自动备份,默认是 true
       jmeter.gui.action.save.backup_on_save=true
       # 设置自动备份目录,默认备份至 JMeter 根目录的 backups下
       jmeter.gui.action.save.backup_directory=
       # 设置自动备份项目数,默认为最近 10 个
       jmeter.gui.action.save.keep_backup_max_count=10

    • 远程主机配置

      # 配置远程主机的 IP,默认为本机。用逗号","可以设置多个远程主机
      remote_hosts=127.0.0.1
      # 多个远程主机指定示例如下,其中:后为端口
      remote_hosts=127.0.0.1:1099,127.0.0.1:1200,127.0.0.1:1300
      对于 RMID 的配置请直接看配置文件中的选项说明

    • 日志管理配置

      # 设置日志格式
      log_format_type=default
      # 设置日志输出级别
      log_level.jmeter=INFO
      # 设置 junit 日志输出级别
      log_level.jmeter.junit=DEBUG
      # 设置日志输出目标文件,默认为 jmeter.log
      log_file=jmeter.log

    • jmeter.bat 关键配置修改

      为了更优化的使用 jmeter,需要对 jmeter.bat 中的一些配置根据当前机器的配置进行优化,这里进行关键配置项说明,大家根据自己的机器的配置来进行修改。jvm 相关配置,大概在 80 行左右,找到这些配置,对其中的数值根据当前机器的硬件配置来修改。
      set HEAP=-Xms2048m -Xmx2048m
      set NEW=-XX:NewSize=512m -XX:MaxNewSize=512m
      set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
      set TENURING=-XX:MaxTenuringThreshold=2
      if %current_minor% LEQ "8" (
      rem Increase MaxPermSize if you use a lot of Javascript in your Test Plan :
      set PERM=-XX:PermSize=512m -XX:MaxPermSize=1024m)

    JMeter 组件手册

    在 jmeter 中提供了一系列的不同的组件,每一种组件都提供了某类功能的实现,用于支持性能测试的实施。请看下图,jmeter 的核心组件构成。

    学习、研究 jmeter 之前,深入了解 jmeter 的基本组件及其作用是必须的。接下来我们开始讨论基于 jmetere 进行性能测试必须掌握的组件,以便大家逐步掌握 jemter 的核心基本能力。下面的几个组件是入门 jmeter 必须掌握的:

    • Thread Group
    • Samplers
    • Listeners
    • Configuration

    Thread Group( 线程组) 

    线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。

    在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。例如,如果你设置线程数为 100,那么 jmeter 将创建并模拟测试100 个用户请求到服务器端。

    如下图所示:

      Samplers

    我们常用的 jmeter 测试有 HTTP、FTP、JDBC 协议,以及其他各种支持的协议。

    在 jmeter 中 Samplers 组件已经实现了哪些协议的支持。如下图所示:

    • BeanShell Sampler

      这个组件元素允许我们在 jmeter 中写 Bean Shell 脚本,写这个脚本有什么作用?意味着你可以完全的控制和实现自己的需要。灵活定制,自然也就有难度,你得有点脚本功底。

      参见图说明:

      

    注:每一个 Sampler 都有自己独立的 beanshell 解析器,并且sampler 只能在自己的线程中调用(意味着不可跨线程使用)。

    • FTP Request

      FTP Request 元素提供了测试 ftp 服务器的能力,这个元素让我们能够去测试 ftp 的上传、下载功能。下面我们看一下 ftp 元素的基本配置说明:

       

      注:我们经常在 windows 和 linux 直接通过 ftp 进行文件传输,建议勾选 Use Binary Mode,避免编码问题。

    • HTTP Request

       HTTP Request 提供了 HTTP/HTTPS 协议的测试支持能力。了解下基本的功能。

      

    • Java Request

      Java Request 提供了测试 java API 的支持,但要注意要测试的
      java API 需要有对应的测试类,该测试类必须继承AbstractJavaSamplerClient。
      示例如下:
      待测类 class Sum; -> 生成 sum.jar
      继承至 AbstractJavaSamplerClient 的测试类 Class
      TestSum(AbstractJavaSamplerClient) -> 生成 testSum.jar
      ==注:==
      一个 java 测试应该要实现以下几个方法,以便 jmeter java sampler 可以正确调用:

      

      注意 testSum.jar 要能调用 sum.jar。将上述 sum.jar、testSum.jar 拷贝至 jmeter 安装目录的 lib/ext下。

      

    • Listeners( 监听器) 

      在 jmeter 中 Listeners 提供了执行结果生成和显示能力的支持,提供了树形结构、表、图形和日志方式。下面我们先看下几种结果显示示例图。

      图形模式:

      

      树模式:

      

      表模式:

      

      日志方式

      

    • Configuration Elements( 即配置元件) 

      配置元件包含了 Samplers 下各种 Sampler 的默认配置设置,如果有配置默认配置,在 Sampler 下对应的 sampler 就会使用该默认配置。

      下面我们看看我们主要用到的默认配置有哪些。

      

      

    下面进行逐一的说明。
    CSV Data Set Config
    CSV Data Set Config 主要用于读取 csv 格式的文件中数据,实现参数化。

    HTTP Cookie Manager
    HTTP Cookie Manager 主要用于默认 cookie 管理。

    HTTP Request Defaults
    HTTP Request Defaults 用于配置 HTTP request 的默认值,例如 IP、端口等等都设置好默认值后,在后续 HTTPrequest 元素里就不需要重复设置,节省时间。

    JMeter 性能测试基本过程及示例

    jmeter 为性能测试提供了一下特色:

    jmeter 可以对测试静态资源(例如 js、html 等)以及动态资源(例如 php、jsp、ajax 等等)进行性能测试
    jmeter 可以挖掘出系统最大能处理的并发用户数
    jmeter 提供了一系列各种形式的性能分析报告

    使用 jmeter 一般用于以下两种类型的性能测试

    负载测试:通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。
    压力测试:测试系统能承受的最大负载能力。目的在于发挖掘出目标服务系统可以处理的最大负载。

     基本过程

     下面我们看下使用 jmeter 进行性能测试的基本过程

    对上图进行简要的说明
    新增线程组
    创建测试线程组,并设置线程数量及线程初始化启动方式。
    新增 JMeter 元组
    创建各种默认元组及测试元组,填入目标测试静态资源请求和动态资源请求参数及数据。
    新增监听器
    创建各种形式的结果搜集元组,以便在运行过程及运行结束后搜集监控指标数据。
    运行&查看结果
    调试运行,分析指标数据,挖掘性能瓶颈、评估系统性能状态;

    示例
    下面我们以打开百度演示上述过程。
    新增线程组
    在 jmeter 的 bin 目录下双击 jmeter.bat或ApacheJMeter.jar 启动 jmeter,如下图:


    在左边操作栏中选择“测试计划”,右击新增一个线程组,如图所示:

    初始化线程组相关信息

    新增 JMeter 元组
    添加默认配置元素,添加如下默认配置,如图

     

    各默认组件配置如图所示。HTTP Cache Manager

    HTTP Cookie 管理器

    HTTP 请求默认值

    添加 HTTP Request 元组
    在线程组上右击新增 HTTP 请求,如图:

    HTTP 请求设置如图:

    新增监听器
    在这里我们添加如下监听器,如图所示

    运行&查看结果
    如果启动运行 jmeter,可以单击添加的监听器查看运行过程中的监控指标数据,也可以等运行结束后,再查看。

    结果说明
    下面我们就监听器所采集的结果图进行简要的说明:图形结果

    察看结果树

    用表格查看结果

    聚合报告

    JMeter 定时器

    在默认情况下,jmeter 发送每个请求之间是没有延时的,如果采用默认方式,如果线程数足够大,瞬间就会将服务器压死。再则在实际的业务过程中,请求之间是有一定时间的停顿的所以在请求之间设置合理的延时是必须的,也是更接近用户真实业务情况。在 jmeter 中,定时器组件提供了系列不同类型的延时控制。合理使用定时器组件,能让你的性能测试更接近真实,更能挖掘出系统的瓶颈和评估系统的性能指标。

    定时器类型

    1、固定定时器

    这是最简单的一种定时器,也是新手最常用的一种方式。下面我们看下其具体设置:

    因其是固定值,在实际模拟用户请求的过程中,会失去灵活性,不推荐大量使用该定时器。

    2、高斯随机定时器

    高斯随机定时器,又可以称作正态分布随机定时器,该定时器可以设置在两个请求间随机延时时长。且总的延时是高斯分布(正态分布)的总和(均值:0.0、标准差 1.0)。在使用时须指定偏差延时值和偏移值。。下面我们看下其具体设置:

    例如在访问百度首页,然后输入关键词进行搜索,受网络、人等各种因素影响,有的人打开首页后 3s 后则进行了搜索,有时则是 10s或更多时间,在正常情况下,打开百度然后进行搜索,假设用户间隔在 3s-10s 之间,从统计学来看,这个间隔时间可能是一个正态分布或接近正态分布。而不是一个固定的常量。从笔者在日常实践中,也更推荐使用该定时器。能更接近模拟用户实际情况。

    3、Synchronizing Timer

    这个定时器应该是大家很期望的,它有在 LoadRunner 中有一个大家熟悉的名称:集合点。是的,它实现了某种意义上的并发。

    请注意 Timeout in milliseconds 尽量填写一个合理的值。

    4、Uniform Random Timer

    该定时器可以在请求之间设置一个随机延时,每个随机延时有相同的发生概率。总的延时等于随机延时 + 偏移延时值。该定时器也是常用之一。

      5、Poisson Random Timer

    类似高斯随机定时器,只是其随机延时值发生在一个特定的值。总的延时值呈现泊松分布。

     6、Constant Throughput Timer

    通过控制每分钟请求数(即控制吞吐的方式)来控制是否进行延时暂停。
    例如,当我们需要使服务端长期处于一定的压力下时,可以通过该定时器来控制吞吐。
    注意:吞吐值可以是常量,也可以使用函数来动态生成,已达成更灵活的使用,满足不同的压力场景。

     7、JSr R223 Timer   和  BeanShell Timer

    这两种定时器就不细说了,简单的说就是提供了脚本方式来进行控制,是更为灵活的方式。一般情况下,大家是不会用的。当然有兴趣的,可以去研究下,增强理解。

    JMeter 断言

    在 jmeter 中断言用于验证服务器返回的数据是否满足我们的要求。jmeter 提供了以下断言类型:

    下面我们主要对响应断言、XPath Assertion、jp@gc - JSONPath Assertion 进行分享,这几个断言类型也是日常压测过程中最常用的,对于其他的断言类型,请大家去看官方文档。jmeter 提供了多大十几种断言方式,但合理利用好常用的几种断言就足以在驰骋于实际的项目应用了。

    1、响应断言

    响应断言允许用户通过添加模式字符串来比较验证服务器返回的响应。例如对响应返回的状态码进行验证,或是对响应返回的本文内容验证等等。下面我们对响应断言进行详细的说明:

    • 名称、注释

      这里根据你实际的需要填写即可。

    • Apply to

      一般选择 Main sample only 即可。如果一次发送多个请求,则需要根据实际断言需要选择其他选项了。(例如一个 ajax请求,会发送多个 GET 或 POST 时。)

    • 要测试的响应字段
    • 响应文本

      服务器响应文本,一般情况下,我们都是勾选改选项,用于验证服务器返回值。

    • Document(text)

      通过 Apache Tika 从各种的文档中提取的文本进行验证,包括响应文本,pdf、word 等等各种格式。jmeter 会用Apache Tika 去解析服务器响应内容,耗内存、也耗时间,解析易失败,尽量少用或不用。多用响应文本方式来进行断言验证

    •  URL 样本

      对请求的 url 进行断言,如果请求没有重定向(302),那么该url 即为请求的 url;如果有重定向(切跟随重定向),那么url 则包含了请求 url 和重定向 url。

    • 响应代码

      即 http 响应代码,例如 200,404 等等,需要注意:由于 jmeter 默认情况下认为 4xx,5xx 时该请求失败,所以在断言这类响应代码时,需要同时勾选 Ingore Status,才能正常去做断言。

    • 响应信息

      即响应代码对应的信息,例如 OK, Not Found 等等这类的。如下常见类似是响应信息:
      HTTP/1.1 200 Ok
      HTTP/1.1 302 Found
      Response Header : 响应头信息,例如

      Server: Tengine Date: Thu, 12 Mar 2015 09:43:52 GMT
      Content-Type: text/html
      Content-Length: 260
      Connection: close
      Location: http://www.baidu.com/404.html


    1. Response Headers
    即 http 响应头信息,主要用于断言当响应头带有唯一或特定意义时。
    2. Ingore Status请参见 4 响应代码的使用说明。
    3. 模式匹配规则
    4. 包括: 指返回结果包含要测试的模式中指定的内容,支持正
    则表达式
    5. 匹配:(1)相当于 equals。返回值是固定的,可以以返回值做断言,效果同 equals;(2)正则表达式匹配。用正则表达式来匹配返回结果,但必须全部匹配。即正则表达式必须能匹配整个返回值,而不是返回部分值,注意与包括模式的区别(包括是支持模糊匹配的)。
    6. Equals:指返回结果与指定的测试模式完全一致。
    7. Substring:与“包括”模式差不多,都是指返回结果包括指定的内容,但 Substring 不支持正则表达式。
    8. 否:相当于取反。即如果上述断言结果为 true,勾选“否”选项后,则最终断言结果为 false。
    注:在使用该断言时,熟练掌握正则表达式是必备的能力。

      XPath Assertion

    如果服务器响应返回的是 xml 格式的内容,这时最佳的断言验证类型就是使用 XPath Assertion。

    • Apply to

    一般选择 Main sample only 即可。如果一次发送多个请求,则需要根据实际断言需要选择其他选项了。(例如一个 ajax请求,会发送多个 GET 或 POST 时。)

    • XML Parsing Options

    Use Tidy(tolerant parser):使用 Tidy(容错解析器),默认选择 quiet
    Quiet:不显示
    Report errors:错误报告
    Show warnings:显示错误
    Use Namespaces:使用名称空间
    Validate XML:验证 XML(文件包/数据)
    Ignore Whitespace:忽略空格(允许你指定语法分析器可以忽略哪个空格,而哪个空格是重要的)
    Fetch external DTDs:获取外部 DTDs(一些 XML 元素具有属性,属性包含应用程序使用的信息,属性仅在程序对元素进行读、写操作时,提供元素的额外信息,这时候需要在 DTDs中声明)

    • Path Assertion

    输入框中写入 xpath 断言,点击 Validate 验证其正确性

    • True if nothing matches

    确认都不匹配

    jp@gc - - JSON Path Assertion

    如果服务器响应返回的是 json 格式的内容,这时最佳的断言验证类型就是使用 jp@gc - JSON Path Assertion。

    注: 默认下载的 jmeter 是不支持该方式的,需要安装 json plugins,在选项-Plugins Manager-Available Plugins 找到 JSON Plugins 安装好即可。下面对 json path assertion 进行说明

    • JSON Path

    json 提取表达式,用于提取目标 json 串节点值。

    • Validate against expected value

    勾选该选项,则验证目标期望结果

    • Match as regular expression

    勾选该选项,则期望值项,支持正则表达式

    • Expected Value

    自定义期望值

    • Expect null

    期望值为 null,勾选该选项,则会断言结果为 null 的情况

    •  Invert assertion(will fail if above condition met)

    取反,如果上述两种期望值断言为 true,勾选该选项,则断言结果为 fail;如果上述期望值断言为 fail,勾选该选项,则断言结果为 true。

    JMeter 逻辑控制器

    在 jmeter 中逻辑控制器主要分类两类:

    • 控制 jmeter 测试计划中节点的逻辑执行顺序等等
    • 对 jmeter 的节点进行分组,方便结果统计等等

    进一步简化下,笔者把逻辑控制器分为

    逻辑控制类
    分组控制类

     逻辑控制类:逻辑控制类控制器定义了在执行线程中请求的执行顺序。下面我们就常用的逻辑控制器进行说明

      如果(if) 控制器:

    控制其下面的子节点满足条件才执行,例如,我们控制只有执行线程大于 10 个时,才执行其子节点。

    条件: 判断语句

    Interpret Condition as Variable Expression?):选中这项表示:判断变量值是否等于字符串true(不区分大小写)

    Evaluate for all children:如果选中这一项,在每个子结点执行前都会计算表达式

    例如:

    用户参数:

    将需要控制的API拖放到if控制器里:${account}=="15514064088"

    循环控制器:

    控制其下面的子节点运行次数。例如我们设置其子节点执行 10次

    如果勾选永远选项,则会一直执行下去。

      仅一次控制器:

    控制其子节点在整个测试计划执行期间的每个线程仅执行一次,例如我们可以用于等登录动作。

      随机控制器:

    每次执行时,从其子节点中,随机选择一个进行执行,例如我们百度首页随机请求不同的类型的资讯信息。

    简单控制器(Simple Controller):

    作用:这是Jmeter里最简单的一个控制器,它可以让我们组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能。

    ForEach控制器(ForEach Controller):

    作用:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。如下图:

    参数:

    • Input Variable Prefix:输入变量前缀
    • Output variable name:输出变量名称
    • Start index for loop(exclusive):循环开始的索引(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)
    • End index for loop(inclusive):循环结束的索引
    • Add”_”before number:输入变量名称中是否使用“_”进行间隔。

    用户自定义变量:

      变量名前缀为ForEach Controller中Input variable prefix定义的name + 下划线(上图中我们勾选了下划线)+数字编号

    执行结果:

      总共执行了3次,每次执行时会把获取到的变量值赋值给输出变量outNmae,其它地方可以通过${outNmae}进行调用。

    Switch控制器(Switch Controller):

    作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器。有两种赋值方式:

    • 第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
    • 第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。

    当Value为空时,默认执行第1个子节点元素。 

    示例:

    1、Switch Controller选择的值为login page

    吞吐量控制器(Throughput Controller):

    作用:控制其下的子节点的执行次数与负载比例分配,也有两种方式:

    • Total Executions:设置运行次数
    • Percent Executions:设置运行比例(1~100之间)

      示例:

      1、设置线程组循环5次:

    2、Throughput Controller1的子结点执行3次:

    3、Throughput Controller2的子结点执行(40% * 线程组循环次数5)= 2次:

    Jmeter录制手机app脚本

    环境准备

    1.手机

    2.wifi

    3.jmeter

    具体步骤

    1.启动jmeter

    2.“测试计划”中添加“线程组”

    3.工作台中添加“http代理服务器”

    4.配置代理服务器:Global Settings下面的端口配置:9988,HTTPS Domains配置:http://10.200.52.88,目标控制器配置:测试计划>线程组,其中端口:随意设置;ip:电脑的ip,如图所示:

     手机代理设置

     手机连接刚刚配置的wifi

    启动jmeter的代理服务器

    HTTP代理服务器--点击“启动”按钮,启动http代理服务器

    手机录制(操作app)

    启动手机上需要测试的app,进行业务操作,这个时候就可以看到线程组抓到app上发出的请求了

    业务操作完成后,立即停止jemter上的http代理服务器,否则会一直抓包,出现多余无用的请求

    添加查看结果树

    回放;

  • 相关阅读:
    Another mysql daemon already running with the same unix socket
    cloud maintenance of OpenNebula
    内核分析阅读笔记
    eucalyptus,openNebula云构建漫谈
    quotation
    Adress
    cos
    COS回应7大质疑
    linux内核地址mapping
    开源 免费 java CMS
  • 原文地址:https://www.cnblogs.com/smarter/p/14378316.html
Copyright © 2011-2022 走看看