既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
- 数据驱动模式
- 面向接口编程设计模式
2、什么是断言( Assert) ?
- 断言Assert用于在代码中验证实际结果是不是符合预期结果,
- 如果测试用例执行失败会抛出异常并提供断言日志
3、什么是web自动化测试
- Web自动化测试是从UI (用户界面)层面进行的自动化测试,
- 测试人员通过编程自动化程序(测试用例脚本)来打开浏览器测试网站的业务逻辑。
4、什么是Selenium?
- Selenium是一个开源的web自动化测试框架,支持多种编程语言开发自动化测试脚本,支持跨浏览器平台进行测试
5、写出Selenium中你最熟悉的接口或类
- WebDriver、InternetExplorerDriver、 FirefoxDriver、 ChromeDriver、 WebElement、WebDriverWait、 By
6、元素定位类型有哪些?
By类一共有8种元素定位方式,它们都是静态方法:
- By.id():
- By.name():
- By.tagName():
- By.className():
- By.cssSelector():
- By linkText():
- By partialLinkText():
- By.xpath():
7、Xpath是什么?
- 它是查找web页面元素的一种方式,相当于元素在dom中间的一个路径,可以采用绝对路径和相对路径的方式进行定位
- 它对于定义动态的页面元素有很大的帮助,同时也需要谨慎使用,因为如果页面结构发生变化,那么定位信息也可能需要变化。
8、findElement()和findElements(方法有什么区别
- 两个都是查找页面元素的方法
- findElement():查找一个页面元素,只会返回一个WebElement对象
- findElements() :查找页面上所有符合匹配的元素,返回元素集合
9、登录按钮除了用click方法进行点击以外还有其他方式吗?
- 还可以使用submit()方法,前提是input元素的type为submit
10、怎么提高Selenium脚本的执行速度
- 优化等待时间:使用 WebDriverWait 智能等待来代替线程等待 sleep 和 隐式等待 implicityWait
- 减少不必要的操作:如直接进入某页面代替经过一系列自动化操作进入某页面在服务器允许的情况下,使用多线程实现并发执行测试用例.
11、怎么对含有验证码的功能进行自动化测试的
-
- :图像识别,技术难度大,效果不佳,不推荐
-
- :屏蔽验证码,邀请开发处理,但在预生产环境或者生产环境不推荐
-
- :万能验证码,使用一个复杂的其他人无法猜到的验证码
12、怎么验证复选按钮是不是被选中
- 可以使用元素的 isSelected() 方法,如果返回的是 true 则说明被选中,否则表明未被选中
13、如何处理alert弹窗?
- 处理 alert 弹窗首先需要先跳转到 alert 上,然后在点击确定或者取消按钮,
- Alert alert = driver.switchTo().alert(); //切换到alert
- alert.accept0; //确定
- alert.dismiss0; //取消
14、下拉菜单中如何去选择一个菜单项?
- 如果下拉菜单是select标签,使用方法: selectByValue() 或者 selectByIndex() 或者 selectByVisibleText() 即可
- 如果这个下拉菜单不是通过 select 标签创建,则直接通过 xpath 定位元素然后去点击选择
15、如何模拟浏览器的前进和后退、刷新操作
- driver.navigate().back()://后退
- driver. navigate().forward()://前进
- driver.navigate0.efresh()://刷新
16、怎么获得当前页面的URL?
- String url = driver.getCurrentUrl();
17、WebDriver的close()和quit(方法的区别是什么?
- close()方法只是关闭当前正在操作的窗口
- quit()是关闭了所有已经打开的窗口
18、你觉得自动化测试用哪些缺陷
- 成本比较大,而成效可能并不高
- 适合自动化测试的功能有限
- 某些功能操作相对复杂,比如验证码
- 维护成本高,一旦项目需求变更,自动化测试脚本和用例就需要改进
19、Web端功能自动化,如何实现(非input型上传)上传文件
- 与windows窗口进行交互,可以使用 pywin32库 实现。
20、遇到 这种class中间有空格的控件,如何通过class定位?
- xpath定位:直接//d1 [@class=“inf_bar clearfx”]
- css定位: d1.inf_bar.clearfix
21、Selenium自动化,遇到 iframe 如何处理?
- 使用switch_ to.frame 切换进 iframe 当中后 ,再去定位其中的元素并操作
22、Web端功能自动化中,如何切换句柄。
- 先获取所有窗口句柄,然后使用 switch_ to.window() 切换到指定窗口
23、测试中遇到 readonly 属性的控件,需要如何处理?简述一下思路
- 先修改关闭r eadonly 属性,然后再操作元素。
需求:给定一个只包含正整数且非空的数组,返回该数组中重复次数最多的前N个数字(返回结果按重复次数从多到少降序), 请用熟悉的语言实现该需求。10分钟内写出来
a = [1, 6, 7, 4, 4, 5, 4, 5, 4, 5, 5, 6, 7, 8, 5, 6, 7, 3, 4, 2, 2, 1, 4, 8, 9, 4, 5, 6]
def get_datas(a):
result = []
data_dict = {}
# 键值对:键:数字,值:在列表中的次数
for item in set(a):
data_dict[str(item)] = a.count(item)
print(data_dict)
# 将键值对按值(数字出现的次数)排序 ---从高到低排序
res = sorted(data_dict.values(),reverse=True)
for num in res:
for key,value in data_dict.items():
# 如果值在列表中不存在,则添加到结果列表中
if num == value and key not in result:
result.append(key)
return result
a1 = get_datas(a)
执行结果:
25、例如: passwd={“admin’”:“123321”,“user1”:" 123456"} 满足一下条件?
- 1、设计一个登陆程序,不同的用户名和对应密码存在一一个字典里面,输入正确的用户和密码去登陆,
- 2、首先输入用户名,如果用户名不存在或者为空,则一直提示输入正确的用户名
- 3、 当用户名正确的时候,提示去输入密码,如果密码跟用户名不对应,则提示密码错误请重新输入。
- 4、如果密码输入错误超过三次,中断程序运行。
- 5、当输入密码错误时,提示还有几次机会
- 6、用户名和密码都输入成功的时候, 提示登陆成功!
users = {"admin": "123456", "user1": " 123456"} count = 0 def login(): global count username = input("请输入用户名:") if username == None or username == "": login() if username not in users.keys(): print("用户名输入不正确,请重新输入用户名:") login() while (count < 3): passwd = input("请输入密码:") if passwd == users[username]: print("登录成功!!") count = 3 else: count += 1 print("密码输入错误,您还有{0}次机会。".format(3 - count)) login()
26、编写一个程序:—没弄懂
1、能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件;
2、并打印出相对路径。
import os paths = [] def get_paths(dir, relate_dir=None, search_str=None): global paths if search_str == None: return os.listdir(dir) for item in os.listdir(dir): if relate_dir == None: relate_dir == os.curdir if os.path.isfile(os.path.join(dir, item)): if item.find(search_str) != -1: paths.append(os.path.join(relate_dir, item)) elif os.path.isdir(os.path.join(dir, item)): paths = get_paths(os.path.join(dir, item), os.path.join(relate_dir, item), search_str) return paths dir = os.getcwd() search_str = "fun" print(get_paths(dir, search_str=search_str))
27、请写出下列代码的运行结果
def f(str1, *args, **kwargs): print(str1, args, kwargs) l = [1, 2, 3] t = [4, 5, 6] d = {"a": 7, "b": 8, "c": 9} f(1, 2) f(1, 2, 3, "python") f("python", l, d) f("python", *t) f("python", *l, **d) f("python", q="winning", **d)
执行结果:
1 (2,) {} 1 (2, 3, 'python') {} python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {} python (4, 5, 6) {} python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9} python () {'q': 'winning', 'a': 7, 'b': 8, 'c': 9}
28、请写下列代码的运行结果
import copy a = [1, 2, 3, 4, ["a", "b"]] b = a c = copy.copy(a) d = copy.copy(a) a.append(5) a[4].append("c") # 请根据以上规则填写一下输出内容 print('a=', b) print('b=', b) print('c=', c) print('d=', d)
执行结果:
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b', 'c']]
29、等长的两个列表合并到一个字典,要求:合并成{‘A’: 1, ‘B’: 2, ‘C’: 3},请用一行代码实现
keys = ["A", "B", "C"]
values = ["1", "2", "3"]
print(dict(zip(keys, [int(x) for x in values])))
30、合并两个列表并消除重复值
list_1 = ["a", "b", "c", "1", "A", "winning"]
list_2 = ["a", "python", "string"]
print(set(list_1 + list_2))
# 执行结果:{'c', 'winning', '1', 'string', 'b', 'a', 'python', 'A'}
31、已知一个列表,根据字典中的x ,由大到小排序这个列表
a = [{"x": 1, "y": 2}, {"x": 2, "y": 3}, {"x": 3, "y": 4}]
aa1 = sorted(a, key=lambda item: item["x"], reverse=True)
print(aa1)
# 执行结果:[{'x': 3, 'y': 4}, {'x': 2, 'y': 3}, {'x': 1, 'y': 2}]
32、Html的基本结构是怎么样的,如何绘制一个2X2的表格
<html> <head> <title>两行量列的表格</title> -<head> <body> <tatle width="200" border="1"> <tr><td> </td> <td> </td> -</tr> <td> </td> <td> </td> -</tr> -</table> -</body> </html>
33、写出语句打印" let’s go", she said
print("\"let's go\",she said")
34、请写一段代码,随机生成10个数并写入文件
import random fs = open("num.txt", "a") list1 = [] for index in range(10): num = random.randint(0, 10) list1.append(str(num)) print(list1) fs.write(",".join(list1)) fs.close()
执行结果:
35、请分别写出代码执行结果
a = 1 def fun(a): a = 2 fun(a) print(a) # 执行结果:1
===============
b = [] def fun(b): b.append(1) fun(b) print(b) 执行结果:[1]
36、自动化测试分为哪几类:AB
- A,UI自动化
- B,接口自动化
- C, Web自动化
- D,终端自动化
37、什么是会话?
- 所谓会话就是session ,而session是一种服务器的缓存技术,由服务器端创建,
- 用户登录了系统,一般就会把登录用户的信息保存到这个session对象中,然后把此会话对应的id ( JSESSIONID )返回,
- 因此大部分系统都会用到session机制来实现鉴权。Session保存数据方式也是以key-value的形式。
38、什么是token?
- 所谓token其实就是服务器端返回的一个字符串(有点类似于: xys73494954sdhcdr83435这么一串),这个数据是基于什么算法生成的需要找开发确认,一般这个数据是唯一的,服务器每次返回的token都会不一样。
Token之所以可以用来做鉴权,原理如下:
- 用户 a 调用了登录接口 —》登录了系统b —》服务器端生成了一个唯一的 token 信息(假设为c) ,
- 然后会拿用户的编号id(假设为d)做了一个映射:c - d,
- 然后将这样的映射关系存到数据库或 redis 等缓存中,
- 然后再返回这个token给客户端 —》客户端再调用其他需要鉴权的接口时,
- 只需要将缓存起来的这个token带过去验证 --》服务器根据此token检查是否有登录用户信息来判断此请求是否是一个已登录授权的用户。( 这里客户端怎么取到这个token ,怎么存,再次请求时怎么带过去,上面接口鉴权部分已解释)。
39、你做接口自动化,项目用的是什么数据库,用什么来操作的这个数据库
- Mysql ,可以通过jdbc来实现数据库的增删查改等操作。
40、你用过单元测试框架吗,是什么框架,有哪些常用注解
- 用过, junit (不熟的话就可以不用说) , testng ,这些测试框架都支持我们去定义测试套件,达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,还能为各种测试场景的实现提供支撑。
常用注解:
- @Test ,用来标记测试方法
- @BeforeSuite ,适合套件的全局初始化,在整个套件执行前先执行
- @BeforeTest ,适合Test测试集的初始化,在测试集执行前先执行
- @BeforeClass ,适合Class测试类的初始化,在测试类被调用时执行
- @BeforeMethod ,适合测试方法执行前的初始化,在测试方法前先执行
- @After… ,对比上面的来回答, 执行顺序跟上面的刚好相反,作用适合做一些回收资源。
- @Parameters :参数化注解,方便实现参数化
- @DataProvider :数据提供者,可以用来提供测试用的批量测试数据
41、说说你对接口的理解
- 接口是服务,是功能点实现,是数据传递的通道,也是服务器端的一个实现了某种协议(比如http协议… )和映射机制(当访问一个urlI时就会通过服务器端的映射处理机制解析后,落到对应的处理函数)的函数,接口参数就是函数的参数,接口的响应数据就是函数的返回值。
41、做过接口测试吗,有哪些熟悉的工具。
- 做过(即时你之前没有用过可视化工具做过接口测试,但你现在学了接口自动化测试就算有经验了)。
熟悉的工具:
- 可视化工具比如: jmeter,postman , soapui等(用过哪些说哪些)
- 代码: httpclient发包技术来实现接口测试。
42、工具已经可以完成自动化测试了,为啥还要用到代码去完成?
- 工具做自动化测试依赖和局限性和强,有些工具提供了断言方法和表达式,但是上手成本高,而且已经提供的现有的断言表达式可能无法满足某些特殊规则的数据验证,而代码的话就相当灵活更多,断言方式可以随便按照自己的想法去设计。
43、请简单说一说get、post这 两种请求方法的区别?
Get :
- a. 一般对于从服务器取数据的请求可以设置为get方式
- b.Get方式在传递参数的时候,一般都会把参数直接拼接在url上(例如:http://xxx?id=1&type=2 )
- c.Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的)
- d.Get请求因为是直接将数据拼接在url上,所以安全性不如post强(相对) , 但是get的执行效率要快于post
Post :
- a.一般往服务器提交数据的请求会设置为post方式
- b.Post方式传递参数一般都会把参数放在请求体,而不会拼接在url
- c.Post请求方法可以提交的数据量不受限制
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
两种请求方法的区别?
Get :
- a. 一般对于从服务器取数据的请求可以设置为get方式
- b.Get方式在传递参数的时候,一般都会把参数直接拼接在url上(例如:http://xxx?id=1&type=2 )
- c.Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的)
- d.Get请求因为是直接将数据拼接在url上,所以安全性不如post强(相对) , 但是get的执行效率要快于post
Post :
- a.一般往服务器提交数据的请求会设置为post方式
- b.Post方式传递参数一般都会把参数放在请求体,而不会拼接在url
- c.Post请求方法可以提交的数据量不受限制
[外链图片转存中…(img-3oZacyil-1715054396821)]
[外链图片转存中…(img-S2kxF6tW-1715054396821)]
[外链图片转存中…(img-piMIGNtR-1715054396821)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新