1、类的定义:
一般,使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾。
类的专有方法:
init 构造函数,在生成对象时调用、del 析构函数,释放对象时使用、repr 打印,转换
2、构造函数的定义:
__init__构造函数,在Python中,子类如果定义了构造函数,而没有调用父类的,那么Python不会自动调用,也就是说父类的构造函数不会执行。#构造函数,类接收外部传入参数全靠构造函数
3、函数的定义:
函数就是一段代码的集合,并且可以被重复调用,也可以理解为处理事务的方法。def开头、函数名可以由数字、字母或者下划线组合而成,但不能以数字开头。
4、数据结构的定义:
是将数据按照某种逻辑存储起来。
5、python的标准数据类型有哪六个:
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)
Number(数字)支持的类型:int(整型)、float(浮点类型)、complex(复数)
可变数据(3个):List(列表)、Dic(字典)、Set(集合)
6、元组、列表、字典的定义:
元组可以由不同的元素组成 ,所有元素通过圆括号()包含起来,并通过逗号隔开。
列表都是一组元素的集合,用方括号[ ],列表可以增删改的,元组是不可以的。
字典由一系列的键--值成对组成,并通过大括号{ }包含起来,用逗号隔开。
字典的读取:是通过键来作为索引的没有先后顺序之分,列表和元组是通过数字作为索引有先后顺序。
7、Pyton的高阶函数有哪些?分别都有什么作用?
高阶函数就是一个(内置)函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。
变量可以指向函数,既然变量可以指向函数,而我们知道函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数。如下示例:
def add_number(a, b, func_abs):
# 在本例中,等同于执行的是 return abs(a) + abs(b)
return func_abs(a) + func_abs(b)
result = add_number(-10, -20, abs)
print(result)# 输出内容:# 30
python中内建(builtins)的高阶函数主要有:
①map()
它接收一个函数function 和一个 list,并通过把函数 function 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
def format_name(s):
return s.capitalize()
result = map(format_name, ['adam', 'LISA', 'barT'])
print(list(result))
# 输出内容:# ['Adam', 'Lisa', 'Bart']
②filter()
filter()接收一个函数function 和一个list,这个function 的作用是对list的每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
def is_contain_s(s):
if 'E' in s:
return True
else:
return False
result = filter(is_contain_s, ['sTEst', 'abc', 'str', ' ', 'END'])
print(list(result))
# 输出内容:# ['sTEst', 'END']
③sorted()
reduce()函数也接收一个函数function, 和一个list。但reduce()传入的函数必须接收两个参数,reduce()对list的每个元素反复调用函数function, 并返回最终结果值。
from functools import reduce
def f(x, y):
return x + y
result = reduce(f, [1, 3, 5, 7, 9])
print(result) # 输出内容: # 25
8、简单说说生成器、迭代器、装饰器是什么?都有哪些作用?
1、迭代器:
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
特点:(迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器只能往前不能后退。)
1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2.不能随机访问集合中的某个值 ,只能从头到尾依次访问
3.访问到一半时不能往回退
4.便于循环比较大的数据集合,节省内存 可被next()函数调用并不断返回下一个值(直到没有数据时抛出 StopIteration错误)的对象称为迭代器(Iterator)。
5.任何对象,如果它实现了next方法和iter方法,就是迭代器。
例:a = iter([1,2,3,4,5]) print(a) #结果:<list_iterator object at 0x0044ADFO> print(a.__next__()) #结果:1 print(a.__next__()) #结果:2
2.生成器(generator):
一个函数调用时返回一个迭代器,那这个函数就叫生成器(generator),如果函数中包含yield语法,则这个函数变成生成器。一边循环一边计算的机制,称为生成器。
3.装饰器:
是一个返回函数的高阶函数。
装饰器其实就是一个闭包,把一个函数当作参数然后返回一个替代版函数。
装饰器有2个特性:
1、可以把被装饰的函数替换成其他函数
2、可以在加载模块时候立即执行
12、Python中,如何将字符串转化为整型?
①将字符串数组 转化为 整型数组
>>> arr = ['22','44','66','88']
>>> arr = list(map(int,arr))
>>> print(arr)
②数字字符串初始化int类,就可以将整数字符串(str)转换成整数(int):int(“112321”)
③相反用整数初始化str类,就可以将整数(int)转换为对应的字符串(str):string(123213)
④如果字符串是浮点数,可以用字符串初始化float类,把浮点数字符串(str)转换成浮点数(float):float(“12.23”)
9、TCP三次握手和四次挥手,请分别直接写出来?
三次握手:
浏览器向服务器发起 tcp 连接,与浏览器建立 tcp 三次握手。
SYN是同步序列编号,是TCP/IP建立连接时使用的握手信号。
第一次握手:客户机首先发出一个SYN(syn=j)消息到服务器,(并进入SYN_SENT)状态,等待服务器确认。
第二次握手:服务器收到SYN消息,必须确认客户的SYN(ack=j+1),同时发送一个SYN+ack应答表示接受到了此消息。(服务器进入到了SVN_RECV状态)
第三次握手:客户端收到服务器的SYN+ACK包,向服务器端发送确认消息ACK(ack=k+1),发送完毕之后,客户端和服务器进入TCP连接成功状态。完成三次握手。
四次挥手:
第一次挥手:客户端向服务器端发送一个FIN,请求关闭数据传输
第二次挥手:服务器接收到客户端的FIN,向客户端发送一个ACK,其中ack的值等于FIN+SEQ
第三次挥手:服务器向客户端发送一个FIN,告诉客户端应用程序关闭
第四次挥手:客户端收到服务器端的FIN,回复一个ACK给服务器端。其中ack的值等于FIN+SEQ
TCP 三次握手和四次挥手简易版:
客户端向服务端发送一个请求, syn -----服务端返回一个 应答 ack+syn -----客户端收到后返回一个确认 ack
客户端向服务器发送一个关闭连接请求 fin m----服务端应答返回ack m+1---服务端返回一个fin n ----客户端收到后发一个确认---ack n+1
10、HTTP常见的状态码有哪些?都是什么含义?
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立, 且其 URI 已经随 Location 头信息返回
202 服务器已接受请求,但尚未处理
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应 (对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
401 当前请求需要用户验证。如果当前请求已经包含了 Authorization证书,那么 401 响应代表着服务器验证已经拒绝了那些证书
403 服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交
404 请求失败,请求所希望得到的资源未被在服务器上发现
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
200 - 请求成功301 - 资源(网页等)被永久转移到其它URL404 - 请求的资源(网页等)不存在500 - 内部服务器错误
11、webdriver的核心原理是什么?
1.Webdriver启动浏览器
2.Webdriver将浏览器绑定到特定的端口,绑定完成后该浏览器实例便作为webdriver的remote server存在;
3.客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote server解析请求,完成相应操作并返回response给浏览器
4.客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;
1.测试人员运行脚本,由于客户端脚本(java, python, ruby)不能直接与浏览器通信,这时候webdriver启动了一个remote-WebService当做一个翻译器,
它可以把客户端代码翻译成浏览器可以识别的代码(比如js)。webdriver 通过浏览器监听这个端口。
2.客户端(也就是测试脚本)创建1个session,
在该session中通过http请求向WebService发送restful的请求,WebService翻译成浏览器懂得脚本传给浏览器,
3.浏览器把执行的结果返回给WebService,WebService把返回的结果做了一些封装(一般都是json格式),
然后返回给client,根据返回值就能判断对浏览器的操作是不是执行成功
总结: webdriver就是基于Http 协议来进行底层的客户端与服务端通信的。
12、Appium是什么?主要用来做什么的?它的核心原理是什么?
1》Appium是一个开源、跨平台的,适用于原生或混合移动应用(hybrid mobile apps)的自动化测试平台。Appium使用WebDriver(JSON wire protocol)驱动安卓和iOS移动应用.
2》核心原理:
appium则是基于WebDriver协议,并通过 post 发送一个 json 告知服务端相关测试信息,利用Bootstrap.jar的java文件集成包,最后通过调用输入UiAutomator的命令,从而实现App的自动化测试。
13、selenium常见的元素定位方法有哪些?
Id、By.ID、name、classname、tag、xpath、css、link_text等
14、直接手写一个冒泡排序 和 快速排序,时间复杂度是多少,空间复杂度是多少,是否稳定?
冒泡排序:稳定
def bubble_sort(li):
for i in range(len(li)):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
print(li)
a = bubble_sort([50,23,45,16,7,38])
快速排序:不稳定
def partition(arr,low,high):
i = ( low-1 ) # 最小元素索引
pivot = arr[high]
for j in range(low , high):
# 当前元素小于或等于 pivot
if arr[j] <= pivot:
i = i+1
arr[i],arr[j] = arr[j],arr[i]
arr[i+1],arr[high] = arr[high],arr[i+1]
return ( i+1 )
# arr[] --> 排序数组
# low --> 起始索引
# high --> 结束索引
# 快速排序函数
def quickSort(arr,low,high):
if low < high:
pi = partition(arr,low,high)
quickSort(arr, low, pi-1)
quickSort(arr, pi+1, high)
arr = [10, 7, 8, 9, 1, 5]
n = len(arr)
quickSort(arr,0,n-1)
print ("排序后的数组:")
for i in range(n):
print ("%d" %arr[i])
15、如何查询Linux的后台日志,命令是什么?
cat demo.log
more demo.log
// 查询包含关键字`123456`且包含`aa`的日志内容
grep "123456" demo.log | grep "aa"
Tail -f
16、如何查看当前Linux的进程?
netstat
17、Dockerfile是什么?如何去创建一个Dockerfile?
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
此处以定制 nginx 镜像为例,使用 Dockerfile 来定制。
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile :
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
其内容为:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
18、Python有没有垃圾回收机制?它又是通过什么来处理的?
1、为什么会有垃圾机制,主要是为了有效的释放内存(内存溢出与内存泄露)。
内存溢出 out of memory是指程序在申请内存时,没有足够的内存空间供其使用。当发生内存溢出时,程序将无法进行,强制终止。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。如果发生内存泄露,那么可用内存会逐渐减少,从而降低性能。
memory leak会最终会导致out of memory!
2、为什么需要Garbage collection?
为了防止内存泄露. 对编程语言来说,GC 就是一个无名英雄,默默地做着贡献。
打个比方,天鹅在水面优雅地游动时,实际上脚蹼却在水下拼命地划水。GC 也是如此。
在由编程语言构造的美丽的源代码这片水下,GC在拼命地将垃圾回收再利用。
3、python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。
4、垃圾回收:计数机制
1》GC 原本是一种“释放怎么都无法被引用的对象的机制”。那么人们自然而然地就会想到,可以让所有对象事先记录下“有多少程序引用自己”。让各对象知道自己的“人气指数”,从而让没有人气的对象自己消失,这就是引用计数法(Reference Counting).清除这些无用的垃圾对象,把它们送回到可用列表。
2》引用计数法的优点:高效、实时性、对象有确定的生命周期、易于实现。
3》缺点:维护引用计数消耗资源、无法解决循引用的问题。
5、垃圾回收:标记-清除
1》如它的字面意思一样,GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是
把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
6、垃圾回收:分代收集
1》分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容
易成为垃圾的对象,提高垃圾回收的效率。
2》gc的逻辑
分配内存
-> 发现超过阈值了
-> 触发垃圾回收
-> 将所有可收集对象链表放到一起
-> 遍历, 计算有效引用计数
-> 分成 有效引用计数=0 和 有效引用计数 > 0 两个集合
-> 大于0的, 放入到更老一代
-> =0的, 执行回收
-> 回收遍历容器内的各个元素, 减掉对应元素引用计数(破掉循环引用)
-> 执行-1的逻辑, 若发现对象引用计数=0, 触发内存回收
-> python底层内存管理机制回收内存
7、gc模块
gc模块提供操作垃圾回收的接口,包括禁用gc,调整回收频率,配置debug选项,同时提供对无法释放内存对象的访问权。
19、熟悉TestNG,说明一下用法?
TestNG的注释非常强大和方便,TestNG允许并行测试,并可以基于group的方式执行测试,还可以生成测试报表,并且报告展示多样化,可在其基础上自行开发测试报告插件以及测试监听器。
20、数据库的增删改查,手写sql
21、Redis是做什么用的?ElasticSearch是什么?做什么用的?
Redis是内存中的数据结构存储, 用作数据库, 缓存和消息代理。
Elasticsearch是基于Apache Lucene的现代搜索和分析引擎。
22、接口测试的定义,接口测试是怎么做的?如何存在接口依赖关系,怎么处理?
接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互。
23、Python中,“arg”和“kwarg”分别代表什么含义,都有哪些作用?
如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;
如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs;
1.*args的使用方法
*args用来将参数打包成tuple(元组)给函数体调用
举个栗子:
>> def func2(*args):
>> print(args,type(args))
>>>> func2("a")
>> ('aa',) <class 'tuple'>
>>> func2(1,2,3)
>> (1, 2, 3) <class 'tuple'>
2.**kwargs的使用方法
**kwargs 打包关键字参数成dict(字典)给函数体调用
举个栗子:
>> def func(**kwargs):
print(kwargs,type(kwargs))
>> func(a=1,b=2)>> {'a': 1, 'b': 2} <class 'dict'>
24、冒烟测试的定义:
冒烟测试(smoketest)在测试中发现问题,找到了一个Bug,然后开发人员会来修复这个Bug。这时想知道这次修复是否真的解决了程序的Bug,或者是否会对其它模块造成影响,就需要针对此问题进行专门测试,这个过程就被称为SmokeTest。在很多情况下,做SmokeTest是开发人员在试图解决一个问题的时候,造成了其它功能模块一系列的连锁反应,原因可能是只集中考虑了一开始的那个问题,而忽略其它的问题,这就可能引起了新的Bug。SmokeTest优点是节省测试时间,防止build失败。缺点是复盖率比较低。
25、session、cookie的区别:
cookies 数据保存在客户端,session 数据保存在服务器端;
cookies 可以减轻服务器压力,但是不安全,容易进行 cookies 欺骗;
session 较安全,但占用服务器资源
26、压力测试汇总:(高并发的情况下,看响应情况)
压力测试,需要先了解压测的场景、压测的参数,然后准备好要压测的工具,代码和数据。
压力测试之前要明确压测的功能和压测的指标:
①固定接口参数进行压测还是进行接口参数随机化压测?
②要求支持多少并发数?
③TPS(每秒钟处理事务数)目前是多少?响应时间要达到多少?
④被压的服务器名称或者被压的服务器IP?
压测完毕之后,需要出具压力测试的测试报告,通过报告来分析是否压测达到标准:
查看聚合报告中的:
TPS吞吐量能不能达到呀唔要求,响应时间、错误率。
27、python中对多态的理解
多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等。(一个抽象类有多个子类,因而多态的概念依赖于继承)
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
28、postman中请求报文有哪四种
POST请求一:表单提交
请求头中的Content-Type与请求参数的格式之间是有关联关系
post参数格式:表单提交:application/x-www-form-urlencoded
Json提交:application/json
xml提交:text/xml
POST请求二:json提交
POST请求三:xml提交
POST请求四:二进制文件提交
请求Body里面:
1. form-data
就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有content-type来说明文件类型;content-disposition用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
2.x-www-form-urlencoded:
就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对
3.raw
可以上传任意格式的文本,可以上传text、json、xml、html等
4.binary
相当于content-type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。
29、selenium的简介和原理
Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。
Selenium原理,主要需要三个东西:
1.自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动)
2.浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器
3.浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。
30、monkey命令三个-v的含义、monkey中-v的命令
①需要有log日志输出,可以加上-v参数。-v表示输出的Log级别,-v最低,-v -v -v最高。adb shell monkey -v <event -count> 包名
②Monkey也提供了这样的参数 -s----复现随机点击事件。
adb shell monkey -s <seed> <event-count> 包名
31、Linux命令vi与vim的区别
vi与vim
vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,学会它后,您将在Linux的世界里畅行无阻。
vim 具有程序编辑的能力,可以以字体颜色辨别语法的正确性,方便程序设计;
因为程序简单,编辑速度相当快速。
vim可以当作vi的升级版本,他可以用多种颜色的方式来显示一些特殊的信息。
vim会依据文件扩展名或者是文件内的开头信息, 判断该文件的内容而自动的执行该程序的语法判断式,再以颜色来显示程序代码与一般信息。
vim里面加入了很多额外的功能,例如支持正则表达式的搜索、多文件编辑、块复制等等。 这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。
32、jmeter的分布式压测
Jmeter做分布式测试的原因:
测试机器的配置低,对服务器进行压测时,造成不了压力。
jmeter并发10000后,测试机就已经卡顿了,而且测试结果有大量失败(忽略了jmeter自身问题=。=|||)~ 此现象又称:Jmeter内存溢出。
https://www.cnblogs.com/UncleYong/p/10854152.html
33、MVC模式的定义:
逻辑层与数据层分开
34、web端测试与app端测试的区别
系统架构方面:
web项目,一般都是b/s架构,基于浏览器的
app项目,则是c/s的,必须要有客户端,用户需要安装客户端。
web测试只要更新了服务器端,客户端就会同步会更新。
App项目则需要客户端和服务器都更新。
性能方面:
web页面主要会关注响应时间
而app则还需要关心流量、电量、CPU、GPU、Memory这些。
它们服务端的性能没区别,都是一台服务器。
兼容方面:
web是基于浏览器的,所以更倾向于浏览器和电脑硬件,电脑系统的方向的兼容
app测试则要看分辨率,屏幕尺寸,还要看设备系统。
web测试是基于浏览器的所以不必考虑安装卸载。
而app是客户端的,则必须测试安装、更新、卸载。除了常规的安装、更新、卸载还要考虑到异常场景。包括安装时的中断、弱网、安装后删除安装文件
此外APP还有一些专项测试:如网络、适配性。。。
APP测试特点
(除了按需求说明书外的 功能测试 之外还需要进行如下测试)
1、适配性测试(也叫兼容性测试,不同的安卓版本,不同厂商,不同手机品牌)
2、不同网络测试 (2G网络/3G网络/4G网络/WIFI网络)
3、在线升级测试
4、中断测试(电话、短中消息打扰)
5、耗电量测试
6、弱网测试(信号差,信号屏蔽实验室)
7、安装卸载 (C/S)
8、流量测试
35、js的弹框的按钮的定位
Alert()、
36、jmeter的定时器的作用
在默认情况下,jmeter发送每个请求之间是没有延时的,如果线程数足够大,瞬间就会将服务器压死。
在实际的业务过程中,请求之间是有一定时间的停顿的,比如登录网站时输入用户名和密码需要时间(用户会确认下输入的对不对),所以在请求之间设置合理的延时是必须的,也更接近用户的真实业务情况。
在jmeter中,定时器组件提供了系列不同类型的延时控制。合理使用定时器组件,能让你的性能测试更接近真实,更能挖掘出系统的瓶颈和评估系统的性能指标。
37、sql命令:左链接、右链接、分页、去重
Join.left、Join.right、distinct、limit
38、linux命令中,操作管理文件权限
Sudo chmod 777 -R 文件名
39、appium的原理:
appium则是基于WebDriver协议,并通过 post 发送一个 json 告知服务端相关测试信息,利用Bootstrap.jar的java文件集成包,最后通过调用输入UiAutomator的命令,从而实现App的自动化测试。
40、函数式编程
函数式编程是指用一系列函数决定问题。
函数是一等公民(我们程序的基本单位是用函数来组成的),函数本身可以赋值给变量,赋值后变量绑定函数,允许将函数本身作为参数传入另一个函数并返回一个函数。
函数式编程要求函数可重入性:即一个函数传的参数一定,则结果必须一定;要求def定义的函数不要访问除局部变量以外的变量。
示例:
def myadd(x, y)
return x + y
print(myadd(10, 20))
41、浏览器输入 url 按回车背后经历了哪些?
1、首先,在浏览器地址栏中输入 url,先解析 url,检测 url 地址是否合法
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。
浏览器缓存:浏览器会记录 DNS 一段时间,因此,只是第一个地方解析 DNS 请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的 DNS 查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取 DNS 记录,继续搜索路由器缓存;
ISP 缓存:若上述均失败,继续向 ISP 搜索。
3、在发送 http 请求前,需要域名解析(DNS 解析),解析获取相应的 IP 地址。
4、浏览器向服务器发起 tcp 连接,与浏览器建立 tcp 三次握手。
5、握手成功后,浏览器向服务器发送 http 请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到 HTTP 响应
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在 HTML 中的资源(html,css,javascript,图片,
音乐..........),对于未知类型,会弹出对话框。
10、 浏览器发送异步请求。
11、页面全部渲染结束。
50、GET 和 POST 有一个重大区别,简单的说:
GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。
对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);
而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送data,服务器响应 200 (返回数据)。
42、什么是闭包?
内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。
闭包三要素:
1、嵌套函数 2、变量的引用 3、返回内部函数
43、测试流程:
需求评审、需求落实、制定测试计划、设计测试用例、用例评审、冒烟测试、测试执行、alpha、beta测试、验收测试、风险评估、上线\测试观察、问题跟进、提出问题解决方案、测试报告、复盘会议。
44、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。
答:
super 用于继承父类的方法、属性。
super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。
使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。
代码举例:
class baseClass:
def test1(self, num):
print(num)
class sonClass(baseClass):
def test2(self):
super().test1(num)
son = sonClass()
son.test1(11)
3、快速编写前端 HTML、JavaScript、Vue 代码。
答:
HTML、JavaScript 代码:
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8"></head><body>
<h1 id="title">xxx公司</h1>
<p>xxx公司是一家......</p>
<div id="mybox">
<h1>{{a}}</h1>
<input type="button" value="按我" v-on:click="add()">
</div>
<script type="text/javascript" src="public/bundle.js"></script></body></html><script>
var title = document.getElementById("title");
title.onclick = function() {
alert('我爱xxx公司,祝我面试成功');
}</script>
Vue 代码编写:
import Vue from "vue";new Vue({
el : "#mybox",
data : {
a : 100
},
methods : {
add : function(){
this.a ++;
}
}
});
45、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2, 3, 5]
答: list(set(L))
46、L = [1, 2, 3, 4, 5],L[10:]的结果是?
答: 空列表
47、L = [1, 2, 3, 5, 6],如何得出 '12356'?
答:
s = ''for i in L:
s = s + str(i)print(s) # 12356print(type(s)) # <class 'str'>
48、列表和字典有什么区别?
答: 一般都是问列表和元组有什么不同。
(1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。
(2)数据结构和算法不同。字典是 hash 算法,搜索的速度特别快。
(3)占用的内存不同。
49、如何结束一个进程?
答:
(1)调用 terminate 方法。
(2)使用 subProcess 模块的 Popen 方法。使用简单,具体用法,这里不展开。
50、进程、线程有什么区别?什么情况下用进程?什么情况下用线程?
答:
(1)区别:
① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。
② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
③ 调度和切换:线程上下文切换比进程上下文切换要快得多。
④ 在多线程操作系统中,进程不是一个可执行的实体。
(2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。
51、什么是ORM?为什么要用ORM?不用ORM会带来什么影响?
答:
ORM 框架可以将类和数据表进行对应,只需要通过类和对象就可以对数据表进行操作。
通过类和对象操作对应的数据表,类的静态属性名和数据表的字段名一一对应,不需要写 SQL 语句。
ORM 另外一个作用,是根据设计的类生成数据库中的表。
52、写一段代码,ping 一个 ip 地址,并返回成功、失败的信息。
答: 使用 subProcess 模块的 Popen 方法
53、说说接口测试的流程,介绍一下request有哪些内容。
答:
(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。
(2)request 内容:
① 封装了各种请求类型,get、post 等;
② 以关键字参数的方式,封装了各种请求参数,params、data、headers、token 等;
③ 封装了响应内容,status_code、json()、cookies、url 等;
④ session 会话对象,可以跨请求。
54、UI 自动化,如何做集群?
答: Selenium Grid。
55、移动端 UI 自动化,经常会自动安装 2 个程序,你知道那两个程序是什么东西不?
答: 守护精灵,和 Python 并发编程中的 daemon 原理一样,父进程/父线程的代码执行完毕,它就终止,要写在 start 方法前面。另外,要找到配置文件,注释掉两行代码。
56、说5个以上 Linux 命令。
答:
ls 列出目录下的文件和文件夹
cd 切换目录
cd .. 返回上一级目录
rm 删除目录和文件
cat 查看文件内容
ps 可以看那个进程再跑
ps -x [PID] 查看单个进程的状态
top 可以看那个进程的占用率最高
su 切换到root用户
kill [pid] 杀死一个进程
chmod 777 <file> 修改该文件为可执行权限
57、自动化代码中,用到了哪些设计模式?
答:自动化代码用到过的设计模式:
①单例设计模式
②工厂模式
③PO设计模式
④数据驱动模式
⑤面向接口编程设计模式
58、什么是Selenium
答:Selenium是一个开源的web自动化测试框架,支持多种编程语言开发自动化测试脚本,支持跨浏览器平台进行测试
58、什么是断言?
答:断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志
59、TestNG有哪些有点?
答:TestNG的注释非常强大和方便,TestNG允许并行测试,并可以基于group的方式执行测试,还可以生成测试报表,并且报告展示多样化,可在其基础上自行开发测试报告插件以及测试监听器
60、什么是web自动化测试?
答:web自动化测试指的是从UI(用户界面)层面进行的自动化测试,测试人员通过编程自动化程度(测试用例脚本)来打开浏览器测试网站的业务逻辑
61、写出Selenium中你最熟悉的接口或类?
答:webDriver、lnternetExplorerDriver、FirefoxDriver、ChromeDriver、WebElement、WebDriverWait、By
62、元素定位类型有哪些?
答:By类一共有8中元素定位方式,他们都是静态方法:
By.id(),By.name(),By.tagName(),By.className(),By.cssSelector(),By.linkText(),By.partialLinText(),By.xpath()
63、登录按钮除了用click方法进行点击以外还有其他方式么?
答:还可以使用submit()方法,前提是input元素的type为submit
64、怎么对含有验证码的功能进行自动化测试的?
答:1)图像识别,技术难度大,效果不佳,不推荐
2)屏蔽验证,邀请开发处理,但在预生产环境或者生产环境不推荐
3)万能验证码,使用一个负责的其他人无法猜到的验证码
65、怎么验证复选按钮是不是被选中?
答:可以使用元素的isSelected()方法,如果返回的是true则说明被选中,否则表明未被选中
66、如何处理alert弹窗?
答:处理alert弹窗首先需要先跳转到alert上,然后在点击确定或者取消按钮,
Alert alet=driver.switchTo().alert();//切换到alert
alert…accept();//确定
alert.dismiss();//取消
67、如何用webdriver进行鼠标右键点击操作?
答:使用Actions类
Actions actions=new Actions(driver);
actions.moveToElement(element).perform();
actions.contextClick().perform();
68、举一个webDriver中方法重载的例子?
答:frame(string nama),frame(int index),
frame(WebElement element)
69、下拉菜单中如何去选择一个菜单项?
答:如果下拉菜单是select标签,使用方法:
selectByValue()或者是selectBylndex()或者selectByVisibleText()即可
如果这个下拉菜单不是通过select标签创建,则直接通过xpath定位元素然后去点击选择