unittest使用parameterized参数化后如何调用添加到测试套件中

写了一个Unittest+Python+execl的一个接口自动化,在参数化的时候遇到了一个问题。具体的“坑”如下

要实现的需求

在execl中涉及或写接口测试用例,然后读取execl中每一行的数据,每一行数据就相当于一条用例

需求实现

path = "F:\InterFace_JIA1\dataconfig\source_user_case.xlsx"
params_list = TestRunCase(path).get_params()
print("params_list:",params_list)

class TestRun(unittest.TestCase):
    #params_list = [(2, 100000, 100001),(1, 100000, 100003)]
    @parameterized.expand(params_list) # 这里参数化了params_list
    def test_run(self, name, expect_res, actual_res):
        self.assertEqual(expect_res, actual_res)

if __name__ == '__main__':
	unittest.main()

用例为:

在这里插入图片描述

结果为:

在这里插入图片描述
有问题,从这个运行看,流程是OK的参数化后调用加入测试条件中

if __name__ == '__main__':
    suite = unittest.TestSuite()
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
    filename = "./report/" + now + '_result.html'
    fp = open(filename, 'wb')
    suite.addTest(TestRun('test_run'))
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fp,
        title=u'测试结果',
        description=u'全部测试用例')
    runner.run(suite)
    fp.close()
    time.sleep(2)
    print("sdasdasdasdasdasdsa")

结果出错

TypeError: 'NoneType' object is not callable

排查分析

使用unittest.defaultTestLoader.discover,打印所有的case,发现用例格式是“test_run_0”

<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<main.run.TestRun testMethod=test_run_0>, <main.run.TestRun testMethod=test_run_1>]>]>
if __name__ == '__main__':

    suite = unittest.defaultTestLoader.discover('./', pattern='run.py')
    for case in suite:
        print (case)

重新调用

把test_run改成test_run_0

if __name__ == '__main__':
    suite = unittest.TestSuite()
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
    filename = "./report/" + now + '_result.html'
    fp = open(filename, 'wb')
    suite.addTest(TestRun('test_run_0'))
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fp,
        title=u'测试结果',
        description=u'全部测试用例')
    runner.run(suite)
    fp.close()
    time.sleep(2)
    print("sdasdasdasdasdasdsa")

仍然报错:

提示“test_run_0”找不到

再次分析

发现如图,使用suite = unittest.defaultTestLoader.discover('./', pattern='run.py')即可,直接去掉suite.addTest(TestRun('test_run_0'))

再次调试

结果就OK了

class TestRun(unittest.TestCase):
    #params_list = [(2, 100000, 100001),(1, 100000, 100003)]
    @parameterized.expand(params_list)
    def test_run(self, name, expect_res, actual_res):
        self.assertEqual(expect_res, actual_res)
        #print(actual_res)
        #self.assertTrue(True, actual_res)

if __name__ == '__main__':

    suite = unittest.defaultTestLoader.discover('./', pattern='run.py')
    # for case in suite:
    #     print (case)
    # suite = unittest.TestSuite()
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
    filename = "./report/" + now + '_result.html'
    fp = open(filename, 'wb')
    #suite.addTest(TestRun('test_run_0'))
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fp,
        title=u'测试结果',
        description=u'全部测试用例')
    runner.run(suite)
    fp.close()
    time.sleep(2)
    print("sdasdasdasdasdasdsa")
    #sendmain(filename, mail_to=['zhangbo@novastar.tech'])

本文转载于网络 如有侵权请联系删除

相关文章

  • csrf中的一些小tricks

    文章最后更新时间为:2020年02月04日20:27:33csrf漏洞最常见,也比较简单,一般结合别的漏洞放大危害,这里简单整合一下断断续续的笔记片段。1.csrf常用的payload一般利用js构造http请求方便后续的网页跳转。<html> <body> <script> varrequest=newXMLHttpRequest(); request.open("POST","http://localhost:3000/post_transfer",false); request.setRequestHeader("Content-type","application/x-www-form-urlencoded"); request.withCredentials=true; try{ request.send("quantity=10&destination_username=attacker"); }catch(err){ //Dono

  • 百度网盘否认人工审核照片/ 嚼口香糖能减肥/ 80年代老歌唱崩硬盘...今日更多新鲜事在此

    日报君发自凹非寺 量子位|公众号QbitAI大噶好,今天是周五,还有几个小时就可以出去嗨皮啦!在本周工作日的最后一天,科技圈还有哪些新鲜事值得关注?一起来看~ 今日大新闻百度网盘辟谣“人工审核用户照片”8月18日,博主@边想爆出一组网络视频截图。图片显示,一名男子自称在百度网盘做兼职,并发布短视频展示了一些打过码的用户私人照片。这名男子发布的短视频中还有疑似百度网盘线上审核工作的报名页面,以及百度网盘线上审核员报名成功通知。此消息很快引起众多网友对自身信息安全的担忧。有人提出:审核人员还能随随便便把用户的照片截下来保存发到网上?即便打了码,也不大合适啊……8月18日晚,百度网盘官方发布声明称,百度网盘不存在所谓的人工审核。不过,网友们似乎对此声明不太买账……这个监控学生活动的工具,1000所美国学校都在用为了监督青少年的日常活动,一家美国公司搞出了一个叫e-HallPass的工具。这个工具还能跟踪学生上厕所的时间、地点和频率(怎么感觉怪怪的?),现已被全美超1000所学校采用。该系统的软件可以被安装在电脑或移动设备上,师生需在软件上注册,然后教师就可实时查看学生的活动轨迹和状态,甚至还

  • Flutter 本地存储之shared_preferences

    简介提供简单数据的持久性存储,同时支持Android和IOS,键值对的方式,异步存储。github:https://github.com/flutter/plugins/tree/master/packages/shared_preferences引用dependencies: shared_preferences:^0.5.3+4复制import'package:shared_preferences/shared_preferences.dart';复制使用set保存FuturesetBool(Stringkey,boolvalue)FuturesetInt(Stringkey,intvalue)FuturesetDouble(Stringkey,doublevalue)FuturesetString(Stringkey,Stringvalue)FuturesetStringList(Stringkey,Listvalue)再次set即为覆盖。get获取boolgetBool(Stringkey)intgetInt(Stringkey)doublegetDoubl

  • Q1663 具有给定数值的最小字符串(Smallest String With A Given Numeric Value)

    解析思路  leetcode中等难度中比较简单的一个,题目描述点击这里。读完描述可将本题精简为如下内容:给两个整数n和k,返回序列长度为n且数字和等于k的一个数字序列(每个数字的范围为1-26,对应26个字母),要求小的数字尽量放前面.  看到尽量小的数字放在前面且数字和是固定的,我们就应该想到可以用贪心算法来解决这个问题,思路如下: 设定i=1,s=1第i个数字放入s,假设后面数字全部为26,判断剩下的数字还能否满足要求如数字和<k说明无法满足,s=s+1重复第一步如数字和>=k说明能否满足,i=i+1,s=s+1,重复第一步直到所有的数字都填入java代码见:点击这里,translateNum1方法进一步思考会发现上面的解法存在存在很多的循环,效率不高,能否优化?当然可以,我们并不需要每次+1后再判断能否满足需求,一次计算即可计算出当前位置最小能填入多少,流程如下:设定i=1,sum=0假设i以后的位置全填入26,计算出还缺多少才能补足到k.temp=(26*(n-i))-(k-sum)如果temp>=0说明后面全填26肯定能满足要求,因此当前位置填入最小值1,i

  • Neo4j认识安装

    什么是Neo4j?Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。neo4j官网:http://www.neo4j.org废话说多了,直接上安装,越发觉得Windows的Docker超级好用,所以直接上Docker安装Windows的Docker中安装Neo4j查找合适的镜像 $dockersearchneo4j 拉取镜像 $dockerpullneo4j 验证是否拉取成功 $dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE neo4jlatesta4db428a51ee6daysago559MB 启动neo4j镜像 $dockerrun-p7474:7474-p76

  • 17种将离散特征转化为数字特征的方法

    磐创AI分享作者|SamueleMazzanti编译|VK来源|TowardsDataScience“你知道哪种梯度提升算法?”“Xgboost,LightGBM,Catboost,HistGradient。”“你知道哪些离散变量的编码?”“one-hot”在一次数据科学面试中听到这样的对话我不会感到惊讶。不过,这将是相当惊人的,「因为只有一小部分数据科学项目涉及机器学习,而实际上所有这些项目都涉及一些离散数据」。❝离散变量的编码是将一个离散列转换为一个(或多个)数字列的过程。 ❞这是必要的,因为计算机处理数字比处理字符串更容易。为什么?因为用数字很容易找到关系(比如“大”、“小”、“双”、“半”)。然而,当给定字符串时,计算机只能说出它们是“相等”还是“不同”。然而,尽管离散变量的编码有影响,但它很容易被数据科学从业者忽视。❝离散变量的编码是一个令人惊讶的被低估的话题。 ❞这就是为什么我决定深化编码算法的知识。我从一个名为“category_encoders”的Python库开始(这是Github链接:https://github.com/scikit-learn-contrib/c

  • 使用note++开发SAP WebClient UI

    Itispossibletouseyourfavoritehtmleditor(forexample,Notepad++)toeditthehtmlsourcecodeofyourUIcomponentvieworBSPapplicationbysimpleconfiguration: Justspecifytheabsolutepathofyourlocalhtmlsourcecodeeditor(.exefile)inSE80settingsbelow:TheninBSP_WD_CMPWBorSE80,usemenuEdit->StartLocalHTMLEditor:Andthenyourlocalhtmleditorisautomaticallyopenedwiththegivenviewsourcecodeloaded.HowislocalhtmleditorlaunchedwithsourcecodeThereisnomagicbehindthescene. (1)OnceEdit-localmenuisselected,firstthepathoflocaledit

  • AWS EC2实例开启IPv6方法 阅读模式

    牢骚好久没更新了,主要是不知道写些啥。最近在玩AWSEC2发现了一个小问题。 虽然默认给了IPv6但是你还用不了,这就有点反人类了奥。 话不多说,直接开搞。开始看一下网卡ipaddr复制网卡eth0内发现有并配置了IPv6 inet62406:da18:5e0:7620:2d19:9536::/128用ping命令ping一下谷歌的IPv6站ping6ipv6.google.com connect:Networkisunreachable复制会提示你无法访问网络解决只需要将/etc/sysconfig/network文件内的IPV6_AUTOCONF打开即可vi/etc/sysconfig/network 将IPV6_AUTOCONF=no改为IPV6_AUTOCONF=yes或者直接删除。复制最后重启reboot复制再次输出ping6ipv6.google.com你会发现已经能ping通了。

  • LeetCode 923. 三数之和的多种可能(双指针)

    1.题目给定一个整数数组A,以及一个整数target作为目标值,返回满足i<j<k且A[i]+A[j]+A[k]==target的元组i,j,k的数量。由于结果会非常大,请返回结果除以10^9+7的余数。示例1: 输入:A=[1,1,2,2,3,3,4,4,5,5],target=8 输出:20 解释: 按值枚举(A[i],A[j],A[k]): (1,2,5)出现8次; (1,3,4)出现8次; (2,2,4)出现2次; (2,3,3)出现2次。 示例2: 输入:A=[1,1,2,2,2,2],target=5 输出:12 解释: A[i]=1,A[j]=A[k]=2出现12次: 我们从[1,1]中选择一个1,有2种情况, 从[2,2,2,2]中选出两个2,有6种情况。 提示: 3<=A.length<=3000 0<=A[i]<=100 0<=target<=300复制来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/3sum-with-multiplicity 著作权归领扣网

  • 视频流媒体服务器在幼儿园移动监控APP中“调试日志函数调用风险”修复

    在校园使用安防视频流媒体服务器目前来说是非常必要的,把传统分散的校园监控汇总到视频流媒体服务器系统,实现把传统的本地监控提升到随时随地的远程监控,把传统的纯粹监控上升到管理,使视频监控成为学校教学管理的有力工具。我们的视频流媒体服务器也已经运用到了不同的场景中,其中校园安防的运用也很多,我们也会根据项目的需要,为项目定制一些专业化需求。比如我们的视频流媒体运用在幼儿园安防监控平台中,研发了专用的APP,偶尔出现存在调试日志函数调用风险问题。该问题应该如何解决?下面本文我们就为大家出一个解决方案。①将app的build.gradle中的minifyEnabled设置为ture②配置proguard-rules.pro文件###############################去掉所有打印 -assumenosideeffectsclassandroid.util.Log{ publicstatic***d(...); publicstatic***e(...); publicstatic***i(...); publicstatic***v(...); publicstatic**

  • Web中间件常见安全漏洞总结

    作者|lyxhh编辑|Aaron来源|https://www.lxhsec.com/2019/03/04/middleware“本文系统地介绍了各种中间常见的安全漏洞,包含IIS/Apache/Nginx/Tomcat/JBoss/Weblogic/GlassFish/WebSphere等,文章目录详见如下。”第一章:IISIIS6解析漏洞IIS7解析漏洞PUT任意文件写入IIS短文件漏洞HTTP.SYS远程代码执行(MS15-034)RCE-CVE-2017-7269第二章:Apache未知扩展名解析漏洞AddHandler导致的解析漏洞ApacheHTTPD换行解析漏洞(CVE-2017-15715)第三章:NginxNginx配置文件错误导致的解析漏洞Nginx空字节任意代码执行漏洞Nginx文件名逻辑漏洞(CVE-2013-4547)Nginx配置错误导致的安全问题第四章:TomcatTomcat任意文件写入(CVE-2017-12615)Tomcat远程代码执行(CVE-2019-0232)Tomcat+弱口令&&后台getshell漏洞Tomcatmanag

  • 以太坊助记词PHP开发包简介

    以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包。1、开发包概述以太坊助记词PHP开发包主要包括以下特性:生成符合BIP39标准的助记词将BIP39助记词转换为符合BIP32标准的层级确定密钥支持BIP44多币种层级确定性钱包规范兼容imtoken、metamask等常见钱包的助记词与密钥/地址转换以太坊助记词PHP开发包运行在**Php7.1+**环境下,当前版本1.0.0,主要代码文件清单参见:http://sc.hubwiz.com/codebag/eth-mnemonic-lib/2、核心类使用说明Mnemonic类是以太坊助记词PHP开发包的入口类,用于生成符合BIP39标准的助记词,或者将已有的助记词转化为对应的随机熵值,以便用于私钥的生成。Mnemonic类提供以下静态方法来进行实例化:new():创建新的Mnemonic对象fromWords():使用已有的助记词实例化Mnemonic对象fromEntropy():使用已有的随机熵实例化Mnemonic对象Mnemonic实例提供以下方法获取其表征的随机

  • 你真的不了解这个星球(涨姿势的大数据)

    1.首先来看看地球,看起来不错哟,地球~2.图中圈圈里头的人口,比其他地区的所有总和都还要多。3.以整个地球史来看,曾活过的人类高达1150亿人,其中包括现存的70亿人口,你也是其中的一员。上图每一个点就是1000万人,每年有1.4亿人诞生,现在有70亿人口;每年有5700万人死亡,估计曾有1080亿人在地球生活过,然后死去。4.每一天,地球都有人飞来又飞去,就像下图这样:5.这是南极州,比美国还要大呢!还有,非洲比你想像的还要大多了,看看一些国家塞进来的样子…把美国、西班牙、比利时、荷兰、法国、德国、义大利、瑞士、东欧、印度、中国的一部分、英国、日本…全都放进去。6.如果地球没有水的话,就会变成这样…7.你知道太平洋其实比起想像的还要大吗?8.这是马里亚纳海沟(MarianaTrench)的深度,难怪还有这么多人类尚未探索到的海底生物。可以深到10972公尺…或更多。9.我们都知道有很多人造卫星,但是你知道有这么多吗?10.把美国放到月球的话,大小比例是这样…11.地球到月球的距离貌似很短,但是已经可以塞下太阳系的所有星球了。有384,400公里那么远喔~12.若把火星上头的奥林帕斯

  • 基于.NET6的简单三层管理系统

    前言 笔者前段时间搬砖的时候,有了一个偷懒的想法:如果开发的时候,简单的CURD可以由代码生成器完成,相应的实体、服务都不需要再做额外的注册,这样开发人员可以省了很多事。 于是就开了这个项目,期望实现这样的能力:业务人员只需关注实体的构建,业务服务的编写,以及路由的配置。 让业务的开发,变成简单的三步走:创建实体>>业务开发>>路由配置。 目前项目构思的绝大部分能力已完成(代码生成器、定时任务还未实现),现将项目发布,希望能对搬砖的大家伙有所帮助。 项目概述 前后端分离,使用JWT认证。 后端:基于.NET6和EFCore,集成常用组件,采用传统三层结构。 前端:基于小诺1.8做适配,主技术栈:Vue2.6.x、Ant-Design-Vue 体验地址 http://175.178.244.200:12060/ 管理员:superAdmin密码:123456 普通用户:user密码:123456 快速开始 请参考项目文档:使用手册 参考项目 注:排名不分先后。 小诺snowy Admin.NET Blog.Core Adnc Furion ABP 感谢这些优秀的开

  • Java+httpclient+maven+testNG搭建接口自动化框架【杭州多测师】【杭州多测师_王sir】

    一、接口自动化框架的分层结构   二、接口自动化框架的分层结构   三、接口自动化框架的分层结构       四、接口自动化框架的分层结构 importokhttp3.*; importorg.json.JSONException; importorg.json.JSONObject; importjava.io.IOException; importjava.io.PrintWriter; importjava.io.StringWriter; /** *类DebugReportDingDing.java的实现描述:发到调试群 *@authorwin72017年3月24日下午3:53:58 */ publicclassDebugReportDingDing{ /** *@paramappName应用名 *@paraminterfaceDeclaration接口声明 *@parame *@paramresult *@return *@throwsException */ publicstaticJSONObjectreport

  • 今年美国什么工作最吃香?程序猿薪酬超医生

    [导读]美国程序猿平均年薪90060美元,成美国今年最佳职业。被人们普遍看好的医生职业仅名列第八。 USNews最新发布了2014年全美最佳职业TOP100排行榜(The100BestJobs)。当中软件开发员名列该榜单榜首,计算机系统分析师位列第2,而第3名则是牙医。 依据美国劳工部门提供的最新数据显示,软件开发者(有时也被称作为程序猿)的平均薪酬是90060美元(约合55万元人民币),当中有10%的软件开发者的薪酬水平处于上游。他们一般能达到138880美元(约合85万元人民币)。 下面为全美最佳职业前10名,由创业邦编辑: 1.软件开发员(SoftwareDeveloper) 这些专业人士就是你所爱玩的CandyCrush游戏背后密不可分的人们,他们可能是他们也许是设计了计算机软件、数据库和游戏的程序开发员。也也许是专注于操作作系统的系统开发人员。这两种类型的IT人才均在增长:美国劳工数据统计局估计,2020年之前,美国将会添加近14万个软件开发的新职位。 2.计算机系统分析师(ComputerSystemsAnalyst) 想要胜任这份工作,你须要

  • rh236-简

    目录前奏第1题配置加密(重点)第2~5题servera创建brick第6、7、8题第9题client端挂载第10题ACL第11题quota第12题配置geo-replication(步骤最多)第13题创建冷热区第14题snapshot第15题监控记忆法/简写第1题第9题第10题第11题quota第12题配置geo-replication(步骤最多)第13题第14题snapshot第15题监控 前奏 [root@foundation0~]#echoy|rht-vmctlresetworkstation [root@workstation~]#labio-encryptionsetup [root@foundation0~]#foriin{a..e};doechoy|rht-vmctlresetserver$i;done 复制 第1题配置加密(重点) 第1题没做好往后都没法做 #设置防火墙(所有节点) firewall-cmd--add-service=glusterfs--add-service=nfs--add-service=rpc-bind--permanent firewa

  • Spring bean的作用域

    Thescopeofthisbean:typically"singleton"(onesharedinstance, whichwillbereturnedbyallcallstogetBeanwiththegivenid),or "prototype"(independentinstanceresultingfromeachcalltogetBean). Bydefault,abeanwillbeasingleton,unlessthebeanhasaparent beandefinitioninwhichcaseitwillinherittheparent'sscope. Singletonsaremostcommonlyused,andareidealformulti-threaded serviceobjects.Furtherscopes,suchas"request"or"session",might besupportedbyextendedbeanfactories(e.g.inawebenvironment).复制 在spring2.0之前bean只有2种作

  • [c/c++] programming之路(21)、字符串(二)

    一、for/l%iin(1,1,5)docalc  等命令行参数 1#define_CRT_SECURE_NO_WARNINGS 2#include<stdio.h> 3#include<stdlib.h> 4 5voidmain(){ 6/*charstr[]="for/l%iin(1,1,5)docalc"; 7char*p="for/l%iin(1,1,5)docalc";*/ 8//str[0]='';str是数组,存储的是字符串的每一个字符 9//*p='';p是指针,存储字符串的地址,所以不能对其赋值 10 11charstr[100]={0}; 12intnum; 13charop[30]={0}; 14scanf("%d%s",&num,op); 15printf("for/l%%iin(1,1,%d)do%s",num,op); 16sprintf(str,"for/l%%iin(1,1,%d)do%s",num,op); 17system(str); 18 19system("pause"); 20}复制 1#define_C

  • 之后的日子(20170922)

      本人经过深思熟虑后发现,竞赛其实与高考科目颇有相似之处。在高一阶段,班主任推广了许多高效的学习方法,个人认为是很有用的。具体来说,就是学会规划,学会交流,学会总结与反思,学会升华。   规划,就是一段时间的预先计划。规划的重要性在此不提。   交流,就是与同仁的沟通与交流。《易》曰:“天地交通谓之泰”。只有学会倾听,才能更好的交心。   总结与反思,就是做完一件事后的评点。因为做完一道题或考完一场试后总有话想说,所以这是很重要的。总结要注意详略,具体的细节将在最后说明。   升华,就是不断的自我超越。个人认为,每一天训练都应当全力以赴,并时刻保证专注与投入。时刻的热情是很重要的,但是总会有累的时候。在这种情况下,就可以锻炼锻炼身体,或是做一点语文和英语。   对于语文,摘抄与总结的习惯很好。对于英语,单词本就很重要,因为能以此为中心做一系列的事情。比如,本人将在CF上多打几场比赛,在POJ上多历练一下模板。   这是我这段时间的大致规划: DS/STRING每天一道 MATH/GRAPH每天一道 DP每天一道 算几偶尔做做 知识体系将随着大部队跟进。   因为所做题目不够多,本

  • 项目总结

    本次项目总体完成度较高,规划之内的功能差不多完全实现,不过一部分功能由于技术原因做了调整。在用户体验的过程中,并没有太多的用户多我们的软件有过多的兴趣,而对于那些查询作业、查询空教室的软件却有着极高的兴趣,这也许是我们最开始策划时的一个小失误,可能我们的网并没有过多地贴近大学生。但我们相信更多的可能性是我们的网站还没有推广开,如果有更多的同学使用我们的网站一定会非常实用。 以下是通过用户评价和我们自己的反省列出的三点需要改进的地方: 1、界面过于简洁。很多用户都反映了这一问题,可能过于简洁的界面并不适用于大学生群体。 2、功能较少,但有很大发展空间。我们的网站但目前除了可以交友和满足一些简单的个人需求,确实无其他实用功能,我们预期在使用用户到达一定数量时会增加一些失物招领、兼职发布等其他功能。 3、使用不方便,应尽快形成APP。确实,如果只是网站的话确实没有APP使用起来方便,现在的大学生都追求方便简洁,可能他们确实不太喜欢总是通过网站去交流交际。

相关推荐

推荐阅读