1、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。答:
super 用于继承父类的方法、属性。
super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。
使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。
代码举例:
.
classbaseClass:
.
.
deftest1(self, num):
.
.
print(num)
.
.
.
.
classsonClass(baseClass):
.
.
deftest2(self):
.
.
super().test1(num)
.
.
.
.
son = sonClass()
.
.
son.test1(11)
.
2、阅读以下代码,推导最后结果:
.
defadd(n, i):
.
.
returnn+i
.
.
.
.
deftest():
.
.
foriinrange(4):
.
.
yieldi
.
.
.
.
g = test()
.
.
.
.
fornin[1,10,5]:
.
.
g= (add(n, i)foriing)
.
.
.
.
print(list(g))# 结果是 [15, 16, 17, 18]
.
答:所有的结果都是生成器表达式,不调用它,不从里面取值,就不干活。附上我的推导过程:
.
n =1
.
.
g = (add(n,i)foriintest())
.
.
#print(list(g))# [1, 2, 3, 4]
.
.
.
n =10
.
.
g = (add(n,i)foriin(add(n,i)foriintest()))
.
.
#print(list(g))# [20, 21, 22, 23]
.
.
.
n =5
.
.
g = (add(n,i)foriin(add(n,i)foriin(add(n,i)foriintest())))
.
.
g = (add(n,i)foriin(add(n,i)foriin(5,6,7,8)))
.
.
g = (add(n,i)foriin(10,11,12,13))
.
.
.
g = (15,16,17,18)
.
.
print(list(g))# [15, 16, 17, 18]
.
3、快速编写前端 HTML、JavaScript、Vue 代码。
答:
HTML、JavaScript 代码:
.
.
.
<htmllang="en">
.
.
<head>
.
.
<metacharset="utf-8">
.
.
head>
.
.
<body>
.
.
<h1id="title">xxx公司h1>
.
.
<p>xxx公司是一家......p>
.
.
.
.
<divid="mybox">
.
.
<h1>{{a}}h1>
.
.
<inputtype="button"value="按我"v-on:click="add()">
.
.
div>
.
.
<scripttype="text/javascript"src="public/bundle.js">script>
.
.
body>
.
.
html>
.
.
<script>
.
.
vartitle =document.getElementById("title");
.
.
title.onclick=function() {
.
.
alert('我爱xxx公司,祝我面试成功');
.
.
}
.
.
script>
.
Vue 代码编写:
.
importVuefrom"vue";
.
.
newVue({
.
.
el:"#mybox",
.
.
data: {
.
.
a:100
.
.
},
.
.
methods: {
.
.
add:function(){
.
.
this.a++;
.
.
}
.
.
}
.
.
});
.
4、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2, 3, 5]。答:list(set(L))
5、L = [1, 2, 3, 4, 5],L[10:]的结果是?答:空列表(当时有点紧张,一直在“空列表”和“索引超出范围”两个答案之间徘徊)。
6、L = [1, 2, 3, 5, 6],如何得出 '12356'?答:注意,个人觉得这个题有坑,列表的元素不是字符串,所以不能''.join(L)。以下是过程:
.
s =''
.
.
foriinL:
.
.
s= s + str(i)
.
.
.
.
print(s)# 12356
.
.
print(type(s))#
.
7、列表和字典有什么区别?答:一般都是问列表和元组有什么不同。 (1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。 (2)数据结构和算法不同。字典是hash算法,搜索的速度特别快。 (3)占用的内存不同。
8、如何结束一个进程?答:(1)调用terminate方法。 (2)使用subProcess模块的Popen方法。使用简单,具体用法,这里不展开。
9、进程、线程有什么区别?什么情况下用进程?什么情况下用线程?答:(1)区别:
① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。
② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
③ 调度和切换:线程上下文切换比进程上下文切换要快得多。
④ 在多线程操作系统中,进程不是一个可执行的实体。
(2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。
10、什么是ORM?为什么要用ORM?不用ORM会带来什么影响?答:
ORM框架可以将类和数据表进行对应,只需要通过类和对象就可以对数据表进行操作。
通过类和对象操作对应的数据表,类的静态属性名和数据表的字段名一一对应,不需要写 SQL 语句。
ORM另外一个作用,是根据设计的类生成数据库中的表。
11、写一段代码,ping 一个 ip地址,并返回成功、失败的信息。答:使用 subProcess 模块的 Popen 方法(使用简单,具体用法,这里不展开)。
12、说说接口测试的流程,介绍一下 request 有哪些内容。答:(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。 (2)request 内容:
① 封装了各种请求类型,get、post 等; ② 以关键字参数的方式,封装了各种请求参数,params、data、headers、token 等; ③ 封装了响应内容,status_code、json()、cookies、url 等; ④ session 会话对象,可以跨请求。
13、ui自动化,如何做集群?答:Selenium Grid。
14、移动端 UI 自动化,经常会自动安装 2 个程序,你知道那两个程序是什么东西不?答:守护精灵,和 Python 并发编程中的 daemon 原理一样,父进程/父线程的代码执行完毕,它就终止,要写在 start 方法前面。另外,要找到配置文件,注释掉两行代码。
15、说5个以上 Linux 命令。答:
16、介绍一下你在这个项目中是如何使用 Jenkins 的。答:,说了基本操作,比如定时构建执行代码。
17、说说你对敏捷模式的认识。答:小步快跑,拥抱变化。测试中,可以通过行为驱动测试,有个框架 lettuce 可以用。
18、了解过 Docker 不?答:了解,没用过。然后说了下对 Docker 大概的认识、优势。
一、json和字典dict的区别
首先python里面的基础数据类型有:int、str、 float、list、bool、tuple、dict、set这几种类型,里面没json这种数据类型。
JSON( 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
由于你的代码是python写的(也有可能是php,java,c,ruby等语言),但是后端接口是java写的(也有可能是其它语言),不同的语言数据类型是不一样的(就好比中国的语言和美国的语言数据类型也不一样,中国的一般说一只羊,一头牛,美国都是 a /an这种单位),所以就导致你提交的数据,别的开发语言无法识别,这就需要规范传输的数据(传输的数据都是一个字符串),大家都遵循一个规范,按一个标准的格式去传输,于是就有就json这种国际化规范的数据类型。
json本质上还是字符串,只是按key:value这种键值对的格式来的字符串b = '{"a": 1, "b": 2, "c": true}'
二、测试的数据放在哪?
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini) 2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成 3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以 4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理 5.对于邮箱配置的一些参数,可以用ini配置文件 6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据 7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的
三、什么是数据驱动,如何参数化?
四、下个接口请求参数依赖上个接口的返回数据
这个很容易,不同的接口封装成不同的函数或方法,需要的数据return出来,用一个中间变量a去接受,后面的接口传a就可以了
可以参考登录的cookie或token
五、依赖于登录的接口如何处理
参考requests的方法
六、依赖第三方的接口如何处理
这个需要自己去搭建一个mock服务,模拟接口返回数据
mock服务搭建需要自己能够熟练掌握,面试会问你具体如何搭建 ,如何模拟返回的数据,是用的什么格式,如何请求的
七、不可逆的操作,如何处理,比如删除一个订单这种接口如何测试此题考的是造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的 比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。 平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库了,做增删改查的操作 测试用例前置操作,setUp做数据准备 后置操作,tearDown做数据清理
八.接口产生的垃圾数据如何清理跟上面一样,造数据和数据清理,需用python连数据库了,做增删改查的操作 测试用例前置操作,setUp做数据准备 后置操作,tearDown做数据清理
九.一个订单的几种状态如何全部测到,如:未处理,处理中,处理失败,处理成功跟上面一样,也是考察造数据,修改数据的状态
十、get和post的区别
十一、post请求的四种参数形式是什么
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
十一、公司有用到第三方服务,出了问题,打电话给第三方,第三方不承认,这时候日志又显示不到错误,应该怎么处理
1、单独调用第三方服务,查看返回结果;
2、引入mock机制,假如正常返回的情况下,测试我们的系统是否存在问题;
3、建议开发增加日志,详细记录调用第三方接口的过程,记录调用前接口入参,返参等信息;
十二、接口自动化中的关联怎么处理?将请求返回的结果反射到类属性中,使用setattr()函数,下个请求调用这个类
十三、自动化测试怎么校验结果?使用断言,预期结果值和实际结果值进行对比;
十四、自动化使用的测试框架是什么?简述自动化框架的设计、维护1、自动化使用的测试框架:
语言:python
测试框架:unittest(assertEqual,assertTure,assertFalse)
接口调用:requests(API非常简洁)
数据驱动:ddt(装饰器:ddt类,unpack测试方法装饰器解包时候,data测试方法装饰器,可迭代的数据类型)
注:普通用户,管理用户,数据库,配置文件---基础数据
数据管理:openpyxl(excel,CSV,json,yaml,txt)
数据库交互:pymysql ---根据数据库选择相应的第三方模块来完成
数据格式的转换:eval,json
日志处理:logging ---清晰的执行过程,快速定位问题
持续集成:Jenkins(通过插件HTML Publisher/git/Email Extension)进行自动构建,生成HTML,发送邮件
2、自动化框架的设计、维护:
1、数据与代码分离,(数据驱动)==数据驱动框架==
例如:参数不一样,响应不一样
2、结构分层(数据层,用例层,逻辑性)
逻辑层:公用的方法,封装起来,避免用例层的代码冗余
数据层:例如,设计Excel,excel读取,参数化替换等
用例层:存放测试用例
十五、在接口自动化测试中都用到了哪些包:
pymysql:连接数据库
ddt:
requests:
urllib:
xlrd:
xlwt:
xlutils:
十六、根据什么来做断言?
1、协议状态码: 200,404,503 2、业务状态码:status:0 3、业务数据
十七、具体的在这个项目中自动化怎么应用到实际的,您对自动化结果的分析
完成所有的自动化测试框架的设计和实现后,进行接口测试,然后集成到jenkins,配置定时执行,生成html报表,查看测试通过率,查看接口的功能
每次发版时,进行回归测试,新功能开发未提测前
十八、做好测试计划的关键是什么?
明确测试目的,增强测试计划的实用性,保证测试用例的实用性和覆盖率,完全需求文档和规格指标书等,严格界定测试周期,测试轮次,测试覆盖模块等
十九、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。
super 用于继承父类的方法、属性。super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。
父类:
class Car():
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
def .....
class ElectricCar(Car):
def __init__(self,make,model,year): --------初始化父类的属性
super().__init__(make,model,year):
def ....
子类就可以使用父类的属性
二十、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2, 3, 5]
答:list(set(L))
二十一、L = [1, 2, 3, 4, 5],L[10:]的结果是?
答:空列表[]
二十二、list= [1, 2, 3, 4],如何得出 '1234'?
list=[1,2,3,4] list2=''foriinlist: list2=list2+str(i)print(list2)