2021-11-02

个人笔记

面试必会:

1:linux命令

  1. head -n 10 /etc/profile
    tail -n 5 /etc/profile

  2. 查找出tomcat得进程并杀死
    ps-ef | grep tomcat
    kill -9 tomcat

  3. tar cvf xxx.zip file
    tar xvf xxx.zip 或者unzip xxx.zip

  4. find 路径 -name file.txt

  5. grep 文件内容 文件(^file 以file开头 *log 以log结尾)

  6. mkdir -p /home/images

  7. mv 源路径 目标路径 (如果路径都一样,则是重命名)

  8. cp -r 源路径 目标路径 (-r 源路径是目录,则把下面得所有东西都复制)

  9. i 编辑模式 esc退出编辑模式
    ​:wq 保存并退出(w保存 q退出)

  10. top 动态的监听进程得运行状态
    2:adb命令

  11. adb logcat | grep 正则表达式 查看日志

  12. adb install xxx.apk -r 覆盖安装
    adb uninstall -k 包名 卸载但保存信息

  13. adb -s cf27456f shell 指定设备连接

  14. adb shell pm list packages 列出手机装的所有app 的包名
    adb shell pm list packages -3 列出手机装的第三方app 的包名

  15. adb push 往电脑推数据
    adb pull​往设备拉取数据

  16. ifconfig 查看ip地址
    3:PO模式得介绍

我们公司封装一个自动化测试框架我们引入po的思想和设计模式 :
针对页面采用面向对象的编程方式,首先我们把页面封装成3层
对象库层:对象库层就是找到我们页面包含的哪些元素,还有怎么定位到这些元素;
操作层:对我们页面上定位到的这些元素进行什么样的操作,就是对页面的操作封装成一个方法;
业务层:就是对业务的一些功能,就是当前我们要测试的一些页面进行业务功能的封装
而且我们的调用方式就是操作层会调用对象库层封装的一些方法,业务层会调用操作库层封装的一些方法;
这就是我们po的设计模式对页面进行的一个封装,还有一个就是把我们po的代码写完以后,编写我们的测试脚本,测试脚本的话只需要调用我们的业务层给我们封装好的方法,而且把那些通用的方法封装成一个工具类,
然后所有的不管哪一层只要需要的话都可以调用我们的工具类,业务层,测试脚本都可以调用。
然后引入数据驱动,数据驱动的话就是把用例数据单独抽离出来,放到一个文件,测试脚本就可以调用我们的数据文件,脚本执行完以后还可以生成我们的测试报告,这就是我们的测试脚本所涉及的架构
4. web和APP测试得区别
1.系统架构方面:
web是bs架构,基于浏览器得;app是cs架构,用户必须安装客户端;
web只需要更新服务端,客户端就会同步更新;app服务端和客户端都需要更新
2.性能方面:
web只关注响应时间;
app则还要关心流量,电量,CPU,GPU
3.兼容方面:
web是基于浏览器得,所以更倾向于浏览器和电脑硬件,电脑系统方面得兼容;
app则要看分辨率,屏幕分寸,还要看设备系统;
4.安装卸载方面:
web是基于浏览器得,不需要考虑安装卸载
app是客户端得,必须测试安装卸载更新,还有异常场景:安装过程中得中断,断网,安装后删除安装文件
5:常见的http状态码

100 是用于告诉客户端应该继续发送请求
200, 表示服务器已经成功接受请求,并返回结果
302 该资源原本确实存在,但已经被临时改变了位置(重定向)
404, 请求失败
500, 服务器遇到未知的错误
6:get和post请求的区别

在浏览器进行回退操作时,get请求是无害的,而post请求则会重新请求一次
get请求参数是连接在url后面的,而post请求参数是存放在requestbody内的
get请求因为浏览器对url长度有限制(不同浏览器长度限制不一样)对传参数量有限制,而post请求因为参数存放在requestbody内所以参数数量没有限制(事实上get请求也能在requestbody内携带参数,只不过不符合规定,有的浏览器能够获取到数据,而有的不能)
因为get请求参数暴露在url上,所以安全方面post比get更加安全
get请求浏览器会主动cache,post并不会,除非主动设置
get请求参数会保存在浏览器历史记录内,post请求并不会
get请求只能进行url编码,而post请求可以支持多种编码方式
get请求产生1个tcp数据包,post请求产生2个tcp数据包
浏览器在发送get请求时会将header和data一起发送给服务器,服务器返回200状态码,而在发送post请求时,会先将header发送给服务器,服务器返回100,之后再将data发送给服务器,服务器返回200 OK
7:测试用例的设计

1.如何测试一个 纸杯
功能度:用水杯装水看漏不漏;水能不能被喝到
安全性:杯子有没有毒或细菌
可靠性:杯子从不同高度落下的损坏程度
可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用
兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等
易用性:杯子是否烫手、是否有防滑措施、是否方便饮用
用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述
疲劳测试:将杯子盛上水(案例一)放 24 小时检查泄漏时间和情况;盛上汽油(案例二)
放 24 小时检查泄漏时间和情况等
压力测试:用根针并在针上面不断加重量,看压强多大时会穿透

极豪项目相关:

1.录入和解锁得过程需要分析一下
2.首先硬件会把正常模组安装到手机里面,然后采集一下正常场景和极端场景得数据:比如常温解锁,低温解锁和太阳光按偏解锁,我们会用这个手机和现有成功量产的模组进行模组成像评估分析成像得差异,筛选出成像较好和较差得模组,然后让硬件调整参数配置和设计,再通过多轮测试评估出成像较好得模组进行后续得极限模组评估,也就是在产线上大部分模组和靠近合格品边缘的模组进行算法评估,看极限模组的算法能不能也被cover住,然后对于正常的模组我们会进行算法评估,其中通过jira提交和管理我们的bug,通过平台获取版本的信息,以及发版后首先进行自动化跑图测试分析和上版本的差异,以及人工测试:FRR,far和防伪,然后我们会对测试结果进行分析,在平台发出测试报告和邮件。
3.然后我们的项目分为4个阶段:预言-准入-量产-上市
其中预言是公司处于摸索阶段,还未有客户对接的项目
准入是指为了拿到客户的项目和认可,用公司自己的模组准入到已经上市的手机里面进行算法迭代,然后送测给客户,如果通过客户的case标准的验收,则准入成功,意味着可以拿到客户后续项目。
拿到客户得项目以后,开始进行算法迭代优化,然后一直送测,直到达到量产要求:量产又分为一供和二供:比如一供70%量产,二供30%量产,然后再进行持续优化更新,直到可以上市。
一:Xpath

  1. 解释:
  2. / 表示路径
  3. //递归路径 --相对路径
  4. []谓语 表示 xxx 条件的
    /bookstore/book[1] 数字代表索引 从1开始
    /bookstore/book[@category=”web”] 是属性就加@符号
    /bookstore/book[@category=”web” and @cover] 谓语里面可以加 and or not
    /bookstore/book[not(@category=”web”)]
  5. //title[text()=”Learning XML”] —text()
  6. //book[@categroy=‘web’ and not(contains(author, “James”))]/title --contains包含
  7. //book[count(author)>1 and stars-with(title, ‘X’)]/price --stars-with 以xx开头
  8. 练习
    链接:http://www.w3school.com.cn/example/xmle/books.xml、
    1.选取 书店里 所有书的详细信息
    /bookstore/book
    //book

2.选取 所有书的标题,所有书的分类签
//bookstore/book/title
//title

3.选取 第一本书的定价
//book[1]/price

4.选取 最后一本书的作者
//book[last()]/author

5.选取 倒数第二本书的 分类标签
//book[last()-1]/@categroy

6.选取 包含cover属性的书的标题
//book[@cover]/title

7.选取 定价高于35的书的标题
//book[price>35]/title
//price[text()>35]/…/title

8.选取 定价在30到40之间的书的标题
//book[price>35 and price<40]/title

9.选取 作者多于一个的书的标题
//book[count(author)>1]/title

10.选取 作者多于一个的书 只列出所有作者名
//book[count(author)>1]/author

11.选取 分类不是web 且价格低于40的书的作者
//book[not(@category=‘web’) and price<40]/author

12.选取 标题名称包含X的 所有书的定价值
//book[contains(title, ‘X’)]/price

作业:
1.选取 book下所有 后代节点的text值 (提示:用通配符*)
//book//*/text()

2.选取 单个作者 且 分类是web的书的出版年份值
//book[count(author)=1 and @categroy=‘web’]/year

3.选取 单个作者 且 定价大于30的书的分类签
//book[count(author)=1 and price>30]/@categroy

4.选取 多个作者 且 标题是以X开头的 书的定价
//book[count(author)>1 and stars-with(title, ‘X’)]/price

5.选取 分类是web 且作者不包括James的所有书的标题
//book[@categroy=‘web’ and not(contains(author, “James”))]/title

二:实战项目

1、 完成登录和注册功能 (验证结果)

  1. 密码错误的用例:
    class_name(属性值).text 可以求出这个属性后面的文本值

2.顶部搜索功能,关键词:手机,打印搜索出商品数量,品牌:小米

  1. 连续查询对象:
    用途:有时候页面元素定位不到,来回浮动,可以使用连续查询,先取到id缩小范围,然后再后面跟其他的定位方式。(一般很少用)

2.使用len()可以得出下面有几个li标签,一个li标签就是一个手机的信息。

3、添加购物车功能及验证(商品标题、商品图片、商品价格、颜色分类等)
步骤一:随机选中一个物品,添加到购物车。

步骤二:商品信息验证

4、 顶部高级搜索功能,关键词:手机,价格0-2000 验证搜索结果
·定位到价格区间的第一个:

5、 电脑手机推荐区域–价格检查。要求输出结果:{“商品标题”:”价格“}

因为标题和价格元素定位都在class=“product”下面,所以利用连续查询优化脚本。

6、电脑手机推荐区域–图片链接有效性检查。要求输出图片无法显示的商品标题

7、用户中心查询订单,订单信息以字典形式返回

8、完成下单整个流程,并获取订单号
Order01.py
9、不输入任何条件,点击搜索,在搜索结果中选择按价格排序,倒序,检查搜索出的所有商品价格是否是倒序排列。(不考虑翻页、考虑翻页)

10、 获取所有收货人为测试的订单,完成申请退款流程

11、 循环点击页面的[团购活动],[限时抢购],并打印商品的价格。

练习地址:http://123.56.99.53:9003/orders/
打印出所有订单号:
步骤一:首先翻页定位到下一页的元素
注意:先打印出第一页的订单号,再点击下一页。
X注意X:不能使用class定位方式,因为class_name属性包含部分值也算,所有没办法翻到最后一页。
步骤二:用多定位方式定位到订单号,然后取text属性值

三:活动监控平台项目

打开服务:

项目一:H5活动页
美的品牌活动页
http://127.0.0.1:8000/shop/activity/1901WP003/
需求:

功能:
1.看每一块商品是不是正常显示,价格是不是正确(0元或者空价格)
2.每个商品点进去,正常下单
自动化:
1.检查页面当中的商品图片,价格正常展示
2.点进入产品详情页价格和标题和外层都完全一致
3.点到里面能完成下单流程,能生成订单号。

自动化脚本实现步骤:
一:先把cookie种上,防止后面下单的时候还得登录

二:循环获取到页面上的每一个商品

三:检查商品的图片是否有限,能正常显示
Requests库的解释:
Requests是Python语言的第三方的库,专门用于发送HTTP请求,是实现接口测试最好的选择
requests是一个简单的请求库,其中的get方法可以像指定服务器发送get请求
Requests库的用法:

四:检查商品价格和标题是否正常

五:下单

四:pytest得运用

一:pytest得解释

pytest得好处:
由测试脚本过渡到测试框架,写脚本更加简洁,便于脚本后期得维护
单元测试框架种类:
unittest --python自带
pytest --更好的unittest(需要安装)
noise --不用
为啥要用pytest(单元测试框架):
因为我们得case串起来跑不了,不能一个一个按顺序去执行,用pytest把脚本批量运行和管理
二:pytest得运行方式及用法

  1. 命令行模式:
    运行当前路径下递归查询所有符合模块和方法都以test_开头得case

2:命令行单独运行某个py文件
py文件不以test_开头也可以,对文件名字没要求

3:pycharm运行模式:(意义不大)
1.py文件和方法需要以test_开头
2.需要导入pytest模块
3.需要加载main函数
main函数:单独运行py文件,首先从主函数开始执行
以这种方式运行会执行所有得以test_开头得文件,类似于直接用命令行执行pytest

4:可以把case方法放在类中执行
类名为 Testxxx 并且不能带有 init 方法

5:测试用例得组织
cases(先建一个cases包)
test_Login.py(一个功能就是一个.py文件)
def test_login01()
def test_login02()
6: Pytest 常用命令行参数
-s 展示print日志信息

7: pycharm执行得另一种方式:(常用得方法)
run.py入口函数

8:执行具体某个case,py文件或者某个路径下得case
某路径下得py文件

某个py文件

某2个py文件

某个py文件下面得某一个方法

9:打标签执行对应得case

可以同时打2个标签,既跑smoke又跑huigui

三:fixture夹具函数得运用

背景:每个用例在开始和结束时间节点上都有固定得操作和流程,然后把这些固定得东西提取出来。
好处:便于管理和维护我们得测试脚本。
一:测试用例setup和teardown用法

  1. 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
    每个def方法执行前都会执行setup,结束前都会执行teardown方法

执行结果:

二:模块级(setup_module/teardown_module)开始.py模块始末全局
每个py文件执行前都会执行一遍setup,执行后都会执行一遍teardown

执行结果:

三:fixture得灵活运用

  1. 模块级别得,如果想要方法级别得scope=“module”可以不加(默认)
    注意:一定得把装了fixture那个包引进来

执行结果:

2.conftest.py的使用(可以不用导入fixture)
好处:不需要import导入 conftest.py,pytest用例会自动识别该文件

  1. yield得使用
    背景:前面只是开头都先打开一个浏览器,如果也想要关闭浏览器呢?
    错误写法:这种是不支持得,所以就有了下面得yield用法

正确写法:yield用法

执行结果:

4:预处理和后处理
背景:上面讲解了yield得用法,但是如果预处理里面脚本报错,后处理我也想把浏览器给关闭,怎么实现呢?
实现步骤:
1.夹具函数里面填参request
2.再定义一个关闭浏览器得函数,把这个函数添加到内存里面(addfinalizer),即使预处理报错,内存里面得脚本也会执行
3.return 浏览器对象

五:数据驱动(参数化)

背景:当我们要模拟千奇百怪得测试用例得数据填入测试脚本中时,我们不可能把所有重复得脚本再写一遍,所以只需要把数据写入到单独得csv文件中即可
介绍:Pytest 测试框架的数据驱动是由 pytest 自带的pytest.mark.parametrize()来实现的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值