先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
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请求方法可以提交的数据量不受限制
- d.Post请求传参相对于get要安全(相对不是绝对) , 但是post的执行效率不如get。
44、简述你所知道的延时等待方式
强制等待:
- 也叫线程等待, 通过线程休眠的方式完成的等待,如等待5秒: Thread sleep(5000),
隐式等待:
- 通过implicitly Wait完成的延时等待,注意这种是针对全局设置的等待,如设置超时时间为10秒,使用了implicitlyWait后,如果第一次没有找到元素,会在10秒之内不断循环去找元素,如果超过10秒还没有找到,则抛出异常
显式等待:
- 也称为智能等待,针对指定元素定位指定等待时间,在指定时间范围内进行元素查找,找到元素则直接返回,如果在超时还没有找到元素,则抛出异常
45、输出结果是什么?
def f(x, l=[]): for i in range(x): l.append(i * i) print(l) f(2) f(3, [3, 2, 1]) f(3) 结果: [0] [0, 1] [3, 2, 1, 0] [3, 2, 1, 0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0] [0, 1, 0, 1] [0, 1, 0, 1, 4]
46、你是怎么做接口自动化的?
- 参考答案:会根据接口文档设计接口用例,然后利用 python 的 requests 库实现接口请求,利用excel来管理测试数据。并在代码当中利用 unittest 测试框架实现接口用例的断言处理。
47、如何用webdriver进行鼠标右键点击操作?
使用ActionChains类
ac= ActionChains(driver);
ac.context _click(元素对象).perform()
48、你在写自动化框架的时候,测试用例保存到哪里?用什么去读取?
- 测试用例保存到Excel中,使用第三方库openpyxI完成对Excel的操作
49、用python写一段代码,计算1-1000以内能被7整除,除以5余3的整数,并按行打印
for i in range(1, 1000): if i % 7 == 0 and i % 5 ==3: print(i) 执行结果: 28 63 98 133 168 ........
50、小明有一百元,他想买一百本书,英语书5元一本,数学书3元一本,语文书0.5元一本,请问他有多少种买法。请编程解决这个问题,可以使用任何编程语言,包括伪语言。
根据题意是要买一百本书,一百块钱,看有多少种买法(钱不一定非要花完 ,只要能买到一百本书) :
三本书的价格分别为: 5,3,0.5,那么能买到最多的数学书为20本,英语书33本,语文书200本。但是也有组合的买法,所以可以通过一个三重for循环来实现, ijk分别代表购买数学,英语,语文书的数量,循环条件分别是i<=20,j<=33,k<=200,那么只要满足 i+j+k == 100,5*i+3*j+0.5*k<= 100即可。最后统计所有的组合就是买法的数量。
n = 0 for i in range(21): for j in range(34): for k in range(201): if 5 * i + 3 * j + k * 0.5 <= 100 and i + j + k == 100: n += 1 print(n)
51、使用monkey测试到了bug怎么提交的?
- monkey对APP进行我们在测试的时候,会利用adb shell monkey-p包名-f脚本-V-V -v >D:log.txt把日志输出到本地,并且将出现错误时候的日志截图,把日志截图以及bug描述提交到禅道,指派给对应的开发。但是在提交bug之前会手动去重现下这个bug。
52、在一个HTML页面中想要创建超链接, 有哪种实现方法?
- 超链接:<a href=“网址”target=”. blank">内容
- target="_ blank"为新窗口打开。
- JS跳转链接:<a href=“#” οnclick=“javascript:location.href='网址”;">内容
- meta 标签跳转链接:
- (数字3为秒)
53、下面哪些关于自动化测试的说法是错误的: (ABCD )
A、自动化测试可以完全取代手工测试
B、自动化测试可以大幅度减少测试团队的工作量
C、性能测试不能自动化
D、自动化测试能够发现大量的新缺陷
Python中自定义的函数如何传递动态参数?
- 参数使用*args或者*kwargs
55、什么是lambda函数?它有什么好处?
- lambda函数:没有函数名称,是匿名函数。
- 好处:只做简单运算,接收任何多参数并返回值,没有复杂的函数体。可以作为回调函数,传递给某些应用,比如消息处理.
56、Python语言中子类如何调用父类的构造函数?
- 如果子类没有定义构造函数,则子类默认会调用父类的构造函数;
- 如果子类定义了构造函数,那么在子类的构造函数中,调用父类的构造函数: python3中,使用super()._ _init_ _()
57、已知L = [“a”, “b”, “c”, “d”, “e”, “f”, “g”],则L[3]的值是_ L[::5]的值是__L[::2]值是_
L = ["a", "b", "c", "d", "e", "F", "g"] print(L[3]) print(L[::5]) print(L[::2]) 执行结果: d ['a', 'F'] ['a', 'c', 'e', 'g']
58、已知列表x=[1, 2],那么表达式 list(enumerate(x)) 的值
x = [1, 2]
a1 = list(enumerate(x))
print(a1)
# 执行结果:[(0, 1), (1, 2)]
59、查看变量类型的python内置函数是 type
60、查看变量内存地址的python函数是 id
61、表达式sum(range(1, 10, 2)) 的值为25
print(sum(range(1, 10, 2))) # 各两位取一个之和:1,3,5,7,9
# 执行结果:25
62、Python的有序序列是:列表、元祖、字符
小飞飞买好多瓶子,每对瓶子上会有一个相同的数字。小飞飞数了一遍自己的瓶子发现瓶子的个数是奇数N ,也就是有-个没有配对的瓶子。现在小飞飞要去再拿一个新瓶子,请问他给新瓶子要标几号才能让所有瓶子都有配对的。比如说他有七个瓶子( N=7 ),那么标号可以是:1,6,13,1,6,13,13
那么新瓶子就要标记为13,加入后就有(1,1),(6,6),(13,13),(13,13 )这4对
输入:测试数据的第一行一个正整数 N (1<=N<=1000 )表示有N个数, N保证是奇数,第二行N个自然数,每个数都小于10^9
输出:输出一行一个整数,新瓶子的号码
样例:
- 输入:
- 9
- 121233441
- 输出:1
def func(n, data): if 0 <= n <= 1000 and n % 2 == 1 and len(data) == n: for i in data: if 0 < i < (10 ** 9): if data.count(i) % 2 != 0: return i else: print("瓶子的号码值为自然数,并且小于10^9") else: print("传入的参数有误") res = func(7, [1, 6, 1, 6, 13, 13, 13]) print(res)
63、用python写一个函数,将一个字符串中给定的子串字符按从小到大的输出,第一个字符的位置为0
- 如: myOrder( abejykhsesm’,2,5)
- 输出: ehjky
def my_order(s, start, len): # 先切片 s = s[start:start + len] # 强制转换为列表 li = list(s) # 排序 li.sort() # 在拼接为字符串 res = "".join(li) print("输出结果为:", res) my_order("abcedfgh", 2, 4) 结果为:cdef
64、对输入的整数数组,输出数组元素中的最大值、最大值的个数、最小值和最小值的个数
函数名称: max_ and_ min(list)
输入参数: list整数数组
输出: list整数数组,有四个值,分别表示最大值、最大值的个数、最小值和最小值的个数
- 示例: max and. min([1,4,21,5,6,1,1]) => [21,1,1,3]
- max_ and. min(1]) => [1,1,1,1]
def max_and_min(a): b = sorted(a, reverse=True) max = b[0] max_num = b.count(max) min = b[-1] min_num = b.count(min)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ef
64、对输入的整数数组,输出数组元素中的最大值、最大值的个数、最小值和最小值的个数
函数名称: max_ and_ min(list)
输入参数: list整数数组
输出: list整数数组,有四个值,分别表示最大值、最大值的个数、最小值和最小值的个数
- 示例: max and. min([1,4,21,5,6,1,1]) => [21,1,1,3]
- max_ and. min(1]) => [1,1,1,1]
def max_and_min(a): b = sorted(a, reverse=True) max = b[0] max_num = b.count(max) min = b[-1] min_num = b.count(min)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-4visC1GN-1713693954493)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!