先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
km = Mage(‘孔明’,‘扇子’)
lb.show_me()
km.show_me()
km.fly()
#lb.fly()这个没有fly功能
class A:
def func1(self):
print(‘a func’)
def func4(self):
print(‘#####4#####’)
class B:
def func2(self):
print(‘b func’)
def func4(self):
print(‘*********’)
class C(B,A):
def func3(self):
print(‘c func’)
def func4(self):
# print(‘^^^^^^^^’)
if name == ‘main’:
c1 = C()
c1.func1()
c1.func2()
c1.func3()
c1.func4()
自下向上,自左向右------先C-B-A, 之后C(B,A)
魔法方法:
特殊方法:
- __init__ :实例化类实例时默认会调用的方法
- __str__:打印/显示实例时调用方法以及 返回字符串
- __call__: 用于创建可调用的实例
class Book:
def init(self,title,author):
self.title = title
self.author = author
def str(self):
打印实例时,执行此方法
return ‘《%s》’ % self.title
def call(self):
print(‘《%s》是%s编著的’ % (self.title,self.author))
if name == ‘main’:
pybook = Book(‘Python核心编程’,‘韦斯利’)#调用 init
print(pybook) #调用__str__
pybook() #调用__call__
正则表达式:
匹配单个字符:
/t.m
/t[a-z]m
/t[0-10]m 含有0和1
/t[0-9amo]m
/t[-a1]m 减号放两边
/t[^0-9]m 取反 不要数字0-9
/t[0-9^]m 0-9以及^号
/t\dm 相当于 [0-9]
\w 任意数字字母
\W 取反 不是数字字母
\s 匹配空白字符 相当于 \r\v\f\t\n
\S 取反 不是空白字符
在vim里面 一排~!@#$%^&*()_+ 都要转义
匹配一组字符:
{M, } 最少M次
{ ,M} 最多M次
其他特殊字符:
只匹配tom 或者\btom\b
例子:
为mac地址加:
- 找到MAC地址
- 每两个数字分一组
- 中间以:分隔开
192.168.1.1 0000ca001256
:%s/(…)(…)(…)(…)(…)(…)$/\1:\2:\3:\4:\5:\6/ ----%s// 全文替换 在vim中
re模块:
import re
#在food的开头匹配f… 匹配到返回匹配对象,匹配不到则返回None
re.match(‘f…’,‘food’)
<_sre.SRE_Match object; span=(0, 3), match=‘foo’>
re.match(‘f…’,‘seafood’)
print(re.match(‘f…’,‘seafood’))
None
#search在字符串中匹配正则,匹配到返回匹配对象
re.search(‘f…’,‘seafood’)
<_sre.SRE_Match object; span=(3, 6), match=‘foo’>
m = re.search(‘f…’,‘seafood’)
m.group()
‘foo’ #匹配对象的group方法返回匹配到的内容
re.search(‘f…’,‘seafood is food’)
#返回所有匹配 findall
re.findall(‘f…’,‘seafood is food’)
[‘foo’, ‘foo’]
#返回匹配对象构成的生成器
re.finditer(‘f…’,‘seafood is food’)
<callable_iterator object at 0x7f8a055fd2b0>
list(re.finditer(‘f…’,‘seafood is food’))
[<_sre.SRE_Match object; span=(3, 6), match=‘foo’>, <_sre.SRE_Match object; span=(11, 14), match=‘foo’>]
for m in re.finditer(‘f…’,‘seafood is food’):
… m.group()
…
‘foo’
‘foo’
切分:
#以-或者. 作为分隔符切割字符串
re.split(‘-|.’,‘hello-world-china.com.cn’)
[‘hello’, ‘world’, ‘china’, ‘com’, ‘cn’]
#把X替换成tedu
re.sub(‘X’,‘tedu’,‘X web site is X.cn’)
‘tedu web site is tedu.cn’
为了提升匹配效率,最好将正则表达式先编译
patt = re.compile(‘f…’)
patt.match(‘food’)
<_sre.SRE_Match object; span=(0, 3), match=‘foo’>
patt.search(‘seafood’)
<_sre.SRE_Match object; span=(3, 6), match=‘foo’>
m = patt.search(‘seafood’)
m.group()
‘foo’
例子:
分析apache访问日志:
import re
def count_patt(fname,patt):
cpatt = re.compile(patt) #为了更好的执行效率,把模式编译
patt_dict = {} #把结果保存到字典
with open(fname) as fobj:
for line in fobj:
m = cpatt.search(line) #在一行中匹配模式
if m: #如果m不是None,非空为真
key = m.group()
patt_dict[key] = patt_dict.get(key,0) + 1
if key not in patt_dict:
# patt_dict[key] = 1
else:
# patt_dictp[key] += 1
return patt_dict
if name == ‘main’:
fname = ‘access_log’
ip = ‘^(\d+.){3}\d+’
br = ‘Chrome|MSIE|Firefox’
result1 = count_patt(fname, ip)
result2 = count_patt(fname, br)
print(result1)
print(result2)
#####################class
import re
class CountPatt:
def count_patt(self, fname,patt):
cpatt = re.compile(patt) #为了更好的执行效率,把模式编译
patt_dict = {} #把结果保存到字典
with open(fname) as fobj:
for line in fobj:
m = cpatt.search(line) #在一行中匹配模式
if m: #如果m不是None,非空为真
key = m.group()
patt_dict[key] = patt_dict.get(key,0) + 1
if key not in patt_dict:
# patt_dict[key] = 1
else:
# patt_dictp[key] += 1
return patt_dict
if name == ‘main’:
fname = ‘access_log’
ip = ‘^(\d+.){3}\d+’
br = ‘Chrome|MSIE|Firefox’
wl = ‘Windows|Linux’
cp = CountPatt()
result = cp.count_patt(fname,ip)
result2 = cp.count_patt(fname, br)
print(result)
print(result2)
result1 = count_patt(fname, ip)
result2 = count_patt(fname, br)
print(result1)
print(result2)
##################class + 绑定文件
import re
class CountPatt:
def init(self,fname):
self.fname = fname
def count_patt(self, patt):
cpatt = re.compile(patt) #为了更好的执行效率,把模式编译
patt_dict = {} #把结果保存到字典
with open(self.fname) as fobj:
for line in fobj:
m = cpatt.search(line) #在一行中匹配模式
if m: #如果m不是None,非空为真
key = m.group()
patt_dict[key] = patt_dict.get(key,0) + 1
if key not in patt_dict:
# patt_dict[key] = 1
else:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
0) + 1
if key not in patt_dict:
# patt_dict[key] = 1
else:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-VCUMnwpZ-1713438243864)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!