python自动化测试需要知识_Python自动化测试常见面试题及解析答案

一、_ init _ _ 和 _ _ new _ _是什么?

1.1、概述

在python的面向对象中,利用new方法创建对象,然后把这个创建的对象传递到init函数中,以第一个参数进

1.2、详细描述__new__

所有的类上都有一个new方法

调用时机: 新建对象的时候自动调用(init之前),同时会自动传入类cls参数

作用: 改变对象空间的创建过程

class Person(object):

def __new__(cls):

print("__new__方法被调用")

# 必须返回创建的对象

# print(cls)

#return object.__new__(cls) #父类上的__new__方法能够实现内存空间的开辟

return super().__new__(cls) #父类上的__new__方法能够实现内存空间的开辟

def __init__(self):

print("__init__方法被调用")

# 创建对象

zhangsan = Person()

__init___

定义在类中, 名字固定 init。

执行时机: 实例化对象的时候自动调用执行

作用: 一般会在初始化方法中 为对象添加(绑定)属性

class Student(object):

# 属性

# 方法

## 自己定义一个初始化方法

def __init__(self,_name,_age):

# 输出

print("我自动被调用")

# 添加属性

# self.name = "张三"

# self.age = 26

self.name = _name

self.age = _age

def learn(self):

print("努力学习,天天向上")

# 实例化对象

stu1 = Student(_age=28,_name="李四")

1.3、应用场景所谓单例就是一个类从始至终只能产生一个实例。

class Singleton(object):

__instance = None #私有类属性,保存创建的对象空间

__isInit = False # 是否已经初始化

def __new__(cls, *args, **kwargs):

# 实现自己对象的创建过程

if not cls.__instance:

# 没有就创建

cls.__instance = super().__new__(cls)

# 返回

return cls.__instance

else:

# 有直接返回

return cls.__instance

def __init__(self,name,age):

if not self.__isInit: #没有初始化

# 初始化

self.name = name

self.age = age

# 改变

self.__isInit = True

else:

#

pass

二、什么是pass,什么是lambda函数

2.1、概述

lambda 创建匿名函数的语法。

pass 空语句。

2.2、详细描述

1、pass的作用

不做任何事情,一般用做占位语句,为了保证程序的完整性。2、lambda

lambda只是一个表达式,函数体比def简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

# 可写函数说明

sum = lambda arg1, arg2: arg1 + arg2;

# 调用sum函数

print "相加后的值为 : ", sum( 10, 20 )

print "相加后的值为 : ", sum( 20, 20 )

2.3、应用场景lambda创建的匿名函数一般在 排序,map,reduce,filter这些高阶函数里,可以一行写完,不过这个也要看情况,过多使用匿名函 数,在团队代码阅读上,可能会有麻烦。

>>>def square(x) : # 计算平方数

... return x ** 2

...

>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方

>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数

[1, 4, 9, 16, 25]

# 提供了两个列表,对相同位置的列表数据进行相加

>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

[3, 7, 11, 15, 19]

# 过滤出列表中的所有奇数:

newlist = filter(lambda x:x % 2 == 1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(newlist)

三、is和==有什么区别?

3.1、概述

is 比较 的是两个实例对象是不是同一个对象,也就是说这两个对象的地址,通过id()函数可以获取,是不是相同。

== 比较的是两个实例对象的值是否相等,比较的是内存中存放的内容,可以不是同一个对象,只要内容一样就可以了。3.2、详细描述

x = [1, 2, 3]

y = x

z = [1, 2, 3]

print(x == y)

print(x is y)

print(x == z)

print(x is z)

结果:

True

True

True

False

3.3、应用场景

is常用的地方是: 和None值进行比较 a is None 或者 a is not None

None 在 Python 语言中是一个单例对象,如果你要判断某个变量是否为 None 时,记得使用 is而不是 ==,因为只有 is才能在严格意义上表示某个变量是否是 None。

四、*args和**kwargs的区别?

1.1、概述:

分别代表元组和字典的两种形式,他们可以作为形式参数存在也可以作为实际参数存在。作为形式参数存在被称为打包,作为实际参数存在被称为拆包

1.2、详细描述:

作为形式参数(打包):将位置的实际参数打包到元组中, 将关键字的实际参数打包到字典中。

def 函数名字(*args): #打包位置实际参数放在元组中

pass

函数名字(实际参数1,实际参数2)

def 函数名字(**kwargs): # 打包关键字实际参数放在字典中

pass

函数名字(关键字1=实际参数1,关键字2=实际参数2)

作为实际参数(拆包): 将元组或者字典展开作为实际参数传给形式参数:

def 函数名字(形式参数1,形式参数2):

pass

元组 = (数据1,数据2)

函数名字(*元组) #将元组中的元素一一对应传递给形式参数

def 函数名字(name,age):

pass

字典 = {name:数据1,age:数据2}

函数名字(**字典) #将字典中的元素按照键一一对应传递给形式参数

1.3、应用场景:

在实现装饰器时,为了可以对任意的函数都能进行装饰,内置的闭包函数就会用*args,**kwargs来处理。

定义未知个数的形式参数。

五、Python中filter()、map()和reduce()的区别

2.1、概述:

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

map() 会根据提供的函数对指定序列做映射

reduce() 函数会对参数序列中元素进行累积。

2.2、详细描述:

filter()函数

1.语法:

filter(function, iterable)

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回

True 或 False,最后将返回 True 的元素放到新列表中。

2.案例: 得到列表中的奇数

def is_odd(n):

return n % 2 == 1

newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

for n in newlist:

print(n)

map函数:

1.语法:

map(function, iterable, ...)

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

2. 案例: 提供了两个列表,对相同位置的列表数据进行相加

result = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

print(result)# [3, 7, 11, 15, 19]

将后面两个列表中的分别一一对应取出之后传递给x,y.

reduce()函数:

1.语法:

reduce(function, iterable[, initializer])

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参

数)先对集合中的第 1、2 个元素 进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

python3中将 reduce 放在functools模块中了

2. 案例: 提供了两个列表,对相同位置的列表数据进行相加

from functools import reduce

result = reduce(lambda x, y: x+y, [1,2,3,4,5])

print(result)#15

2.3、应用场景:

面试题: 分别使用map,reduce,filter函数完成下面的任务

1、计算1-100的和

from functools import reduce

result = reduce(lambda x, y: x + y, range(1, 101))

print(result)

2、1-10,对每个数字的平方

result = map(lambda x:x**2,range(1,11))for n in result:print(n)

六、 {“a”,”ab”,”abc”,”bc”,”cd”}输出含有C字符的元素,返回值是list

result = filter(lambda x: "c" in x, {"a", "ab", "abc", "bc", "cd"})for n in result:print(n)

3、Python的可变类型和不可变类型包含哪些?

3.1、概述:

可变类型 包含: 列表(List)、字典(Dict)、集合(Set)。

不可变类型 包含: 字符串(String)、整数(int)、小数(Float) 布尔(Bool)、元组(Tuple)

3.2、详细描述:

3.2.1可变数据类型的特点

里面的值发生改变时不会新生成一个变量.内存地址不变. 因为改变的数据会发生在内存中.

3.2.2不可变数据类型的特点

只要值发生了改变.就会重新开辟一个内存空间. 内存地址也发生了改变, 如果元组中的元素是可变数据类型,该元素中的值是可以改变的。

values = ("张飞", ["刘备"])

values[1][0] = "刘玄德"

print(values) #('张飞', ['刘玄德'])

七、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。

答:

super 用于继承父类的方法、属性。super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。代码举例:

八、阅读以下代码,推导最后结果:

答:所有的结果都是生成器表达式,不调用它,不从里面取值,就不干活。附上我的推导过程:

九、快速编写前端 HTML、JavaScript、Vue 代码。

答:HTML、JavaScript 代码

Vue 代码编写:

十、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:]的结果是?

答:空列表(当时有点紧张,一直在“空列表”和“索引超出范围”两个答案之间徘徊)。

十二、L = [1, 2, 3, 5, 6],如何得出 '12356'?

答:注意,个人觉得这个题有坑,列表的元素不是字符串,所以不能 ''.join(L) 。

以下是过程:

十三、列表和字典有什么区别?

答:一般都是问列表和元组有什么不同。 (1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。 (2)数据结构和算法不同。字典是 hash 算法,搜索的速度特别快。 (3)占用的内存不同。

十四、如何结束一个进程?

答:(1)调用 terminate 方法。 (2)使用 subProcess 模块的 Popen 方法。使用简单,具体用法,这里不展开。

十五、进程、线程有什么区别?什么情况下用进程?什么情况下用线程?

答:(1)区别:

① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。③ 调度和切换:线程上下文切换比进程上下文切换要快得多。④ 在多线程操作系统中,进程不是一个可执行的实体。(2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。

十六、什么是ORM?为什么要用ORM?不用ORM会带来什么影响?

答:

ORM 框架可以将类和数据表进行对应,只需要通过类和对象就可以对数据表进行操作。通过类和对象操作对应的数据表,类的静态属性名和数据表的字段名一一对应,不需要写 SQL 语句。ORM 另外一个作用,是根据设计的类生成数据库中的表。11、写一段代码,ping 一个 ip 地址,并返回成功、失败的信息。

答:使用 subProcess 模块的 Popen 方法(使用简单,具体用法,这里不展开)。

十七、说说接口测试的流程,介绍一下request有哪些内容。

答:(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。 (2)request 内容:

18、UI 自动化,如何做集群?

答:Selenium Grid。

19、移动端 UI 自动化,经常会自动安装 2 个程序,你知道那两个程序是什么东西不?

答:守护精灵,和 Python 并发编程中的 daemon 原理一样,父进程/父线程的代码执行完毕,它就终止,要写在 start 方法前面。另外,要找到配置文件,注释掉两行代码。

20、说5个以上 Linux 命令。

答:一口气,劈里啪啦说了 10 多个。

21、介绍一下你在这个项目中是如何使用 Jenkins 的。

答:用的不深入,说了基本操作,比如定时构建执行代码。

22、说说你对敏捷模式的认识。

答:小步快跑,拥抱变化。测试中,可以通过行为驱动测试,有个框架 lettuce 可以用。

23、了解过 Docker 不?

答:了解,没用过。然后说了下对 Docker 大概的认识、优势。

24、说一下你对软件测试的深刻心得。

答:此处省略 n 个字。

25、做过性能测试没?没做过,说出功能测试的流程。

答:此处省略 n 个字。

26、Bug 定位、分析、类型。

答:此处省略 n 个字。

27、测试策略、测试方案的区别。

答:此处省略 n 个字。

面试总结

在自动化测试、测试开发岗面试中,编程知识、Linux 都是必问的。测试开发人员的知识面既要有一定的广度,同时还要有扎实的编码基础。

路漫漫其修远兮,我还有很长的路要走。接下来的规划,进一步提升自己的实力。整理不易还请动动发财手点个赞哦~~

原文来源于百家号:源码时代以及百度

你可能感兴趣的:(python自动化测试需要知识)