2022年7月6日面试题

ssh分布式自动化测试框架是怎么做的?

详情见《使用pytest-xdist实现分布式APP自动化测试:基于SSH》

接口自动化测试框架介绍

x项目上线周期较短,任务较重,从立项到上线只有半年的时间,因此希望能够提前介入到接口测试,尽早发现项目底层的一些bug,保障功能测试能够平稳进行,以及做好迭代阶段的回归测试,因此公司安排我做项目的接口自动化测试
1、为了便于代码的可维护性,采用数据和用例分离的设计思想。数据存储在excel中,通过openpyxl读取数据,封装成一个字典列表的形式,列表中的每一个字典都对应着一条case,通过ddt.data进行拆包,将每个元素分别传给封装好的request方法去做请求,拿到响应之后,将结果提取出来和期望结果做断言,最后通过unittest,先生成一个TestSuite对象,然后生成一个TestLoader对象,通过TestLoader对象的discover方法发现测试用例,将最终发现的测试用例通过TestSuite对象的addTests方法放在测试套件下,再过runner对象的run方法运行测试套件对象
2、对于参数替换,在excel中使用${}标记随机数的变量,使用{{}}标记关联接口的变量,在公共目录下定义随机数类存放生成随机数的方法,定义Context类作为反射类,同时还会定义一个变量替换方法,这个方法通过判断是excel数据否包含${}或者{{}}来决定如何替换,如果数据是${}的形式,则通过eval(随机数方法)来替换,如果数据是{{}}这样的形式,则会通过eval(反射类.属性值)来替换。在测试用例类中,发送请求之前,先会调用变量替换方法,将请求数据中需要替换的数据做个替换,然后通过封装好的requests方法来做接口请求,拿到响应结果后,先判断excel数据中是否有response_extract字段,如果有就通过分割字符串的方法,将{{key}}=$..jsonpath表达式,分割开来,=前面的是key,=后面的是value,再通过反射方法将key和value赋予Context类的类属性和属性值。
对于接口里数据库的断言,通过flask将数据库的查询语句封装成接口,然后和业务接口放在一起,最终将数据库的查询结果取出来再去和业务接口的响应结果做断言
3、此外,还可以介绍一下日志、发送邮件、环境配置以及jenkins持续集成

接口自动化断言都是断言哪些内容

code、关键字段、还有数据库

面向对象三大特征是什么

面向对象三个基本特性
面向对象思想有三个基本特性:封装性、继承性和多态性。

封装性
面向对象的封装使外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。外部访问者不需要关心对象的内部细节,操作对象变得简单。

继承性
举例,轮船与客船的关系,客船具有轮船的全部特征和行为。
在面向对象中,轮船是一般类,客船是特殊类,特殊类拥有一般类的全部数据和操作,称为特殊类继承一般类。一般类称为“父类”或“超类”,特殊类称为“子类”或“派生类”。

多态性
多态性是指在父类中成员被子类继承之后,可以具有不同的状态或表现行为

一个province表,一个city表,city.pid = province.id,求出广东省的城市数量

select count(*) from province left join city on city.pid = province.id where city.name = '广东省';

linux常用命令

cd、ls、top、mkdir、ps -f、tail -f、mv、chmod、vim、uptime等

python中的重写和重载

override就是重写,不改变函数的输入和输出,重写函数的代码块功能
overload就是重载,改变函数的输入和输出。即同一个方法名可以支持多种类型的参数输入

性能指标有哪些

  1. 并发
    指同一个时间点执行相同的操作(秒杀)

  2. 并发用户数(重要指标)

同一时间点,执行相同请求的用户数

系统用户数、在线用户数(系统用户数、在线用户数和性能没关系)、线程数(模拟出成千上万的人员,虚拟用户数,线程数,与开发的线程不同)

  1. 事务(Transaction)

指一个客户机向服务器发送请求然后服务器做出反应的过程

注意:这里的线程数指的是虚拟用户数,与开发的线程不太一样

jmeter里通常理解为:一个接口从发起请求到响应称为一个事务,LR中多个接口的请求到响应可以看做一个事务,多个接口写在一个事务包里

  1. 响应时间(RT)(重要指标)

从发起请求到收到响应的时间。发起请求网络传输时间 + 服务器处理时间 + 返回响应网络传输时间

  1. TPS\QPS(最主要指标)

TPS(Transactions per Second):服务器每秒处理事务数,衡量服务器处理能力的最主要指标

QPS(Queries per Second):每秒查询数

差异:一个Transactions 可能有多个Queries,比如访问网页

注意:TPS高,说明代码复杂度低,CPU好,内存消耗低,数据库运算能力快

一个事务可能包括多个查询,因此可能QPS大一些,TPS小一些,比如百度一下,有可能调用多个查询接口

RT:想要真正的服务器处理时间,因此实际做测试时尽量不要使用堡垒机、跳转机

  1. 吞吐量(Throughput)

单位时间内处理的请求数量(事务/s)

如:港口吞吐量,1年5千万标准集装箱

  1. 吞吐率

单位时间内通过的数据的平均速率(kb/s)

如:港口日吞吐率,年吞吐量/365天

  1. 点击数(Hit per Second)

每秒点击数

  1. 资源利用率

指系统资源的使用程度,比如服务器(网络以及数据库)的CPU利用率,内存利用率,磁盘利用率,网络带宽利用率等

CPU利用率

内存利用率

磁盘I/O

一般都不要超过80%

TPS和QPS的区别

TPS:(Transactions Per Second),即每秒执行的事务总数。
首先一个事务包括三个动作,即客户端请求服务端,服务端内部进行处理,服务端对客户端进行响应。

将这三个动作看成一个整体,并将之称为一个事务,若在一秒内,服务端可以完成N个事务,则这个服务端的TPS为N。

一般来说,评价系统的性能主要看系统的TPS,系统的整体性能取决于性能最低模块的TPS值。

(木桶的容量取决于最短板,当然你不能把木桶斜着放,斜着放虽然能够改变木桶容量的依赖,此时依赖变为最长板,但会产生额外的消耗,比如需要一直扶住木板,或者产生木桶歪倒的风险)

QPS:(Queries Per Second),及每秒执行的查询总数(每秒有多少的请求响应)
客户端请求一个地址时,比如百度首页,其实会产生很多的请求,比如js、css、png等,像这样的每个单个请求都可以算作查询次数。

若在一秒内,客户端请求服务端的首页,服务端返回了N个内部链接(js、css、png、html等),那么服务端的QPS就为N。

QPS反映系统的吞吐能力,更偏向于读取文件,查询数据

算法:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

解答:

class Solution():

    def twoSum(param_1, param_2):
        if 2 <= len(nums) <= 10 ** 4:
            for i in range(0, len(nums)):
                for j in range(i, len(nums) - 1):
                    if nums[i] + nums[j + 1] == target:
                        print(nums[i], nums[j + 1])
                        break
        return [nums[i], nums[j + 1]]

linux的解压缩命令

如果是.gz格式的:
压缩:gzip test.txt
解压缩:gunzip test.txt.gz

如果是.tar.gz格式的:
压缩:tar -zcvf text.tar.gz test.txt
解压缩:tar -zxvf test.tar.gz

如果是.zip格式的:
压缩:zip test.txt.zip test.txt
解压缩:unzip test.txt

常用的http请求类型

1、GET方法

用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。

在GET请求的URL中发送查询字符串(名称/值对),需要这样写:/test/demo_form.php?name1=value1&name2=value2

说明:GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据(不修改)。

注:因GET请求的不安全性,在处理敏感数据时,绝不可以使用GET请求。

2、HEAD方法

与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。

3、POST方法

用于将数据发送到服务器以创建或更新资源,它要求服务器确认请求中包含的内容作为由URI区分的Web资源的另一个下属。

POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。

4、PUT方法

用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。

它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。

5、DELETE方法

用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。

6、CONNECT方法

用来建立到给定URI标识的服务器的隧道;它通过简单的TCP/IP隧道更改请求连接,通常实使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。

7、OPTIONS方法

用来描述了目标资源的通信选项,会返回服务器支持预定义URL的HTTP策略。

8、TRACE方法

用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。

以上介绍了HTTP的8种请求方式,其中常用的是GET和POST。可以说,GET是从服务器上获取数据,POST是向服务器传送数据,至于选择哪种,就需要根据实际情况来选择了。

get和post请求的区别

get和post的区别主要有以下几方面:
1、url可见性:

get,参数url可见

post,url参数不可见

2、数据传输上:

get,通过拼接url进行传递参数

post,通过body体传输参数

3、缓存性:

get请求是可以缓存的

post请求不可以缓存

4、后退页面的反应

get请求页面后退时,不产生影响

post请求页面后退时,会重新提交请求

5、传输数据的大小

get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)

post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大

6、安全性

这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。

7、数据包

GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

python连接数据库的方法

看这一篇:https://www.cnblogs.com/my_captain/p/9294420.html

posted @ 2022-07-06 18:07  cnhkzyy  阅读(63)  评论(0编辑  收藏  举报