IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 测试必备知识 -> 正文阅读

[开发测试]测试必备知识


性能测试

  • 思维差异
    • 功能测试、自动化测试
      • 输出: 找bug 预期结果与实际结果进行比较
      • 隐藏的前提:模拟都是1个用户的操作
    • 性能测试
      • 不是模拟1个人,模拟多个人同时
      • 关注?
        • 多个人操作时,响应时间,
      • 接口服务器性能测试中,一定是多个人同时操作,才是性能测试

性能概念

  • 100个人同时登录接口进行登录,性能中的avgRT应该在多少,是可以被接受的?

    • 可接受的范围 1.5s
    • 1.5 APDEX 用户满意度指数
  • 事务:一个请求行为,并不一定只有一个接口,所以,一个事务可能是多个接口。

    • jmeter:默认情况下,1个接口请求一次,认为一个1个事务Transation。

      ? 也可以是通过事务控制器,挂载多个接口请求,合并成为1个事务。

      是从发起,到网络传输,收到响应

  • 性能测试

    • 通过工具,模拟多用户发起请求,获取性能指标值
      • 用工具来模拟多个人的方式很多
        • 线程: 使用进程的资源,来干。jmeter、lr
        • 进程: 资源拥有者,资源消耗会比较大。LR
          + 进程+ 线程: ngrinder
          • 协程: python+locust

性能指标

  • 平均响应时间 avgRT 90%

  • TPS: 服务器每秒处理的事务数

    • 衡量服务器处理能力的最主要的指标
  • 吞吐量:网络中每秒传输的事务数

    • 1、没有网络瓶颈:tps 数值 = 吞吐量数值
    • 2、如果网络有瓶颈: tps 数值 != 吞吐量数值
  • 吞吐率 每秒钟能通过多少kb数据

  • 服务器资源利用率

    • cpu、内存、io的利用率
  • 并发用户数:

    • 同一时间发起请求 用户数
      • 广义并发: 同一时间发起请求(相同、不相同)
      • 狭义并发:同一时间发起相同请求
        • 集合点:集合多个人在同一时间发起相同请求

    并发用数100 发起请求,一秒钟会发起多少请求?(请求的频率)不知道,所以1秒钟总请求量,不知道,

负载测试

  • 逐步增加并发用户数,找出最大 拐点区间
    • 逐步增加并发用户数,
    • 区间怎么判断
      • 有没有报错
      • tps下降
      • 响应时间变长

50tps: 服务器每秒能处理50个事务

50 t/s * 60 * 60 = 18w 300tps

18w * 8h = 144w

内容回顾

性能测试:通过工具,模拟一定量的并发用户数,向服务器发起请求,获得我们性能指标

负载测试: 逐步增加并发用户数, 获得最大并发用户数的拐点区间

?拐点区间:
1、有没有报错

2、响应时间

3、tps下降

压力测试: 使用一定量的并发用户数,持续比较长时间向服务器发起请求,查看服务器的稳定性

? 一定量:访问 小于最大并发用户数 20% 或 80% maxThreads

内容

TPS: 服务器每秒处理事务数 服务器的综合处理能力

吞吐量:网络每秒能通过的事务

rps: 请求,每秒用户请求率 发起方

qps: 每秒查询率, 服务器的查询

? 在企业中,如果没有严格区分,是把1个事务,当做只查询1次,但,实际请求可能是 1事务: n个查询

hps:hitpers 每秒用户点击率 页面点击

容量测试

在性能测试时,如果数据库的数据量级是不一致的,性能指标值,也可能存在差异。 在做性能测试时,数据库的数据量级一定要保证一致。

? 生成的数据库数据量级 百万级

测试用的环境,独立性能测试环境, 不超过万

性能测试: 需要自己搭建性能测试环境,独立环境

性能测试,不能使用功能测试环境、自动化测试环境、验收、生成环境都不能用。需要自己搭建独立环境

自己搭建:

独立环境:真正的性能测试环境,机器资源配置是和生产完全一样(硬件配置一样、数量一样、网络一样、架构参数一样)

网络:网络架构,网络基础,性能测试,不能使用无线网络,也不要去使用vpn等桥连,尽可能使用局域网

  • 性能测试并不是想做就做?

    • 核心的业务,用户量最大优先

    可测性:反复沟通确定性能指标

  • 性能测试流程

    • 性能测试准备
    • 搭建性能测试环境
    • 性能测试脚本开发
    • 性能测试脚本执行
    • 结果分析与调优
    • 测试报告与结果跟踪

性能课程需要的知识面

服务器的发展

台式机器  --->  刀片机有了n个操作系统后, 
vmware虚拟技术:vmware、
   虚拟出操作系统
     理论上1个刀片机安装1个操作系统之后,可以虚拟出n多个操作系统
     1:n操作系统
   1个刀片机   n个刀片机
   08-15年左右,企业中服务器为虚拟机非常流向
   用vmware 虚拟技术虚拟的操作系统,是非常消耗本机的硬件资源
   用vmware虚拟技术虚拟的机器,能产生多个操作系统,更大化使用本机资源,但是,vmware也非常消耗资源,会使用大量的磁盘空间和cpu、内存资源。它对我们本机的性能是有影响,但是因为虚拟了多个操作系统,可以更大化利用空间。
云服务器
   也是虚拟技术发展的产品,虚拟操作系统(比较完整的操作系统)
 docker
   也是linux操作系统,定制化, 缩减版的操作系统(namespace、unionFS、cgroup)

应用发展

os系统: linux(常用命令)
   常用名称
  配置环境变量
  防火墙、网络
  linux的性能分析命令(top、ps、netstat、)
cpu
OOM
jvm    前面这些内容,快速浏览,暂时不要深入研究

应用的发展

  • 最开始,所有的代码都在一个工程下面,生成一个项目包,随着项目开发,代码越来越多,要运行这个工程的硬件资源配置就要越来越高
  • 然后,就是拆项目和数据库Oracle sqlserver access mysql postgrasql、文件服务ftp、oss器、 项目服务器apache、tomcat、springboot、 springcloud、docker 、集群nginx
  • 数据库: 主从、非关系型(mongodb、memcache、redis)、时序数据库(influxdb\ prometheus)
  • 拆项目:前 后端(最初)中台, 后台逐步模块化,微服务

环境的搭建

ova文件

? vmware + 操作系统iso ===导出 ova文件 开机即可使用

安装vmware软件、virtualbox: 一定要记得 重启动电脑

? 查看‘网络连接’ 里面一定要有 vmnet8 必须是启用

Vmware工具,可以在windows、linux、mac中安装( 版本可以是12以上都可以)

vmware file > 打开 找到ova文件 填写名称,选择路径(不要使用默认的c盘路径)

第一次会报错,没有关系,点击重试

  • 导入成功之后: 编辑虚拟机设置

    • 根据自己的机器配置,修改 内存大小,cpu的数量
    • 网络适配器,vmware一定要选择 NAT 网络 virtualbox选择桥接网络
  • 开启虚机机:

    • 账号密码: root 123456
    • 这台机器的jdk版本是1.7 所以,千万不要去改这台机器的jdk也不要拿这台机器做课程后面的练习。
      • 一旦改变jdk,项目 易捷支付项目将不能正常启动
    • 项目是用 tomcat8 /opt/apache-tomcat-8.x.x
      • 没有开机自启动,所以需要自己手动去启动tomcat
    • 项目的数据库用的 mysql docker方式安装的mysql
      • 开机自启动mysql
  • 启动机器

    • 第1件事情: 登录用户

    • 第2件事情: 执行 ifconfig 登录后,稍微等5秒钟左右

      • ifconfig 查看ip信息

      • 看到网卡名称为 ens33 的 inet 就是机器ip地址

        • 192.168.114.140
        • 这个时候,你本机和这个项目机器是一个局域网
        • 和你公司其他人员的电脑,不在一个局域网
    • 第3件事情:启动项目

      • cd /opt/apache-tomcat-8.5.56/bin
        • 可以写 开头字母+tab键
      • ./startup.sh ./st按下tab键
  • 使用远程连接客户端工具

    • xshell crt、finalshell、putty、dos终端

工具环境搭建

  • 安装jmeter

    • Apache 托管的开源java工具
    • 接口测试、自动化测试、性能测试
    • java要运行依赖什么?
      • jre java 运行环境
      • jdk java开发工具包,一般是包含jre
      • 我们课程中,除了kyj项目是jdk1.7 其余所有地方用到jdk的都是1.8
    • 查看jdk版本
      • java -version 正常返回jdk版本,但是不代表你的系统就配置JAVA_HOME环境变量
      • JAVA_HOME
  • jmeter安装

    • 解压zip包,进入解压后文件夹\bin文件夹中,双击 jmeter.bat,启动图形界面GUI

      • mac ./jmeter.sh
    • 用jmeter版本是5.1.1

    • 1、不需要大家配置JMETER_HOME环境变量

      • 原因: 如果配置了,那么你的电脑就有且仅能运行一个jmeter
      • 配置环境变量,可能会导致,直接闪退
        • 直接闪退原因:
          • 配置了环境变量
          • 没有安装jdk
          • 包少了文件
    • 2、一台电脑,理论上可以启动任意多个不同版本jmeter

    • jmeter设置语言:

      • jmeter.properties
        • 以.properties结尾的文件,都是jmeter的属性配置文件
        • 最关键的 属性 配置文件 jmeter.properties
          • 修改属性配置文件中的信息,一定要重启才能生效
      • gui中 options > choose language > chinese simplied
        • 临时切换gui界面语言
        • 一旦关闭gui,就会被还原
  • 文件路径:

    • bin 启动 配置文件
    • lib jar包 工具自身jar, 以及第三方jar
      • ext 第三方插件管理
    • docs 文档 用于jmeter进行二次开发调用的api 接口文档
    • printable_docs 离线帮助文档
    • extras 扩展 CICD 性能测试持续集成
  • gui界面

    • 一切都在右键掌握之中
    • 测试计划: 工作中测试计划: 什么时间什么人做什么事情
      • 万物的根, 脚本的根文件
      • 元件
        • 线程组: 接口、自动化测试时,基本不会去改动
          • 性能测试,这个是用于进行性能场景设计
          • 线程组:进行性能场景设计
          • setup线程组
          • teardown线程组
        • 配置元件
          • 优先级是最高的, 正式干活时,急先锋
          • 用户定义变量
        • 监听器
          • 就是侦探 就是摄像头,性能结果进行监控,展示结果数据
          • 不同的元件,是从不同的角度,展示结果数据
        • 取样器: 根据不同的协议,使用不同的取样器编写脚本
        • 逻辑控制:
        • 前置:
          • 用户参数
        • 后置: 对取样器进行控制
        • 定时器

接口文档: 用户使用易捷支付平台的 接口文档 不是管理人员的接口问题

jmeter写脚本

万能法

先把项目启动
打开我们项目接口文档
   接口文档: 一般是开发
特别注意事项:
  当你的接口请求参数为json格式时,**一定**要写请求头,请求头中**一定**要有 Content-Type: application/json
   如果没有这个信息,100%报错,不局限于jmeter
   衍生: http**请求**包括哪些部分
     请求行
       请求方法,请求地址URI
     请求头
       Content-Type
       cookie
       User-Agent
     空一行
     请求体
       参数:  表单
       消息体数据: json 、xml

json格式

  • {“key”:“value”,“key1”:1}

  • 开发人员接口中定义的返回码code,和http response_code不一样

    • http response_code:

      • 2xx: 网络请求超过 200
      • 3xx: 重定向相关 301
      • 4xx: 请求URL地址有问题 400 404
      • 5xx:服务器内部异常 500、502bad gatway
    • 开发人员在接口中定义的code,响应代码

声明: 我们的项目接口地址URI中只有一层/app

写脚本

  • 测试计划上右键, 添加 线程组
  • 线程组上右键,添加 取样器> http请求 (http协议簇)
  • 线程组上右键,添加 监听器 > 查看结果树

一个最简单的jmeter脚本,包括,线程组、取样器、监听器

线程组: 性能测试中用于场景设计的,写脚本阶段不用改动

取样器: 根据不同的协议,编写不同的脚本。 填空

监听器: 调试脚本时使用,性能测试执行时禁用

? 不管哪种监听器,都是对结果数据进行不同维度的展示,这些展示,是需要消耗本地资源的

8080端口,是tomcat的默认端口

http协议的默认端口:80

https协议默认端口: 443

jmeter的默认保存路径,jmeter的bin文件夹

请注意:

1、当请求体为json, 一定要有请求头 Content-Type:application/json

2、json格式有问题

3、协议: 当协议为http时,可以不写,如果是https,那就必须写

4、服务器名称或IP:不能带有/

5、路径: 不要带域名或ip,和端口

? 路径开头,用/

? 不要带有空格, 带有空格请求URL %20 urlencoded编码

? URI 资源地址

? URL: 带domain

6、内容编码:utf8

? 请求内容出现乱码处理方法:

? 1、内容编码: utf8

? 2、请求头,;charset=utf-8

? 3、请求体为参数类型:勾选参数“编码” 编码:urlencoded编码

? 在参数值为 非字符(汉字、特殊符号) 我都需要勾选编码

? 给大家的建议: 参数值,不管什么类型,都建议勾选编码

? 响应内容出现乱码处理方法:

? 需求修改jmeter.properties中sampler.result.encoding

? 不是简单的设置为utf8、 gbk、gb2312、big5

? 同一个接口,用postmen请求,响应是正常,用jmeter请求响应中文乱码?原因是: jmeter的编码是根据操作系统编码。

? 在国内,中文windows系统的字符集编码是gbk 936, mac系统中文编码utf8

7、参数、消息体数量 选择

? 当我们的请求接口文档中说,请求体为json格式,那么我们就选择用消息体数据,来写json, soap=http+xml

? 参数: 我们的请求体,form-data

? Content-Type: application/x-www-form-urlencoded 或者不指明请求体类型,get

8、自动重定向:不会显示中间重定向过程,无法从过程中,提取信息

? 跟随重定向:会自动显示重定向过程,能从过程中,提取想要信息,用于后面接口请求

使用keepAlive:保持连接, 长连接,

因为现在用http协议版本为1.1 就是长连接,所以,默认勾选keepAlive,但是在性能测试中,我们会根据需要,去掉这个勾。

写脚本注意事项

  • 协议: http,https必须谢

  • 域名或ip: 不能有/

  • 请求方法: 看清楚接口文档

  • 路径: 不要把 域名和ip再次

    • 路径中,前后空格要看清楚 %20 空格的urlencoded编码
  • 内容编码: utf8

    • 请求体编码控制:
      • 1: 内容编码
      • 2: 消息头
      • 3: 参数, 勾选编码 urlencoded
    • 响应乱码:
      • 乱码原因: GUI的编码
      • 修改配置文件
  • 请求体:

    • 参数: form-data application/x-www-form-urlencoded

    • 消息体数据:

      • json xml
      • 要特别注意:一定要添加请求头,Content-Type:application/json
  • 新内容:

    • 上部分内容,再扩展

      • 没有接口文档?
        • 抓包: F12 、fiddler、wireshark、Charles
        • 第三接口:api接口
        • swagger:

写脚本方法扩展

录制脚本:
   badboy: 曾经很流行,现在已经不维护,已经被遗弃
   
   代理录制:  用于脚本参数比较多,或者用手动编写脚本,一时半会写不出来。
   
     代理服务器: 自己启动一个代理服务器
     本地,要使用代理服务器的ip和端口,使用自己启动的代理服务器

    1、添加线程组
    2、测试计划 > 非测试元件 > http代理服务器
       ip就是你自己电脑的ip,port是可以修改,默认8888
       目标控制器,**一定要修改   修改为**  测试计划>线程组
       添加过滤器
    3、启动代理服务器时,会出现一个证书的弹窗
       如果要抓取https信息时,就必须使用证书 
    4、本地浏览器使用 代理服务器上网

脚本功能增强

关联: 前面接口的响应信息,有动态值,作为后续接口的参数参数
 我想把手机号码,发生变化:
   变量: 用户定义变量,用户参数
   **用户定义变量**:
     配置元件、测试计划
     **全局变量**: 
       作用域:作用于整个‘**测试计划**’
     <font color="red">在启动运行时,获取一次值,在运行过程中,不会动态获取值,在运行过程中,值一直都不变。</font>
   **用户参数**:
     前置处理器
     **局部变量**
       作用域: 作用于当前线程组或当前的取样器
     <font color="red">在启动运行时,获取一次值,在运行过程中,还会动态获取值。</font>
  • 定义用户变量
    • var_user: 1888888888
      • 引用变量: ${var_user}

jmeter的函数: 方法

1888888${__Random(1000,9999,)}: 字符串的连接

使用用户定义变量,设置5循环 register + login: 1次register-success 5次login-success

使用用户参数,设置5循环 register + login: 5次register-success 0次login-success

迭代: 一个线程组下所有的接口,全部执行完1次,才算1个迭代

用户参数

  • 每次迭代更新一次

  • 函数:方法

    • 双下划线开头
    • 函数名称,严格区分大小写
    • 重要的函数
      • ${__counter(,)} 计数器
      • ${__dateTimeConvert(,)} 时间格式转换
      • ${__digest(,)} 加密 简单加密
      • ${__intSum(,)} 整数相加函数
      • ${__P(,)} 获取属性函数
      • ${__property(,)} 获取属性函数
      • ${__setProperty(,)} 设置属性函数
      • ${__Random(,)}
      • ${__RandomString(,)}
      • ${__threadNum} 获取线程号函数
      • ${__time(,)} 获取当前时间戳函数
      • ${__timeShift(,)} 数据格式化
      • ${__V(,)} 拼接函数

用户定义变量 vs 用户参数

用户定义变量

全局变量:  可以跨线程组
在启动时,获取一次值,在运行过程中不会动态获取值

用户参数

局部变量: 不能**直接**跨线程组
在启动时,获取一次值,在运行过程中,还会动态获取值
  • 作为功能测试、自动化测试,非性能测试时,可以把接口写在一个线程组下面
  • 在性能测试时,可能会因为不同的需求,把接口写到不同的线程组
    • 在性能测试中,多线程组脚本,有个难题,跨线程组传参
    • 我们采用“用户属性
    • 函数

函数

  • 查看,帮助、Random

  • jmeter中的函数: 可以被直接调用的方法

  • 使用函数的注意事项:要特别注意,函数名称的大小写

  • 重要的函数

    • ${__counter(,)} 计数器
      • 加1功能
      • 如果要 加2 ===计数器元件
        • 重点:最大值, 如果运行结果超过最大值时,又会从起始值开始循环
        • 每个用户独立计数器: 多线程时,每个用户都是从起始值开始计数
    • ${__dateTimeConvert(,)} 时间格式转换
    • ${__time(,)} 获取当前时间戳函数
      • 当前的时间
    • ${__timeShift(,)} 数据格式化
    • ${__RandomDate(,)} 随机日期
      • 不包括结束日期
    • ${__Random(,)}
    • ${__RandomString(,)}
    • ${__digest(,)} 加密 简单加密
    • ${__intSum(,)} 整数相加函数
    • ${__P(,)} 获取属性函数
    • ${__property(,)} 获取属性函数
      • P 只是property这个函数的简写
    • ${__setProperty(,)} 设置属性函数
      • 设置jmeter的动态属性
    • ${__V(,)} 拼接函数
  • 属性: 以.properties结尾的文件,都是jmeter的属性配置文件

    • 属性是什么?是jmeter工具自身带有的标签。
    • jmeter工具属性:
      • jmeter属性:可能被改变
        • 静态属性: 写在properties文件中属性信息,都是静态属性
        • 动态属性:运行过程中,动态定义属性
      • 系统属性: os、jdk ===这个系统属性信息,是不可改变
    • 属性 vs 参数 \ 变量 区别
      • 属性是jmeter工具具有,所有,jmeter中的线程组要使用属性,都可以使用
      • 参数、变量,有局限访问
  • 动态属性:一直存在?还是朝生夕死?

    • 动态属性,是在运行过程中产生的,关闭jmeter,就是自动释放了。
  • 顺序?

    • jmeter中,多个启用线程组,在执行时,默认是并行执行
    • 性能测试中,我们不会勾选 测试计划中 “独立运行每个线程组”
      • 混合场景设计

======

${__V(,)} 拼接函数

属性

  • jmeter的属性,是jmeter工具自身的标签
  • 属性:
    • jmeter属性:
      • 静态属性: propertites文件中
      • 动态属性: setProperty 函数进行设置, P porperties 函数获取属性
    • 系统属性: 不可改变

jmeter中,做功能测试、自动化测试时,你可以使用 Beanshell元件,

但是,在性能测试中,能不用,坚决不要用带有任何Beanshell。

如果你要写java脚本,也不要使用Beanshell任何元件,JSR223 开头元件

jmeter可以支持: java、jython、python、groovy、js。

  • V函数, 拼接函数:

    • KaTeX parse error: Expected group after '_' at position 5: {var_?{__counter(,)}} -----我们期望它得到过程是${var_1} ${var_2} ${var_3} 最终的结果是变量的值 实际是要进行两次变量计算
      • =====这个方法是办不到,得不到我们的结果。
  • KaTeX parse error: Expected '}', got 'EOF' at end of input: {\_\_V(var\_{__counter(,)},)}

类似: var_1 var_2 前缀相同,后缀是递增数字的变量名称,常见于 jdbc从数据库中获取数据时。

select name from table where id like ‘123%’; —结果可能有多条数据

这个脚本就会返回多个name值, 我用table_name这个变量来接收值,table_name_1,table_name_2…

${变量名称} ===得到变量的值

${__V(前缀_可变后缀)} ===== 得到是这个 “前缀_可变后缀” 变量名值

${__P(属性名称)} ====得到的是 属性名称的值


特别注意事项

1、查看结果树中,

? 绿色>只是代表网络成功,不代表结果是否准确;

? 红色,代表失败,失败的原因有千万,具体是那种,需要具体排查

2、查看结果树为红色,不要只截图 取样器结果

? 需要截图: request-body + request headers, response-body

3、最重要点: 查看结果树中的显示顺序是,根据收到响应的先后顺序显示

jmeter中取样器的执行顺序:在没有逻辑控制器控制时,顺序是从上往下,不管多少人并发,每个线程用户都是从上往下执行。

会出现 取样器的执行顺序与 查看结果树中的显示顺序不一致。

  • 响应提取: response提取
    • json提取器
      • 当确定响应信息为json格式时,我们优先选择用 json提取器提取我们响应的信息
      • $.根路径.二级路径 json提取式 ----绝对路径写法
      • $…末梢节点名称 -----相对路径写法, 推荐
      • 在取样器上右键 > 后置处理器 > json提取器
        • json中的key-value键值对顺序是无序
      • 重点:
        • $…
          • 一个json提取器写多个提取式
    • 正则提取器
      • 正则提取式: 左边界(正则式)右边界 万能正则式: .*?
        • 除换行符之外,都可以匹配

data date

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:49:55  更:2022-05-05 11:51:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:34:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码