自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(385)
  • 收藏
  • 关注

原创 Python四种常用的高阶函数,你会用了吗

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。filter的第一个参数传入一个函数,第二个参数是可迭代对象,将可迭代对象里的每一个值,交给传入的函数处理,如果结果为真,就保留这个值。如果结果为假,就去掉这个值。有列表[1, 2, 3, 4, 5],将所有元素转换成str: [‘1’, ‘2’, ‘3’, ‘4’, ‘5’]去掉偶数,保留奇数[1,2,3,4,5,6,7,8,9]

2023-04-06 09:18:51 630 1

原创 python实现基于RPC协议的接口自动化测试

业务是积分兑换,该接口的参数是一个对象,对象类型对应后台java代码中的某个类cn.testfan.dubbo.model.ExchangeRequest,这个类对象对应的属性如下,这些属性其实就是我们的参数。相比于传统的HTTP协议,效率更高,传输占用带宽更小。注意在公司里你们的grpc服务可能并不是采用python去实现的,课上咱们为了测试grpc的接口,使用python先创建grpc的服务接口。业务是抽奖,参数有两个,都是数字,没有参数名称,按照顺序,第一个表示参与的活动id,第二个表示用户id。

2023-04-03 09:34:05 577

原创 Python自动化必不可少的测试框架 — pytest

Python在测试圈的应用非常广泛,特别是在自动化测试以及测试开发的领域,其中在自动化测试中我们常用的测试框架是uniitest和pytest,本文将带领大家搭建以及熟悉pytest的使用。考如果直接敲pytest执行,则会查找当前目录及其子目录下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以test 开头函数并执行。执行pyteststudy.py这个文件中符合pytest用例规则的所有用例,而该文件并不需要遵循pytest对于文件的命名规则。

2023-03-29 09:48:47 329

原创 接口测试必备技能 - 加密和签名

数字证书由来:因为公钥是公开的不安全,所以需要第三方的CA(数字证书颁发机构)对公钥进行加密,加密后的东西就叫数字证书。使用用户名,密码,时间戳和所有的排序过的参数组合起来,再加密得到的字符串,字符串是唯一的有权访问第三方金融接口的鉴权码=sign接口签名。非对称式加密:非对称式加密需要两个密钥(双钥),分别叫公钥和秘钥,这两把秘钥可以互相加解密,公钥公开的,不需要保密,私钥是保密的。”)[1]//取到url的?⑥ A用CA的公钥去解开数字证书,拿到B的公钥,在使用公钥解密密文,从而得到数据报文。

2023-03-02 09:26:10 3333

原创 关于bug的分类和定金,终于有人讲明白了

有时候严重性高的软件缺陷,优先级不一定高,甚至不需要处理,而一些严重性低的缺陷却需要及时处理,具有较高的优先级,视具体情况而定。一般是指不满足用户需求的则可以认为是bug,狭义指软件程序的漏洞或缺陷,广义指测试工程师或用户提出的软件可改进的细节、或与需求文档存在差异的功能实现等。表示问题的修复很紧要,很急迫,关系到系统的主要功能模块能否正常使用,包括功能、数据,或者其他的一些比较着急的需求。(例如:用户所要求的功能缺失,该有的页面未实现,逻辑不通,重要图表数据未开发,等)

2023-02-27 09:09:49 323

原创 websocket接口自动化集成pytest测试框架

01websocket协议1、介绍WebSocket是一种在单个TCP通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

2023-02-24 09:18:33 332

原创 Cypress简易入门教程

① 安装yarn (https://yarnpkg.com/en/docs/install#windows-stable)① 安装node.js(https://nodejs.org/en/download/),根据版本选择32位或64位。相当于unittest中的 def teardown(cls) 方法或者Junit的 @Before方法标签;相当于unittest中的def setUp(cls)方法或者Junit的@Before方法标签;it(‘策略#2:从响应头解析令牌’, function(){

2023-02-22 09:34:05 460

原创 学会这些Jmeter插件,才能设计出复杂性能测试场景

第2次加载200并发,延迟100sec(=30sec+10sec+60sec),加载30sec,减压10sec,持续60sec;第3次加载100并发,延迟200sec(=100sec+100sec),加载30sec,减压10sec,持续60sec;jmeter自带的线程组插件模拟的压测场景非常有限,当需要模拟复杂压测场景的时候,推荐大家使用jmeter线程组插件。第4次加载200并发,延迟300sec(=200sec+100sec),加载30sec,减压10sec,持续60sec。

2023-02-20 09:20:17 414

原创 Python文件的操作处理,一看就会

在读取一个文件的内容之前,需要先打开这个文件。在Python程序中可以通过内置函数open()来打开一个文件程序中,并用相关的方法读或写文件文件中的内容以供程序的处理和使用,同时可以将文件看作Python中的一种数据类型。注意:有个很像的 readlines()方法 ret = f.readlines() #返回的是一个列表,且返回的是你读取的字符所在行的整个内容,但是当数据较大时,这样的用法会很占用内存。#打开”IO.png“文件,并以二进制的方式读出, b不能单独使用(b前的r不能省略)

2023-02-15 09:25:27 310

原创 别不信!掌握好这20个Linux命令常用项,可加薪30%

玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。当然你也可以在使用时去找一下man,他会帮你解决不少的问题。然而每个人玩Linux的目的都不同,所以他们常用的命令也就差异非常大,而我主要是用Linux进行C/C++和shell程序编写的,所以常用到的命令可以就会跟一个管理Linux系统的人有所不同。因为不想在使用是总是东查西找,所以在此总结一下,方便一下以后的查看。

2023-02-13 08:59:57 313

原创 用了10年Postman,没想到它的Mock功能也如此强大

使用postman,前端团队和后端团队完全可以在约定了API接口之后,各自完成开发,而不需要收到对方进度的影响,因此在真正开始开发工作之前,接口、数据格式的约定变得尤为重要,当然,因为postman是支持组开发的,即便接口,数据有变化,也可通过share collection的方式,及时同步collection下request的变化,并立即反应到mock server上。集合中,有两个request:mock_r_1 和 mock_r_2,一个GET,一个POST,对应的path分别是/test,/tp。

2023-02-10 09:18:07 584

原创 你还搞不定前端性能测试?这里有一大波测试工具请拿走

特别在移动端,网络一直是一个很大的瓶颈,并且页面越来越大、功能越来越复杂,因此需要一套性能监控系统来持续监控、评估、预警页面性能状况、发现瓶颈,指导优化工作的进行。这些执行工具都很好使用,并且它们关注的性能点也有些不同,所以就有了将这些工具产生的数据都收集起来的工具showslow。前端性能测试的目的是计算出包含页面渲染、网络传输以及服务器端解析等综合因素在内的加载时间指标,对该页面性能进行评估分析,找出影响性能的主要因素和瓶颈,并在此基础上,给出一定的优化建议和解决方案,从而提升用户体验。

2023-02-08 08:59:12 393

原创 都在说测试左移和右移,只有这篇文章说明白了

对于测试左移,也需要一个重要的基础,工程习惯,SDLC成熟度,测试分层,持续集成,链路上延展发布的节奏,纵深上需要贴合业务的专精领域的深度探索,代码扫描(规范,问题,安全,异常等),CR, 代码提交行为分析,test double(mock , fake, stub,dummy), UT, 自动化,验收测试等。测试左移,其实就是通过一系列的活动,能提高质量的上限,缩短测试的周期,提高质量的下限,这样子,我们就可以在不断提高下限的过程中,始终将质量稳定在一个水平线上,而和团队一起追求更高的目标了。

2023-02-06 09:23:06 395

原创 弱网测试利器-Charles工具实战

在之后弹出的对话框中,我们可以勾选上 “Enable Throttling”,并且可以设置 Throttle Preset 的类型,如果我们只想模拟指定网站的慢速网络,可以再勾选上图中的 “Only for selected hosts” 项,然后在对话框的下半部分设置中增加指定的 hosts 项即可。这是非常有用的模拟不可靠的网络条件。稳定性是衡量一个连接的可能性是不稳定的,因此降低了质量。指定MTU不改变的可用带宽,但允许Charles在MTU分配带宽大小的块,导致在每个传输包分割的现实水平。

2023-02-01 09:10:04 299

原创 测试开发必知必会:Pytest框架实战

应用场景:pytest 框架可以解决我们多个测试脚本一起执行的问题。它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose,开箱即用。接下来我们详细了解下pytest框架。01安装和介绍概念:pytest 是 python 的一种单元测试框架,同自带的 Unittest 测试框架类似,相比于 Unittest 框架使用起来更简洁,效率更高。

2023-01-30 09:31:17 221

原创 小白必看!用JMeter+ANT进行接口自动化测试,并生成HTML测试报告

配置jmeter报告输出格式为xml,在jmeter/bin目录下jmeter.properties文件中修改jmeter.save.saveservice.output_format=csv为jmeter.save.saveservice.output_format=xml,并去掉前面的注释符号#2、设置测试输出报告要输出的内容,同样在jmeter.properties中,设置需要输出的内容为true,并去掉前面的注释符号#,这里全部设置成true。1、配置ANT配置ant编译文件build.xml。

2023-01-16 10:01:17 1289

原创 Python+ Flask轻松实现Mock Server

return {"status": 200, "msg": "登录成功!data = {"status": 200, "msg": "登录成功!# 返回带有响应状态码的代码# 提取数据# 判断return {"status": 200, "msg": "登录成功fdgdsgsd!else:return {"status": 100, "msg": "用户名或密码错误!"}

2023-01-11 09:04:33 627

原创 基于requests框架实现接口自动化测试项目实战

requests库是一个常用的用于http请求的模块,它使用python语言编写,在当下python系列的接口自动化中应用广泛,本文将带领大家深入学习这个库,Python环境的安装就不在这里赘述了,我们直接开干。01requests的安装windows下执行如下命令:mac终端下执行如下命令:02常用方法。

2023-01-09 09:19:52 394

原创 使用Jmeter轻松实现AES加密测试

如下所示在JMeter的BeanShell 后置处理程序中已编写的脚本中,增加第5行调用url解码方法对应答报体做url解码处理,当然JMeter自带的urldecode函数也能实现url解码处理,第1行实现的是引入java.net包下的URLDecoder类,提供给第5行url解码方法调用,其他脚本行的注释内容详见步骤三,这里就不再赘述了。接口请求aes加密,需要获取aes加密方法,不同于解密操作步骤是步骤三,调用的是获取到的aes加密方法。经过以上步骤一、二、三操作即可实现对aes密文的解密。

2023-01-05 09:03:26 619

原创 Appium环境搭建及元素定位

将Android SDK中 platform-tools路径下的adb.exe 复制到模拟器安装路径下的bin目录替换原有的adb.exe 删除原有的nox_adb.exe,将新的adb.exe复制一份改名nox_adb.exe。Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,它以美观而灵活的用户界面为您提供Appium自动化服务器的强大功能。您可以使用Inspector查看应用程序的元素,获取有关它们的基本信息,并与它们进行基本的交互。

2023-01-03 09:13:14 222

原创 Jmeter二次开发实现rsa加密

setParameters()方法用于获取JMeter函数的入参值,咱们rsa加密需要两个入参,分别是明文、公钥,参数个数是2,在setParameters()方法需要先检查入参个数的最大值、最小值是不是2,然后将参数集合Collection转成数组存到Object数组变量values中,并定义类成员变量MAX_PARA_COUNT、MIX_PARA_COUNT、plaintextCV、publicKeyCV,分别存最大变量个数、最小变量个数、明文、公钥。2,getArgumentDesc方法实现。

2022-12-30 09:59:31 707

原创 WebUI自动化必备技能-HTML和css知识详解

学习web自动化的前提条件:手工测试(了解各种测试的知识)、学习编程语言、学习Web基础、学习自动化测试工具 、学习自动化测试框架 、需要掌握前端的一些知识,无论学习语言还是前端知识,都是为了接下来的脚本和框架做铺垫,本篇文章介绍下前端基础知识网页基础(HTML、CSS),web前端三大核心技术HTML:负责网页架构CSS:负责网页的样式,美化JS:负责网页行为01常见的HTML标签HTML是描述网页的一种语言HTML指的是超文本语言,不是编程语言,是一种标记语言。

2022-12-28 09:09:08 122

原创 移动端测试必备技能: adb命令和抓包

adb是一个C/S架构的命令行工具,由三部分组成,ADB就是连接手机和电脑通信的桥梁,只要这个桥梁 建立起来了,那么你就可以通过电脑来控制你的手机了。4fiddler的端口号,与浏览器中ip:端口号保持一致,点击确定即可 打开手机浏览器 安装fiddler 证书IP:8888。应用场景:自动化测试中需要知道app的包名和activity,通过命令获取使用步骤:开启被测应用,输入命令。3手机系统设置-无线网-点击高级,代理选择手动,主机名就是fiddler的电脑ip地址,端口号,就是。

2022-12-26 09:39:19 946

原创 Selenium常见元素操作,学完就能上手

如何使用selenium完成web页面元素的定位和操作,是web自动化测试工程师用例代码中的主要工作,元素定位主要有8种,定位到元素后,需要做的就是元素行为的模拟,比如点击按钮元素、在文本框输入内容等等,如何使用selenium实现元素操作呢?//随机勾选2个多选选框。1WebElement element = driver.findElement(定位方式方法);15//实例化WebElement对象,element该对象为双击目标对象。2//定义WebElement selenium元素对象集合。

2022-12-23 09:08:04 634

原创 Postman核心功能解析-参数化和测试报告

newman run token.postman_collection.json -d logindata.txt -e pinter项目.postman_environment.json -n 3 -r html --reporter-html-export .\。newman run 用例集.json -e 环境文件.json -d 数据文件.json -r html --repoter-html-export report.html。-e 环境文件.json 指定运行的环境。执行后目录生成报告文件。

2022-12-21 09:18:11 738 1

原创 验证码是自动化的天敌?看看大神是怎么解决的

这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到帐号的控制权,通行贴吧、知道、百科、文库、空间、百度云等百度主要产品。当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检查Cookie,以此来辨认用户状态。登录baidu,登录成功后抓取 (BDUSS)

2022-12-19 09:16:19 303

原创 有了这款工具,自动化识别验证码再也不是问题

lang 是语言名称(在 Tesseract-OCR 中 tessdata 文件夹可看到以 eng 开头的语言文件 eng.traineddata),如不标-l eng 则默认为 eng。【语法】:tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile…//图片路径 D:\Tesseract-OCR\test.png 生成 txt 文件存放路径及文件名 result。使用 tesseract 命令识别图片中的内容。

2022-12-09 09:21:48 589

原创 高阶测试开发必备技能: k8s入门

现在稍微有点规模公司都是基于docker容器化部署技巧,K8s现在主流,应用最广的容器集群管理技术。k8s全称kubernetes(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s),基于Docker容器集群环境管理问题,是谷歌保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。k8s定位是实现集群环境下资源管理的容器自动化管理,主要提供了如下的主要功能:自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动

2022-12-07 09:28:35 333

原创 收下这份实操案例,还怕不会用Jmeter接口测试工具?!

01简介JMeter,一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是接口功能、自动化、性 能测试的工具。具有高可扩展性、支持HTTP、HTTPS、TCP、等多种协议,还可以自己编写Java脚本对 协议进行扩展。官方网站:https://jmeter.apache.org02安装和配置1、本机安装好jdk环境2、官网下载压缩包,在任意目录下解压3、修改配置文件,打开Jmeter的bin目录下jmeter.properties,修改:language=zh_CNsampleres

2022-12-05 09:06:19 140

原创 基于docker部署实现接口自动化持续集成

因为我们要执行的是接口自动化,并且我们希望在jenkins slave节点上执行,而不是在jenkins所在的master上执行,因此我们需要配置节点相关的内容。Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。我们使用节点是用来完成接口自动化项目的执行,先创建一个目录叫dockepython,其中创建一个Dockerfile文件,内容如下。

2022-12-02 09:51:30 325

原创 Python接口自动化核心模块 - 数据库操作和日志

进行接口测试时,我们需要连接到数据库中,对数据源进行备份、还原、验证等操作。Python连接数据库常见模块MysqlDBpython2时代最火的驱动库。基于C开发,对windows平台不友好。现在已经进入python3时代,基本不再使用MysqlClient它是重量级Web开发框架Django中ORM功能依赖工具Pymysql纯Python实现的驱动,性能比MysqlDb差,但是安装简单,容易使用SQLAlchemy即支持原生SQL也支持ORM的库我们以pymysql为例01Pymysql使用方法安装方

2022-11-30 09:19:59 143

原创 验证码是自动化的天敌?看看大神是怎么解决的

01验证码1、什么是验证码:指一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性自动化过程中也是需要进行注册或者登陆的操作,所以需要处理验证2、验证码处理方式:去掉验证码由开发操作,用在测试环境这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。设置万能验证码由开发操作,一般也只使用在测试环境验证码识别技术由于技术难度高,识别率很难

2022-11-28 09:59:32 105

原创 基于数据驱动的接口自动化框架封装

1.数据驱动框架设计1.框架结构common: 这是一个package,主要用来存储所有的底层代码封装logs: 这是一个目录,主要用来存放日志文件report: 这是一个目录,里边的data表示测试结果数据,里边的html表示测试报告,注意这两个目录都是每次执行测试时自动生成的testcases: 这是一个目录,主要用来存储excel文件,excel文件里是接口测试的相关数据conftest.py: 重写pytest自带的一个内置函数的,统一管理自定义fixture的。

2022-11-25 10:33:20 235

原创 深入底层学git:目录中包含的秘密

分支说白了,就是一个独立的开发空间,比如有些时候需要做前端开发,有些时候需要做后端开发,这个时候我们就可以在仓库中,为前端创建一个分支,为后端创建一个分支,前后端彼此在不同的分支里面,他们的工作是互相不影响的,当她们需要集成的时候,又可以将这两个分支集成到一个公共的分支,这个就是分支的作用。如果不出意外的话,猜测temp文件中存的是,存的是0c193开头的字符串,这串字符串也是指针。分支指向的是commit,这个tag如果也是打在这个commit上的话,css01中的内容是不是就是commit的id号呢?

2022-11-23 09:59:20 210

原创 测开小知识: Git目录下都放了什么

git具有最优的存储能力,在没有远端git服务器的情况下,git本地就可以独立作为版本管控系统,这其中.git裸仓库中起了关键作用,那么我们一起来看看.git下都放了哪些文件。打开Git Bash,切换到项目目录,具体命令,如下所示:$ pwd$ ll$ cd git-rainbow/$ ll$ cd mtxcrm/$ ls -la之前我们了解过如何生成一个git仓库,使用命令git init,创建完毕后,它会在当前路径下生成.git文件夹(或者叫目录),这个里面就装了git最核心的信息,我们一起

2022-11-18 09:38:38 274

原创 接口测试结果字段太多?断言烦不胜烦?DeepDiff帮你一键搞定

我们可以根据自己实际的项目去增加字段,比如report_repetition重复报告情况,significant_digits小数点后的显著位数,ignore_string_case是否区分大小写,字段这边就不一一列举介绍了,可以参考官网。其实满足上面需求的库有两个deepdiff和difflib,主要区别是deepdiff显示的对比效果比较简洁,但是可以设置忽略的字段,difflib显示的对比结果可以是html的,比较详细。DeepDiff可以对字典,可迭代项,字符串和其他对象的深层差异。

2022-11-17 09:55:37 190 2

原创 性能调优必备神器-Jprofiler解析

JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。显示消耗时间最多的方法的列表。在JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。

2022-11-14 10:28:22 666

原创 太全面了!RF接口自动化框架项目实战

根据项目情况,添加公共配置变量,各个服务的域名,数据库信息,redis信息,买家/卖家/管理员账号,并且导入需要的第三方库RequestsLibrary。{other}代表,${other}的传递规则是字符串形式的json格式字符串,key必须是jsonpath表 达式,value是要替换的新值。创建一个项目,名字自己起,课上叫微服务项目接口测试框架,初始项目结构如下,不要着急对着图去创建,看下方解释再创建。接口默认参数:这是一个目录,当接口参数比较多时,用来存储默认参数的,存到文件里, 方便管理。

2022-11-10 10:56:40 594

原创 这里有篇Charles详细教程,看完后就可以把Fiddler卸载了

如果你有这样的困扰,可以使用抓包工具自行抓接口数据信息,不同的协议需要使用不同的抓包工具,今天我给大家分享的是,针对http以及https协议的抓包工具charles,如何设置?在代理设置窗口中,勾选“启动SOCKS”代理,“通过SOCKS启动HTTP代理”、“包括默认HTTP端口(80,443,8080,8443)”自动被勾选上,保持这两个选项的勾选设置,单击【确定】。在弹出的“选择证书存储窗口”中,单击“受信任的根证书颁发机构”,单击【确定】。在Charles窗口中,单击菜单项“代理”》“代理设置”。

2022-11-07 09:41:26 236

原创 基于Android系统的自动化环境搭建

下载自己想要的版本,笔者的是 python3.5的版本,默认安装就行,安装成功后,将 python加入环境变量,在命令行输入 python验证 python环境是否成功。会提示缺少.NET Framework ,需要下载这个组件就可以,因为 Appium是由.NET 开发的,所以,它会依赖 .NET framework相关组件。其他版本:https://bitbucket.org/appium/appium.app/downloads/github 已经把使用方法告诉大家,但是是英文的,可以自己整理一下。

2022-11-03 09:38:30 138

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除