目录
力扣刷题
1603-设计停车系统 简单 定义类及函数
res = [1]*len(candies)
for i in range(len(candies)):
res[i] = candies[i]+extraCandies>=max(candies) #将bool值赋值给列表元素
return res
1688-比赛配对次数 简单
1221-分割平衡字符串 简单 贪心
#遍历字符串
#遇到L加1,遇到R减1,减到0说明是一个平衡子串,计数加1
#最后返回计数
res,d =0,0
for i in s:
if i =='L':
d+=1
else:
d-=1
if d==0:
res +=1
return res
数据库练习
2月7日 统计:12
9:21-10:23
2072.赢得比赛的大学 case when
10:37-12:04
2026. 低质量问题 likes/(likes+dislikes)<0.6
1990.统计实验的数量. union all + cross join + group by platform, experiment_name
13:07-14:10
1978.上级经理已离职的公司员工 manager_id not in (select employee_id from Employees)
1965.丢失信息的雇员 not in + union
1939.主动请求确认消息的用户 join + <> (和!=一个意思)+ timestampdiff。
➡️timestampdiff用法 求时间差,timestampdif(单位,时间A,时间B)
14:19-15:01
1890.2020年最后一次登陆 year(time_stamp)查找年份
1873.计算特殊奖金 mod函数 取余
1853.转换日期格式 date_format()函数——date_farmat(day,‘’)
15:21-16:13
1821.寻找今年有正收入的客户 子查询作为数据源
1809.没有广告的剧集。 子查询作为条件,⚠️mysql没有连续判断即,where C.start_time <= A.timestamp <= C.end_time
1795.每个产品在不同商店的价格。 重构表格,union all 行转列
19:46-20:53
1789.员工的直属部门 方法1:union;方法2:case when(没搞懂怎么写)(卡我半天)
1777.每家商店的产品价格 列转行
测试学习计划
1.复习python
(1)阅读黑马python讲义day01-day08,重点看不熟悉的部分,补充json文件知识(在day08)
(2)黑马python讲义day09-day10——讲unittest编程,学习一下unittest编程框架,PDF结合视频学习,重点掌握里面的例子,会自己书写框架
(3) 学习python数据结构&算法
2月20日:
跟视频复习python知识 335-355,讲义day01看完,标注不熟悉部分
🎬视频课:软件测试第二篇 python
2月23日:
主要看讲义day02-day07内不熟悉部分,不懂的地方对照视频看讲解365-400
🎬视频课:软件测试第二篇 python
2月24日:
看讲义day08
- 369p ——Debug调试代码:打断点,debug运行,可以查看代码运行步骤
- 随机函数:random.randint(a,b),产生[a,b]之间包含端点的随机整数
import random num = random.randint(1,4) print(num)
- 字符串:单引号、双引号、三引号都可以表示字符串,字符串本身有单引号时定义不能用单引号(双、三同理),否则要用转义字符\,一个转义字符只转义一个。字符串前面加上r,\不会作为转义
name = 'I\'m jenny' print(name) #I\'m jenny name2 = 'I\\\'m danny' print(name2) #I\'m danny name3 = r'I\\\'m danny' print(name3) #I\\\'m danny
- 字符串[start:end:step] 字符串下表、切片
- 字符串.find(sub_str, start, end) 查找字符串,找到返回sub_str第一次出现时第一个字符串的下表
#找第一个and出现位置 a= 'and itcast and ithema and python' num = a.find('and') print(num) #找第二个and出现位置 print(a.find('and',num+1))
- 字符串.replace(old_str,new_str,count),返回:替换之后完整的字符串,原来字符串没变化
a = 'good study' b = a.replace('g','G') print(b)
- 字符串链接,将列表内容转为字符串
list = ['good','good','study'] print(' '.join(list)) #good good study
- 列表支持下标、切片
- 列表查找元素下标方法 列表没有find方法,要用index。list.index(数据,start,end) index()找到返回第一次出现的下标,找不到报错。find找到返回下标,找不到返回-1
list = ['good','good','study'] print(list.index('good')) #0
- 添加数据
列表.append(数据)
列表.insert(下标,数据) ⚠️原来下标位置有数据是,原数据会后移
list = ['good','good','study']
list.insert(0,'never')
print(list)
列表1.extend(列表2) #列表合并
- 删除操作
列表.pop(下标) #返回:删除的数据
列表.remove(数据值) #返回:None ⚠️要删除掉的数据不存在时,报错
list = ['good','good','study']
print(list.pop(0)) #good
list.remove('good')
print(list) #study
- 列表反转:
列表[::-1]
列表.reverse() #直接修改原列表,返回None
- 列表排序:
列表.sort() #按照升序排列
列表.sort(reverse=True) #按照降序排列
- 元组 基本用法和列表一致
元组内容不能改变,只能查看,列表数据可以改变;
元组可以使用下标、切片获取元素;
元素存在index方法,查找不存在会报错;
元组可以使用count方法,可以用in操作
- 字典
删除操作:del 字典[键]
字典.pop(键)
清空:字典.clear()
查询:字典[键]
字典.get(键)
- 集合
#集合 set 无序 不重复 set1 = {1,2,3,46,7} set2 = {2,5,7,0,8,4} #下面两种求交集方法 print(set1.intersection(set2)) print(set1 & set2) #求并集 print(set1.union(set2)) print(set1 | set2) #求差集 print(set1.difference(set2)) #set1中没有在set2中的元素 print(set1 - set2) #求交叉补集,两个集合中只出现一次的元素 print(set1.symmetric_difference(set2)) print(set1 ^ set2) #⚠️集合里的元素不能通过下标读取
- 函数
变量的引用:将数据保存到变量的内存中,本质是将数据的地址保存到变量对应的内存中;
id()获取变量中的引用地址,如果两个变量的id()获取的引用地址一样,代表两个变量用了同一个数据;
只有赋值运算符=可以改变变量的引用
可变与不可变类型()
可变类型做参数,在函数内部如果不使用=改变形参的引用(使用pop、append修改),对形参的修改会同步到实参中
- 组包和拆包 437p
#拆包 num=[1,2,3,4] a,b,c,d = num print(a,b,c,d) #1 2 3 4
- 局部变量&全局变量
函数内部使用,如果想在函数外部使用,需要用return返回;
函数中存在和全局变量名字相同的局部变量,在函数中使用的是局部变量的值(就近)
num = 20 #全局变量
def func1():
print(f'func1中的{num}')
def func2():
num = 30
print(f'func2中的{num}')
def func3():
global num
num = 40
print(f'func3中的{num}')
func1() #20
func2() #30
func3() #40
在函数里不能直接修改全局变量,需要声明才可以 (不建议,代码多时不易调试)
name = “Jenny”
def change_name():
global name #声明全局变量
name = "denny"
- 函数传参方式
位置传参
关键字传参
混合传参:关键字传参需要写在位置传参的后面,不要给一个形参传递多个数据值
缺省参数:放在普通参数后面
- 多值参数:
不定长位置参数(不定长元组参数) *args
不定长关键字参数(不定长字典参数) **kwargs
def func(普通参数,*args,缺省参数,** kwargs)
非固定参数 参考路飞python day5函数编程
def stu_register(name,age,*args): #*args 会把多传⼊入的参数变成⼀一个元组形式
print(name,age,args)
stu_register("alex",33) #alex 33 ()
def stu_register2(name, age, *args, **kwargs):
print(name, age, args, kwargs)
stu_register2("alex", 22) #alex 22 () {}
- print函数
print(1,2,sep='_') #sep='':参数间隔 end=''
面向对象
- 类的组成:类名,属性,方法
- 类的属性:在内部写在__init__方法中(实例属性);在类内部方法外部直接定义的变量是类属性
- 类中的方法:(1)实例方法:就是定义函数,不过第一个参数是self(self的理解还是不太懂,day06/p17)(2)类方法:在类方法上写@classmethod,方法中不需要使用实例属性(self),使用类属性就可以将这个方法定义为类方法
- 方法和属性可以设置访问控制权限,私有权限:__属性名/方法名,私有权限只能在当前类的内部使用
- 继承:class A(object)
文件——day08
- 文件类型:
文本文件:能够使用记事本软件打开转换为文字,txt md py html css js json
二进制文件:不能使用记事本打开,exe mp3 mp4 jpj png
- 文件操作:打开文件,读写文件,关闭文件
- json文件:
读取:json.load(文件对象)
写入:json.dump() (不懂怎么写入)
unittest框架(需要实战理解,比较抽象,不知道怎么用)
- python自带框架:unittest,radom,json,os,time;第三方框架:selenium,appium,requests
- UnitTest要素:
TestCase:写用例代码
TestSuite:测试套件,管理组装多个TestCase
TestRunner:执行
TestLoader:测试加载
Fixture:测试夹具
2.学习UI自动化
👇学习计划
黑马UI自动化讲义(参考1024集)
day01-day04——讲元素获取定位等基础知识
可以先看day05——讲python里面的pytest编程
day06——讲代码封装问题
🎬视频参考➡️web自动化入门实战黑马头条项目,软件测试突击实战自学视频
📒学习笔记
(1)自动化测试:适合在回归测试时使用,项目周期长,需求稳定
(2)web自动化工具:QTP,Robot Framework(基于python,可以结合requests实现接口测试)
selenium(开源免费,支持不同浏览器兼容问题,支持多平台(不同操作系统),支持多语言(java,python等等)
(3)selenium工作原理
python 通过http请求向webdriver发送请求,进一步通过http向浏览器发送请求
(4)元素定位
元素:由标签头、标签尾、头尾中间的信息构成
#ID定位:前提:元素必须有ID属性值
driver.find_element_by_id(id)
#class定位:元素有多个值时,只需要取其中任一个都可以
driver.find_element_by_class_name(class_name)
#name定位:
driver.find_element_by_name(name)
#tag_name定位:不建议,因为tag_name 相同的很多
driver.find_element_by_tag_name(tag_name)
#link_text定位:link_text参数表示的是a标签元素的全部文本内容
#通过a标签的全部文本内容来定位a标签
driver.find_element_by_link_text(link_text)
#partial_link_text定位:使用a标签元素的局部文本内容
driver.find_element_by_partial_link_text(参数)
#xpath定位:
driver.find_element_by_xpath(xpath)
‘’‘xpath表达式
路径定位 属性定位class属性需要全部属性值 路径与属性结合
1.绝对路径:/html/body/。。。 //*[@属性名称=属性值]
2.相对路径://div/p/input //标签名[@属性名称=属性值]’‘’
#css定位:
id选择器:#id
class选择器:.class
属性选择器:[tag(属性名称)='value'(属性值)] ⚠️:class属性需要全部的值
层级选择器:(1)父子层级:Element1>element2
(2)隔代层级:不需要大于号
(5)元素操作
点击:element.click()
清除:element.clear()
输入:element.send_keys()
(6)浏览器常用方法
窗口最大化:driver.maximize_window()
获取浏览器窗口标题:driver.title
(7)元素常用方法
获取元素信息:element.text
获取元素的属性值:element.get_attribute("attribute")
———————————————————————————————————————————
🎬参考视频➡️8天带软件测试人员搞定web测试自动化,黑马测试真实上课视频
📒笔记
PO模式:
base 基类——基础的公共方法,page页面一些公共方法(给page页面用)
初始化、查找元素方法(提供点击、输入、获取文本使用)、 点击、输入、获取文本方法、截图方法
page 页面层——页面涉及的对象放到一起,一个页面封装一个对象,使用导包/继承调用base里的公共方法
scripts(cases) 业务层 导包调用page
#导包
import unittest
from 页面层路径 import 对象
新建测试类
初始化方法
结束方法
新建测试方法
以下学习不分前后顺序,每种测试对应一种软件学习,时间充足可以先看每个部分的基础知识,希望快速可以先看软件学习及实例,遇到不懂的知识点再倒回去看基础知识
3.接口测试——postman
黑马接口测试讲义
day01-day02——接口基础知识,要知道URL获取、http请求
day03-day04——postman软件使用
🎬Python结合requests库实现接口自动化测试,含如何搭建接口自动化次数框架及mock测试
📒笔记
4.性能测试——jmeter、Loadrunner
测试基础知识:
1.缺陷
- 缺陷状态:新建(激活)->打开->修复->关闭
- 缺陷严重程度:致命 - 严重 - 一般 - 建议
- 缺陷优先级:高 - 中 - 低
- 缺陷类型:代码错误 - 设计缺陷 - 性能问题 - 安全相关(账号密码容易泄露,容易被黑客攻击)
2月20日
学习黑马白盒测试用例设计方法(主要偏理论,没有敲代码),45min*2听完下面的课程
🎬视频课:白盒测试用例设计-黑马
📒笔记:参考➡️白盒测试用例设计
学习6种逻辑覆盖和基本路径覆盖
白盒测试:又称为逻辑驱动测试
代码走查:一组开发人员对代码进行审核,主要由其他人而非代码的作者完成
学习黑马黑盒测试用例设计方法
📒
黑盒测试:又称为数据驱动的测试或输入/输出驱动的测试。使用这种测试方法将程序视为一个黑盒子,测试目标与程序内部机制和结构完全无关,将重点放在发现程序不按其规范正确运行的环境条件。
1.等价类:在测试数据中,具有某种共同特征的数据子集
有效等价类:满足需求;无效等价类:不满足需求
适用场景:需要有大量数据测试输入,但没法穷举测试的地方,例如页面输入框类测试
- 输入框
- 下拉列表
- 单选复选框
步骤:
- 明确需求
- 确定有效和无效等价类
- 提取数据
练习:
参数 | 长度 | 类型 | 规则 |
区号 | 1.空 2.3位 | ||
2.边界值:大量错误发生在输入或者输出范围的边界上,而不是在输入范围的内部;
选取刚好等于、刚刚好大于或者刚刚好小于边界值作为测试数据
操作步骤:
eg.
3.判定表法:条件的全组合
4.因果图法:分析输入和输出,先考虑条件和条件之间的关系,条件与结果的关系,在转换为判定表
5.状态迁移图,分析状态节点,出去路径作为测试用例
6.场景法:软件是用事件触发控制流程的,时间触发时的情景形成场景
基本流,备选流
7.正交试验法:分析因子与水平
8.错误推测法
API是什么意思? 参考➡️API是什么
小程序测试:
1.要求:注重用户体验
- 导航明确(导航需要高亮);
- 反馈明确(toast提示不超过3秒),弹窗提示(有文字的时间需要长一点),需要用户点击确定、取消的对话框测试(有交互的提示)
- 重点突出,选中的时候有高亮显示
- 每个应用层级不超过3层
- 源码文件大小不超过20M,单个分包不超过2M
2.测试工具:👉微信开发者工具
3.小程序文件:(1)WXML(小程序的前端语言),.wxml文件:WXML模板文件
(2)WXSS(不用web项目前端框架,只是简单的标签语言) .wxss文件:WXSS样式文件
(3)JS .js文件:JS脚本逻辑文件
(4).json文件:json配置文件
4.小程序通讯模型:小程序无法和后台服务器直接通讯,需要借助微信客户端
5.小程序测试和app测试区别:
- 安装部署方面:小程序不需要安装,不需要注册,只需要授权,可以兼容各种手机,app需要不同移动操作系统分别开发
- 小程序入口:发现点小程序,下拉进入,分享的链接进入
6.LAMP部署:vm+centos7
安装完成后验证: