1、request 模块发送请求的时候,怎么传递参数?
首先要确认一下接口的请求参数是什么类型的,如果接口需要的是查询字符串参数的话,那么就是 params 查;如果接口需要的是 json 型的参数的话,那么就直接使用 json 去查;
如果是上传文件的情况的话,那么可以通过 files 的参数来传递;
如果是表单类型的情况的话,那么可以使用 data 来传递,data 默认就是用来传递表单类型的参数;
那么当使用 data 传参的时候,也可以在那个请求头中,通过 content type 来指定这个请求参数的类型。
2、selenium 自动化如何进行文件上传?
如果是 input 元素的文件上传,可以通过 selenium 当中的 send_keys 方式进行传递,但是这种方式局限性比较大,如果遇到像通过 js 调用的组件呢,会有一些问题;
这个时候就需要通过一些和系统交互的方式去完成上传操作,比如通过 autoit,pywinauto 或者是 pyautogui 这些第三方库进行操作。
3、列表反转的几种方式?
第一种,是可以通过倒序切片反转,然后步长是 -1;
第二种,是可以通过 列表的方式,列表有一个方法叫做 reverse (译:瑞外儿四),可以实现反转。
4、Python 中的类方法、实例方法、静态方法 有何区别?
类方法就是 类的方法,在定义的时候需要在上方加上一个 @classmethod 进行修饰,形参是 cls;类 和 实例 都是可以去调用;
实例方法是 实例对象方法,只有实例对象可以调用,类是不能调用的,形参是 self 指的是对象本身;
静态方法是一个任意的函数,只是刚好放在这个类里面,他需要在上方加上一个 @staticmethod 进行修饰,可以使用对象直接调用;,静态方法跟这个类没有太大的关系。
5、Python 当中的装饰器是什么?
装饰器 又叫 修饰器,是Python 中的高阶语法,装饰器可以通过 类 或者 函数 来实现,通常使用 @ 符号来表示一个装饰器;
作用:是用来扩展投个 函数 或者 类 的功能。
6、Python 中的深复制 和 浅复制有什么区别?
深浅复制 通常是在数据嵌套的情况下讨论,当被嵌套的数据是 可变类型 的数据的情况下,对这个数据进行复制的时候,我们就要考虑到这个深浅复制;
浅复制,比如说,列表嵌套列表,列表中自带的 copy 方法进行复制就是 浅复制;
调用 copy 方法复制列表的时候,只会复制这个列表,列表中引用的其他数据(比如嵌套的列表)不会进行复制,是直接引用;
浅复制由于复制的不彻底,原列表引用的数据发送变化的时候,那么复制之后的数据也会受到影响;
深复制,就要用到 copy 模块里面的 deepcopy 方法,调用 deepcopy 方法复制列表的时候,不仅会复制这个列表,而列表中引用的其他数据(比如嵌套列表)也会进行复制。
7、什么是 PEP8 规范?
PEP8规范 又叫 Python8号增强提案,他主要针对于 Python 代码编写风格,而制定的一个指南;
比如:首先在一个模块中,模块中的函数 或者 类,他们的间隔是两行;然后类里面的方法,他们间隔是一行;代码行的缩进通常用一个 tab 键 及四个空格来表示;
然后一行代码 PEP8的规范里面指出来,最大应该是79个字符;
关于这个规范还有很多要求,也就不一一举例了。
8、Python 函数的重载机制是什么?
函数重载主要是为了解决两个问题:第一个,是可变参数类型,第二个,是可变参数个数;
在 Python 当中参数不需要申明类型,函数是可以接受任何类型的参数的;如果函数的功能相同,一个函数就可以处理了;
在 Python 当中通过 一个 * 号 和 两个 ** 号 来处理可变参数个数;所以在 Python 里面他不需要处理函数重载。
9、Python 中常见的 可变参数类型 和 不可变参数类型 都有哪些?
不可变的数据类型包括:整数、浮点数、负数、布尔值、字符串。
可变参数类型包括:字典、列表、集合、元祖。
10、你的项目是什么阶段介入接口自动化测试的?
首先,我这个项目是一个全新的项目,我负责接口测试,另外五个人负责功能测试;因为是新项目,所以我在项目开发阶段,我就开始介入接口自动化;
编写了自动化用例,我们使用 yapi 平台管理接口的,相当于是提供了接口文档,由于介入的时间比较早,在这个过程当中,自动化发现了 几百个 bug;
为了后面的功能测试人员节约了很多时间,同时也能够保证,跟的上频繁上线的步伐。
11、关于 Python 中的 intern 机制,你有了解过吗?
在运行 Python 程序的时候,会专门分配一块空白的内存空间,用来保存由数字、字母、下划线组成的字符串,也就是纯单词、字符组成的字符串,这块空白的内存就被称为 字符串驻留池,也称作 大整数池;
所谓的 intern 机制,就是在程序运行过程中创建新的字符串的时候,首先根据这个字符串,驻留池里面查找是否这个字符串,在这个驻留池里面是否已经创建了;
如果有的话就已经直接拿过来用,如果没有的话就在重新创建;创建之后如果是一个纯单词字符的话,会加入到这个驻留池当中,这样的一个机制,能够避免频繁的创建和销毁;
这个对象能够提升我们程序的一个运行效率。
12、Python 中 *args 和 **kwargs 的作用?
都是不定长,可以解决函数中参数不固定的问题,*args 可以把位置参数转化成元祖;**kwargs 可以把 关键字参数转化成字典。
13、进程,线程,协成,你是怎么理解的?
进程是操作系统资源分配的基本单位;线程是操作系统调度的基本单位;协成 也叫 微线程,协成 存在于线程 之中,是比线程更小的可执行单元;
进程和线程可根据操作系统的调度,有可能是并发执行,有可能是并行;协成在一个线程之中,只能并发不能实现并行。
14、Python 的多线程有什么缺点?
根据 Python 官方文档知道,由于 Cpython 解释器的全局解释器锁的存在,那么多线程在同一时刻只能有一个线程执行,意思就是说 Python 中的多线程只能并发执行,没有办法实现真正的并行;也就是无法利用多核 CPU 的资源。
15、Python 如何去操作 MySQL 数据库?
可以使用的库有几个:pymysql、或者是 mysql_clinet 都可以进行连接;建立游标对象以后就可以直接执行 SQL 语句了。
16、Python 总什么是 命名元祖?
命名元祖 是 Python 提供的一个叫做 namedtuple 的类,可以从 collection 包中导入,命名元组继承自 元祖类,所以具备元组的特性,同时他可以访问属性的方式去获取,元组的元素可读性大大的提高,也可以非常方便的转换成像字典这样类型。
17、函数的参数定义有几种方式?
必传参数、默认参数、可变长参数。
18、类里面去定义方法有几种形式?
分别是 实例方法、静态方法、类方法。
类方法 和 实例方法 它都是跟类 或者 实例 有关系,它们的参数总是一个 实例 或者 类。
但是 静态方法 就是一个普通函数,只不过我们刚好把他扔到了这个类的里面而已,它的参数没有说一定要是 类 或是谁。
19、unittest 框架的几个概念,几个组件?
一共有五个概念:
TestCase :是用来编写测试用例的,我们所编写的所有测试用例都需要继承 testcase 这个类;
TestSuite :是用来加载测试用例的容器,也就是一个测试套件;
TesttLoader :是用来收集测试用例的,并加载到这个测试套件里面的;
TestTestRunner :是用来运行测试用例,并生成文本形式的报告的;我们可以换成 HtmlTestRunner 来生成 HTML 格式的报告;
fixture :是就是夹具,用例或者 用例的前置和后置工作可以在这个里面做。
20、Python 中的魔术方法了解过吗?
有了解过,Python 类当中内置的那个双下划 开头 和 结尾 的方法,都叫做 魔法函数,它是在特定的情况下除法的;
比如说:类的初始化 init,它就是在创建对象的时候会自动调用,用于初始化对象;
Python 当中有很多的特性,都是通过魔术方法来实现的。
21、Python 中如何定义匿名函数?
Python 中定义匿名函数非常简单,通过 lambda 表达式来定义就可以了;
lambda 表达式的基本句法是:lambda 空格 然后加上函数的参数,接下来在冒号后面跟上函数的返回值。
22、Python 中 queue 模块队列 和 进程 queue 队列,有什么区别?
queue 模块中的 Queue 只能在同一个进程中进行通信,只能实现多线程的数据交互,不能实现多进程的数据交互;
那么 进程 模块当中的 Queue 可以跨进程使用,能够实现多进程进行数据交互。
23、同步请求 和 异步请求 的区别?
同步请求,是指在一个线程当中,如果你发起一次请求以后,在收到返回结果之前,你是不能发起下一次请求的;
异步请求,是指在 同一个线程当中,如果你发起一次请求以后,在等待返回结果的这段时间之内,你可以继续去发起其他的请求。
24、Python 中 with 操作文件为什么不用手动关闭,原理是什么?
Python 中的 with 关键字,它是用来启动一个对象的上下文管理器的;
他的原理是:当我们使用 with 去通过 open 打开文件的时候,它会触发文件对象的上下文管理器,然后当 with 当中的代码运行结束后,会自动去调用上下文管理器的退出方法;
在这个方法中他会去调用 close 来关闭文件,所以不需要我们手动去关闭文件。
25、Python 中的垃圾回收机制是什么?
我们常用的Python 解释器 CPython 主要使用了三种垃圾回收机制来完成对这个无效数据的回收以及内存的释放,分别是:引用计数、标记清除 还有 分代回收。
垃圾回收的策略 是以这个引用计数为主,然后 标记清除 和 分代回收 只是做一个辅助性的手段。