马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:
现在外边大厂面试都问啥
想去大厂又怕面试挂
面试应该怎么准备
测试开发前景如何
面试,一个程序员成长之路永恒绕不过的话题。每每到这个时期,不管当前有没有跳槽换工作需求的,都多少会跟着观望一下“外边的世界”~
当然外边的世界很精彩,但出来混,可不能没有一点准备,赤手空拳上阵。给大家分享一份免费的 测试工程师面试题,涵盖不少大厂高频必考点,需要的同学可免费领取。
不只是面试,了解市场需求,认识自己的问题,熟悉Python高频难点,巩固 Python相关知识...这份资料都可以帮助到你。
金三银四刚开始就拿到了蚂蚁的offer,这份阿里大牛总结的面试笔记,能掌握这份笔记的70%以上感觉就能拿大厂offer。
为了帮助更多的粉丝朋友们都拿到心仪的offer,小编在此把这份笔记分享出来
接上篇:
11.46 模块封装哪些,封装的目的是什么?有没有自己封装过一些函数?封装过哪些函数?
模块封装:封裝界面上的所有元素,一些公共模块(数据库操作,读取 exell 数据公共方法等),
测试数据(返回一些变量,字典列表 exell 表等),一些元素操作,测试用例等等.
封装的目的:为了后期维护和管理更加方便,如果修改数据时直接在模块中修改就行
def get_data(filename,tablname):
# 1.打开 excel 文件
Book = xrd.open_workbook(filename)
# 2.打开一个表
Sheet = book.sheet_by_name(tablname)
Print(sheet.nrows)
#3.对表操作列,行,单元格
list = []
for i in range(1,sheet.nrows):
List.append(sheet.row_values(i))
return list
11.47 闭环有哪些,闭环的目是什么
1、通过调用数据库操作把数据删除
2、打开的所有界面都需要关闭--可以在测试用例处设置装饰器,每个函数调用装饰器就可以每次关
闭了才会打开另一个界面85
11.48 POM 模型如何划分模块
1、将界面元素封装到一个模块 page_element,封装成—个 py 文件:page_element.py
2、将元素的操作封装到一个模块 element_action,封装成一个 py 文件:element_action.py
3、将测试数据封装到一个模块 data,封装成一个 py 文件 data_base.py
4、将一些公共的方法例如数据库操作,获取 exell 表数据的操作方法封装到一个模块 common,封装
成一个 py 文件:common_action.py
5、将测试用例(test 开头的函数用例)封装到一个模块 test_case,封装成一个 py 文件 test_case.py
6、将运行用例的框架( pytest 框架)封装到一个模块 run_case,封装成一个 py 文件:run_case.py(这
里还可以发送邮件)
7、还建一个存放测试报告文件的模块 report,到时生成的报告存放在这个位置中
8、建立一个持续集成需要扩展的模块 ci_cd
11.49 划分模块的好处有哪些
1、方便维护与管理
2、模块化,比较方便清楚各个模块的东西,提高测试效率和准确性
注意:没有统一的标准
11.50 自动发送邮件里面包含哪些内容
1、包含发件者邮箱地址,授权码
2、接收者邮箱地址,邮件主题,邮件正文内容,附件地址
11.51 你们有没有做过自动化工程维护工作。
(对于自动化工程的维护是你做的吗? 你们的工程具体怎么维护的? 如何实现数据与脚本的分离?
具体怎么做的? 优点在哪里? )
工程维护这块,最主要分为几大块模块,主要就是工程管理思想,我们当时采用的 POM 模型来实现工
程的模块化,把数据,配置文件,报告,测试用例,页面操作,公共业务方法等都进行独立起来,
封装到不通过的模块中,
例外就是实现数据驱动,参数化,
还有就是实现一些函数的封装,方便调用,
还有一个重点就是用例的管理,统一加载执行,如何实现全量跑用例,出报告等等
这块我做得不是特别多,大部分都是我们老大维护的,我们主要是协助为主。86
11.52 对于生成的自动化测试报告如何分析?
1、主看总共执行了多少用例,通过了多少,失败了多少,错误了多少。
2、对于错误的用例,基本都脚本问题,查看报告中的日志详细信息,看具体哪个位置出错了.针对性
去进行调试,修改。
3、对于失败的用例,也是首先看报告中的日志,看具体哪个位置出错了,一般首先怀疑自己的脚本,
先确定脚本是否有问题,如果脚本没有问题,那可以确定就是 Bug 了,提 Bug 即可
#其他问题
十二、 Unittest 框架
12.1 你们自动化用例是怎么管理的?
1. 所有用例都是放在 test_case 的目录下的统一管理的。
2. 每个某块一个.py 文件,数据独立放在 excel 表格中
3. 所有的具体用例脚本都是依据 unittest 来编写的,利用 ddt 模型的装饰器来引用数据
4. 然后跑用例这块,主要用的是 unittest 框架来统一加载用例,并执行用例的.
如果要全量跑,调用 unittest 中的 defaultTestLoader.discover 这个函数来
加载 test_case 目录下的所有.py 文件。
12.2 Web UI 自动化都用到过哪些库?
Selenium 库
里面封装了丰富的对浏览器,页面元素进行操作的方法。
Xlrd 库 主要用来实现对 excel 表格数据进行读取的 APl
Pymysql 库 主要用来操作数据库的
Ddt 库 主要用来实现数据驱动的
Re 库 主要用来提取 html 页面数据的
Unittest 库
主要用来编写用例,管理用例,执行用例的。
12.3 Unittest 框架的原理?
Unittest 框架有几个大组件,1.测试固件( setUp,tearDown)
2.测试用例 3.测试套件 4.加载器 5.运行器 6.测试结果
首先我们需要创建测试用例,然后利用加载器讲用例加载到测试套件中,并创建一个执行器,
去执行测试条件中的所有用例。
它可以帮我们进行管理用例,统计加载执行用例,批量跑用例。87
12.4 Unittest 框架有哪些组件?
test fixture(测试固件):
包含一个 Setup()方法/函数,tearDown()方法/函数,用例执行之前都会先执行 Setup()方法/函数
主要是完成一些准备初始化的工作,比如创建临时的数据库,文件和目录,用例数据读取,浏览器的
打开等,用例执行完成之后,会执行 tearDown()方法/函数,完成一些清理回收的工作,比如数据库
断开,关闭浏览器。
(1)比如说在这个测试用例中需要访问数据库,那么可以在 seUp()中建立数据库连接以及进行一些初
始化,在 tearDown()中清除在数据库中产生的数据,然后关闭连接,注意 tear Down 的过程很重要,
要为以后的 TestCase 留下一个干净的环境。
test case(测试用例):
什么是测试用例呢?
就是一个完整的测试流程包括测试前准备环境的搭建( setUp),以及测试后环境的还原( tearDown),
还有包括用例方法,每个用例方法都必须要以 test 开头。
test suite(测试套件):
多个测试用例的集合就是 suite,一个 suite 可以包含多个测试用例,也可以嵌套 suite.可以通过
addTest()方法手动增加 TestCase,也可通过 TestLoader 自动添加 TestCase, TestLoader 在添加
用例时,会没有顺序。
test runner(运行器):
用来执行测试套件中测试用例的,最终执行完成之后会生成一个测试结果。
TestLoader(加载器):用来加载用例,把用例加载到测试套件中
Test Result(测试结果):包括运行了多少测试用例,成功了多少,失败了多少等信息。
12.5 Unittest 框架如何使用?
1. 导包
import unittest
from selenium import webdriver
import ddt
2.定义一个类继承 unittest.TestCase 基类
重写 setUp(),tearDown()方法
3.setUp()方法实现一个初始化的准备工作,比如,实例化 webdriver 对象,对 driver 进行初始化
配置,连接数据库.....
4.tearDown()方法实现释放资源的任务。88
编写用例方法,用例方法必须以 test 开头
5. Unittest 如何去运行多个文件或者整个目录
因为我们用例全部是放在 test_case 目录下统一管理的,基本每个某块都是一个.py 文件,要全量跑
的话,需要调用 unittest.default.discover()函数,指定用例目录的路径,加载所有的.py 文件,
它会自动创建测试套件,井把用例加入测试套件中,然后利用 unittest.TestRunner()创建一个执行
器利用这个执行器去运行测试雷件中的所有用例。
12.6 如何生成自动化测试报告?
我们当时用的是 HtmIReport 这个库来生成自动化测试报告的。
安装
pip install HTMLReport
使用方法
# 测试用例执行器
runner= HTMLReport.TestRunner(
Report_file_name='test’, #报告文件名,如果未赋值,将采用"test+时间戳"
Output_path='report’,
#保存文件夹名,默认" report"
tite=’测试报告’, #报告标题,默认"测试报告"
description=’无测试描述’ #报告描述,默认"测试描述"
Thread_count=1, #并发线程数量(无序执行测试),默认数量 1
Thread_start_wait=3,
#各线程启动延迟,默认 0s
Sequential_execution=False. #是否按照套件添加( addTests)顺序执行,
#会等待一个 addTests 执行完成,再执行下一个,默认 False
#如果用例中存在 tearDownClass,建议设置为 True,
#否则 tearDownClass 将会在所有用例线程执行完后才会执行
# lang='e
lang='cn' #支持中文与英文,默认中文
)
#执行测试用例套件
runner.run(suite)89
十三、 Pytest 框架
13.1 自动化测试使用的那些库
1、selenium 库 --web 自动化测试工具 2. priest 框架,运行用例 3. random 随机,概率
4. xlrd --获取 exell 表数据 5. pymysql 调用数据库 6. pytest-html --生成 html 文件
7. yagmanil --发送邮件 8. time-时间 9. Select 包--下拉框 10. Keys 模拟键盘操作
11. Webdriverwait 智能等待 12. Action Chains 模拟鼠标操作
13.2 pytest 框架如何使用
1. 安装 pytest 框架
pip install pytest、在 pycham 里安装 pytest、源码安装
2. 导入 pytest: import pytest
3. 编写主函数,后续代码,后面运行: if_name_=='_main_’;
4. 执行文件:
pytest.main(["要运行的文件的相对路径"]) ----例如(["../test_case/test_01.py"])
13.3 pytest 框架如何去生成测试报告
1. 要安装 pytest-html
pip install pytest-html、在 pycharm 里安装 pytest-html、或者源码安装
2. 在运行用例模块中执行用例时添加 html 路径:
pytest.main(["要运行的文件的路径","--html=.
/report/report.html"])
13.4 bytes 如何去运行多个文件或者整个目录
1. 执行多个文件
pytest.main(["../test_case/test_01","../test_case/test_login"])
2. 执行整个目录
pytest.main(["../test_case/"]) --列表里是目录路径
13.5 pytest 框架如何去运行上次失败的测试用例
1. pytest --lf 运行用例的路径 --- 只运行上次失败的用例
2. pytest --ff 运行用例的路径 --- 运行上次所有的用例,优先运行上次失败的用例
(如果没有写路径,则执行当前目录下所有的用例)90
13.6 运行完成后,如何去自动发送邮件
#用例执行,无人值守的状态,如何才能知道已经运行完成,发送测试报告到邮箱里面查看运行完成
安装 yagman
pip installyagmail、在 pycharm 中安装 yagmail
导入 yagmail: import yagmail
定义发送者邮箱服务,里面包括邮箱地址,授权码,smtp.126.com
yag = yagmail.SMTP("126 邮箱地址","授权码","smtp.126.com")
自动发送邮件
yag.send(["接收邮件的邮箱地址","多个邮箱用列表包起来"],"邮件主题","邮件正文内容","
附件的地址../report/report.html")
13.7 fixture 装饰器的作用与默认值
1. 装饰器:@pytest.fixture()
def open_l():
#不再用 test 开头,
ea = element_action()
#实例化对象
ea.open_url()
#打开浏览器 driver,被其他用例所调用
Yield ea 1,装饰器使用的返回值,类似于 return 方法
2,前置与后置处理分开
ea.close_browser()
#每次运行,关闭浏览器,闭环
设置了装饰器之后,可以被其他用例调用,有使每个用例都有打开网页和默认关闭网页的作用
13.8 yield 的作用是什么
1. 装饰器使用的返回值,类似于 return 方法
2. 使前置与后置处理分开
13.9 pytest 运行用例,用例命名规则有哪些?
1. 文件名以 test_*.py 文件和 *_test.py 命名
* 代表任意任何内容
2. def 函数要以 test_开头
3. class 类要以 test_开头.
4. 以 test_开头的方法
13.10 allure 报告生成
1,先安装一个 allure 包用 pip install allure-pytest
2,运行脚本-s,-d 生成报告的目录,一般是一些 json 文件91
3,下载 allure 生成工具,配置环境变量
4,运行命令: allure generate ./allurereport/-o ./reporthtml/--clean,
生成 html 的 allure 报告
十四、性能测试
14.1 性能测试怎么测试
性能测试其实就是通过自动化工具模拟多种正常、峰值以及异常负载来对系统的各项性能指标进
行测试。负载测试和压力测试都属于性能测试,二者可结合使用。
性能指标主要有平均响应时间、90%响应时间、吞吐量、吞吐率,每秒事务数,以及服务器的资
源使用率(CPU 占比,mem 内存占比等)等。当并发用户数超过 300 时,为了让测试数据更准确,可以
考虑分布式压测,通过 jmeter 客户端控制几台 jmeter 服务器进行测试。
性能测试要先调试好脚本,主要考虑对脚本的数据参数化和添加断言。因为有些接口需要对业务
逻辑或参数格式进行校验,为了能让所有线程数跑起来,需要将数据参数化。
数据参数化有这几种做法:
1、可以将一些固定值改成随机函数;
2、利用 JDBC 从数据库读取数据并关联变量;
3、Excal 数据参数化,
4、动态关联参数化,断言是为了判断用例是否
执行成功,并验证服务器的响应错误率。响应断言常用 json 断言,xml 断言用的最少,
性能测试的目的是为了检验系统能否满足客户的性能需求,若性能需求无法满足时,则
要考虑对系统进行性能调优,一般用排除法:
1、首先考虑网络方面问题:使用 ping 命令查看与目标服务器的连接是否正常、传输速度的快慢。通
过提升服务器的带宽,看响应时间是否相应降低。
2、考虑数据库的问题,可以单独去压测数据库,查看数据库的最大连接数和 SQL 语句的执行时间,
索引命中率和 sleep 等待时间等
3、考虑 Apache/Nginx 等中间件的问题,查看中间件设置的最大连接数是否合理,如果设置的连接
数太小,会话数超过设定的最大连接数时会导致等待时间变长,出现响应超时情况
4、考虑服务器的硬件配置,如内存、CPU、磁盘读写速度等,可以用 top 命令来监控,也可以使用
nmom 工具来监控,nmom 会把监控的数据形成表格形式,方便我们查看。
5、最后考虑开发代码写的好不好,处理时间长不长的问题。
举例:在我之前的公司,我们主要是会考虑用户操作使用比较频繁的模块,比如借贷,充值,投资模92
块,我们一般会通过增加并发数来压测,观察 CPU、mem、磁盘读写、吞吐量和每秒事务数等性能指
标,以前我老大要求我并发 100 个用户,我用 jmeter 把线程数设为 100,永久循环,持续时间半个
小时,设置启动延退 55,在 Linux 启用 mmom 工具监控服务器。
当我运行脚本的时候我看聚合报告 90%的平均响应时间达到了 6s,吞吐量也比较小,用 top 命令监控
资源发现 CPU 差不多到了 100%。于是我用 Navicat 工具通过 SQL 命令 show full processlist 取当
前运行的 SQL 语句,发现有许多语句用的是左关联,在查看了这条 SQL 语句的执行计划发现没有用索
引,再查看了索引的命中率,命中率倒是还行看了下 nmom 生成的报告,发现 CPU 一直是处于爆满状
态,其中主要是 mysql 的占比很大,这个时候我基本上判断数据库的问题。
于是我就照着前面的步骤再次压测,同样还是用 nmom 工具去监控 CPU,mem 网络等状态,这次我
是主要在 Navicat 上用命令去抓取 SQL 语句,还是一样有很多语句都是左关联,并发现很多空连接
(sleep),我就用 show global variable like"wait_time"命令查看了设置的休眠时间(等待时间)
发现时间很长 28800s,然后我就把这个休眠时间改成了 20s,因为 SQL 语句使用了很多左连接,我就
用 show variables like"tables_size"查看了临时表的空间大小、发现临时表只有 16m,我将空间
改成了 1G 再去压测了下,发现 CPU 只是降了 10%左右,nmom 报告上还是显示 mysql 占的 CPU 很大,
然后运行的时候,用 top 命令监控,发现有的时候有很多 mysq 进程同时运行(因为没有设置连接池),
我就用命令查看了下 mysql 的最大连接数,因为 SQL 语句的执行速度还是挺快的,所以就把 mysql
的连接数调小到 50,再去跑了一遍发现 CPU 降到了 40%左右,并且其他的性能指标也都还不错。最后
把聚合报告的数据以及 nmom 的数据整理成性能报告给老大,其实做接口性能主要就是用排除法个一
个去排除,发现性能问题就要先解决了性能问题再压测,不然其他的问题也有可能是这个性能问题导
致的所以接口性能基本上就是观察,各个性能指标都在范围之内就差不多了。