问: http 和 https的区别
答:
-
- https需要申请ssl证书,
- https是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
- http和https使用的是不同的链接方式,用的端口也不一样,前者是80后者是443
问: cookie 和session的区别
答: cookie就是在客户端访问服务器的时候,服务器会生成一份cookie传给客户端,客户端会把cookie保存起来,以后客户端每次访问服务的时候,都会带上cookie
session 是针对一个用户的,只有客户,程序就会为这个客户生成一个session,访问结束时 session结束
问: http的get请求和post请求的区别?
答:
-
- get请求是将参数放到url中的,用?分割url和参数,&表示多个参数,post请求是将参数放到body中的
- get请求数据最多1024字节,而post没有上线
问: 列表与元组的区别
答: 列表可变,元组不可变
问: 什么是可变、不可变类型
答: 可变是指内存中的值可以改变,不可变的指的是内存中的值不可改变,不可变的有数值,字符串,元组;可变的有:列表,字典
问: 存入字典中有没有排序
答: 没有排序,可以使用sort函数对字典进行排序
问: if 和 == 的区别
答: is 判断的是 a 对象是否就是 b 对象,通过id来判断
== 是判断 a 对象的值 与 b对象的值是否相等, 通过 value来判断
问: 谈谈你对面向对象的理解
答: 面向对象三大特征
-
- 封装: 类中包含数据和方法
- 继承:子类继承父类,子类可以使用父类中的 属性和方法
- 多态:一个类被多个子类继承,每个子类对父类的方法做了不同的实现
问: 解释一下python的继承
答: 当一个类继承了另一个类,这个类可以称之为子类,子类可以使用父类中的属性和方法,这样能够减少代码的重复,便于维护
python支持以下种类的继承:
单继承: 一个类继承另一个类
多继承:一个类继承多个基类
多级继承: 一个类继承单个基类,后者可以继承另一个基类
分层继承: 多个类继承单个类
混合继承: 两种或多种类型继承的混合
问: __init__ 有什么作用
答: init在创建对象后,对对象进行初始化
问: python里面如何生成随机数
答: python生成随机数,需要先导入random模块, random.randint(1, 100) 随机生成1 - 100之间的数字
问:模块和包是什么
答: 简单来说 form xxxxxx 就是包; impot xxxx就是模块,模块可以是类和方法
问: *args 和**kwargs的含义
答:当我们不知道函数传递多少参数时,我们可以使用 *args进行参数传递;当我们不知道该传递多少关键字参数时,可使用**kwargs来收集关键字参数
问: python的特征
答: 简单、易学、免费、开源、解释性,面向对象、提供了丰富的库
问: 什么是解释性
答: 计算机不能直接理解高级语言,只能最直接理解机器语言,所以需要把高级语言转换为机器语言计算机才能执行高级语言编写的程序,python解释器把源代码转换为字节码的中间形式,然后再把它翻译成机器语言
问: 什么是负索引?
答: 负索引与正索引不同,它是从右往左开始检索的
-
list = [1,2,3,4,5,6,7]
-
print(list[-3])# 输出结果为 5
-
print(list[-3:-1])# 输出结果为[5,6]
问:解释Python中的join()和split()函数
答: Join()能让我们在指定字符添加到字符串
split()能让我们用指定字符分割字符串
问: 怎么移除字符串中的空格
答: 去除前空格可以使用lstrip(),去除rstrip可以使用rstrip(),去除前后空格可以使用strip()
问: 如何字符串大小写转换
答:转小写 "ABCDEFG".lower()
转大写"abcdefg".upper()
使用isupper检查是否为全大写,islower检查是否为全小写
问: 如何获取字典中的key或value
答:mydict.values() # 获取字典中所有的values
mydict.key() # 获取字典中所有的key
问: 接口自动化中,调用接口时,需要使用token怎么处理
答: 可以将 登录接口封装为前置条件,在执行接口时调用登录接口获取token,在对token格式进行处理,key叫authorization,value 叫 bearer 后面拼接上获取到的tonken,对处理好的格式导入headers中
-
url = "https://xxxxxxxxxxxx"
-
data = {"username": "用户名", "password": "密码"}
-
response = HTTPHandler().visit("post", url, json=data) #这边将request做了封装
-
token = {
-
"authorization": "Bearer" + " " + response
-
}
-
print(response)
-
stock_url = "https://xxxxxxxx"
-
stock_data = {"sourceItems": [{"sku": "xxxxxxxx", "source_code": "xxxxx", "quantity": "xxxxx", "status": "xxxxx"}]}
-
stock = HTTPHandler().visit("post", url=stock_url, json=stock_data, headers=token)
-
print(stock)
问:字段如何取值和赋值
答: 赋值: mydict['e'] = '5' # 输出结果为{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'e': '5'}
取值: print(mydict[b]) # 输出结果为 2
-
mydict = {"a": "1", "b": "2", "c": "3", "d": "4"}
-
print(mydict.values())
问: python如何去重排序
答: 可以先使用set方法去重,在转换为list,最后.sort进行排序
问: sort和sorted有什么区别
答: sort应用在list方法上,修改了原列表内容 sorted可以对所有可迭代的对象进行排序,返回一个新的列表,不会对原数据改变
str = set("aabbcccde")
-
print(str) # 输出结果为 {'b', 'e', 'a', 'c', 'd'}
-
# l1 = list(str)
-
# l1.sort()
-
# print(l1) # 输出结果为 ['a', 'b', 'c', 'd', 'e']
-
s1 = sorted(str)
-
print(str) # 输出结果为 {'b', 'e', 'a', 'c', 'd'}
-
print(s1) # 输出结果为 ['a', 'b', 'c', 'd', 'e']
问:为什么做自动化、什么项目适合做自动化测试
-
- 需求稳定、不会频繁变动
- 研发周期长,需要频繁回归测试
- 需要在多平台上重复运行相同的测试场景
- 被测软件开发规范,保证系统的可测性
- 测试人员具备一定的编码能力
问:自动化使用的测试框架是什么?怎么做,简述自动化框架的设计、维护
答:用的是python 语言,测试框架用的是 selenium, 接口调用 request, 数据管理用的是 excel、yaml,数据库交互用的是pymysql,日志处理用logging,测试报告用的是 allure; 持续集成用jenkins,
在做web自动化的时候,我使用的是po模式,先将logging封装,再封装元素操作,加入logger、webdriverwait、元素操作失败时调用 save_screenshot(截图),这样每次操作元素的时候都可以打印出日志,失败的时候截图方便查错;在就是封装pymysql,以便执行数据库操作;还有封装request,造数据的时候或者做接口自动化的时候会用到;
问:什么是PO模式
答:Page Object Model,PO模式最核心的思想就是分层,实现松耦合,实现脚本的重复使用,实现脚本的易维护性;
PO模式主要分三层:
-
-
- 基础层BasePage: 封装一些基础的selenium原生Api,如元素操作
- PO层:元素定位、获取元素对象、页面动作
- 测试用例层: 业务逻辑、数据驱动
-
问:PO模式和非PO模式的优缺点
非PO模式维护性差,如果前端元素做了修改,需要修改整个业务逻辑的代码,查找代码也很麻烦
而使用PO模式,可提高代码的可读性、复用性、维护性
问:如何设计自动化测试用例
答:手动测试用例肯定是不能直接用在自动化测试用例上的,设计用例时:
-
- 用例之间的不要产生关联
- 用例只验证一个功能点,不要试图验证多个功能点
- 用例上下文要有一定的顺序,前置条件明确
- 测试用例对数据的操作要进行还原
- 用例预计结果一定要正确
问:selenium有几种等待方法,他们有什么区别
答: 有三种等待方法,1. 隐形等待 dirver.implicitly_wait();2、显性等待 webdriverwait)3、强制等待 time.sleep()
-
-
-
- 隐形等待全局设置一次就可以了,但页面上有的元素不一定可见,在会话开始的时候设置一次,之后所有的找元素都会调用隐形等待
- time.sleep() 就是强制等待,不管元素可不可见都会等到时间到
- 显性等待它的条件有很多:
-
- 元素可见
- 元素可用
- 新窗口出现
- url地址
- 还可以设置每隔0.5s查看条件是否成立
- WebDriverWait(self.driver,15,0.5).unit(EC.visibility_of_element_located(loc))
- expected_conditions as EC 提供了很多期望发生的条件。
-
-
常用的判断条件:
-
-
-
-
-
- presence_of_element_locateed() : 元素存在
- visbility_of_element_located(): 元素可见
- element_to_be_clickable(): 元素可点击
-
-
-
-
我在使用PO模式封装selenium原生Api的时候,就会加入显性等待
问: selenium中有哪些定位方式
答: 有8种
-
- tag_name
- id
- name
- class_name
- css_selector
- link_text
- partial_link_text
- XPATH
问:弹框怎么处理
答:
-
- 如果是div、蒙层这种弹框可直接定位,
- alert弹框需要用switch_to.alert进行处理,iframe也可以使用switch_to进行处理, accept() alert弹框确定,dismiss() alert弹框取消
- 浏览器打开的新窗口,先window_handles获取浏览区所有的句柄,switch_to.window(wins[-1]), 通过下标切换窗口
问: 下拉菜单如何选择
答: 通过Select("元素").select_by_visble_text()通过select文本选择下拉菜单,还有通过 select_by_index(),select_by_value()
如果不是select标签则使用元素点击的方法选择
问: 如何模拟浏览器的前进、后退、刷新
答: driver.back() # 后退
driver.forward()# 前进
driver.refresh() # 刷新
问: WebDriver的close() he quit()的区别
答: close是关闭当前页面,不会关闭进程;而quit是关闭当前浏览器,并且关闭进程
问: 如何安装 allure
$ pip install allure-pytest
问: super是干嘛用的?
答: super用于继承父类的方法和属性
举例: 在封装 logging时候,可以使用super初始化父类的属性
-
class FileHandler(logging.Logger):
-
def __init__(self, name="root", level="DEBUG", log_file=None, format="%(filename)s:%(lineno)d:%(asctime)s %(name)s [%(levelname)s] :%(message)s", datefmt="%Y/%m/%d %H:%M:%S"):
-
super().__init__(name)
-
self.setLevel(level)
json和字典的区别
json: 独立于编程语言的文本格式来储存数据和表示数据;通常用于前后端数据交互
dict:python存储数据格式
区别:json{"key":"value"} - 双引号; dict{'key':'value'}- 单引号,json格式python是无法识别的,需要转换为 字典
答: 首先pyhton的基础数据类型有: int、str、float、dict、list、bool、tuple、set这几种,没有json;
json.dumps() 可将dict转换为 json
json.load() 可将json转换为 字典
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。