1. 自动化测试用的什么框架?
第一种:Python+Selenium+uittest框架
首先是拿到需求文档,基于这个需求去进行搭建。
用pytest+request+allure 这些第三方库进行编写自动化脚本。
举个例子一般的话整个的一个自动化的搭建是分为6层嘛:
第一层:会去做一个公共层,里面去放一些方法,像可调用的公共函数、数据库之类的。(这些函数是放在yaml文件,存放一些数据库地址,还有URL路径还有业务中会用的比如车辆车型还有用户名密码这一些)
第二层:会做一个配置层,然后配置一些像config这样的yaml配置文件,log配置文件,环境配置文件,数据库的配置文件,里面会放一些路径,像我们业务当中会用到的一些密码信息之类的
第三层:数据层,里面会放一些比方说一些excle 表格
第四层:用例层,比方说云端升级任务。任务有分为手动、自动、预约。还有像任务的审核,审核之后下载,下发任务等。包括一些异常场景都在这个用例层里面。
第五层:主函数,就是调用以上分层里的方法实例。去执行这个测试用例吧。
最后就是报告层:生成一个allure 的报告大致就是这个样子。
第二种:如何介绍自动化项目
在面试过程中,要向面试官讲解自己做过的自动化项目。如何介绍,下面简单说下
可以参考:
面试官你好,最近我做的xxx项目中有接口自动化部分,下面简单给您介绍一下:
1.使用的技术主要是 Python + Pytest + Requests + CSV +pytest-html。
a.主要使用Python编程语言实现,
b.Requests 库主要用来模拟发送接口请求
c.Pytest 主要用来维护接口自动化测试用例。
d.CSV模块主要用来进行数据驱动(数据驱动也可以使用Excel文件,Excel文件使用 Openpyxl 库来操作)
e.pyhtml-html主要用来作为测试报告
2.另外在接口自动化也要处理接口的上下游传参
a.我在接口上下游传参的接口主要操作:
i.先定义字典格式的数据。
ii.在上游接口中编写用例,用例通过之后给字典赋值。
ii.在下游接口中引用字典中的字段值。
b.主要通过字典的方式继续上下游传参。
3针对单接口进行参数化处理的时候,主要使用 csv文件数据驱动
a.首先将测试数据保存到csv文件中
b通过Python的csv模块来读取csv文件中的内容
c借助pytes模块中的参数化功能进行数据驱动。
4.最后,自动化代码完成之后,将代码存放在公司的git服务器上,搭建Jenkins 平台,从Jenkins平台上运行接口代码,代码运行完成之后,通过Jenkins会自动发送邮件到公司邮箱。如果接口出现问题,可以第一时间收到通知。
以上就是我最近项目中使用的自动化。简单概括就是使用 Python+pytest+requests+Jenkins实现接口自动化平台的搭建。
3.python有哪些数据类型?
答:有基本数据类型和集合数据类型两种,基本数据类型有数字型(int,float,complex),字符串,布尔型;集合数据类型有列表,元祖,字典,集合。
4.列表和元祖的区别是什么?
答:共同点:访问数据,都是通过索引访问,都可以存放各种类型的数据
不同点:定义上---列表是[](中括号);元祖是()圆括号
使用上---可对列表进行增删改,元组不允许修改。
5.怎么把一个元祖转换为list?
答:python 把元组转为列表的方法是在元组前面添加list
list_a = (1, 9, 10, 6)
print(list_a) # 打印结果 (1, 9, 10, 6) 元组是带小括号的
list_b = list(list_a)
print(list_b) # 打印结果 [1, 9, 10, 6] 列表是带中括号的
6.List你怎么正向排序和反向排序?
答:正向排序(升序)--a.sort()
反向排序(降序)--a.sort(reverse=True)
7.列表和字典的区别是什么?
答:1.列表是有顺序的,如果按照某种顺序向列表添加元素,这些元素就会保持顺序;字典是无序的,如果向字典添加内容,显示的顺序可能会和添加的顺序不同
2.列表中的元素是使用索引访问的,而字典是使用键来访问的
8.Python循环体里面break和continue有什么区别?
答:break--在for循环或者while循环结构中使用break语句,用于结束整个循环
continue--在for循环或while循环结构中使用break语句,用于跳过本次循环中的剩余语句,然后继续进行下一轮循环
9.Pycharm的自动化脚本的流程是怎么样的?
首先根据需求文档,确定做自动化的内容,在具体编写自动化测试用例前,我们需要建一个测试类继承unittest(就内泰斯特)里面的TestCase类,继承这个类之后我们才是真正的使用unittest(就内泰斯特)框架去写测试用例,编写测试用例的步骤如下:
1)首先导入unittest(就内泰斯特)模块
2)再就是创建一个测试类,并继承unittest.TestCase()
3)然后用setup()(斯塔普)和tearDown()函数来定义初始化工作和收尾工作
4)其次中间定义测试方法,方法名必须以test_为前缀
5)再就是在用例中添加断言判断来判断运行结果
常见的断言:assertEqual(a,b)-断言a和b是否相等,相等则测试通过
assertNotEqual(a,b)-断言a和b是否相等,不相等则测试用例通过
assertTrue(x)-断言x是否True,是True则测试通过
assertFalse(x)-断言x是否False,是false则测试通过
assertIs(a,b)-断言a是否是b,是则测试通过
assertNotIs(a,b)-断言a是否是b,不是则测试通过
assertIn(a,b)-断言a是否在b中,在b中则测试通过
assertNotIn(a,b)-断言a是否在b中,在b中则测试通过
6)最后使用HTMLTestRunner来生成测试报告,分析运行结果
10.在python数据型中,哪些可以切片处理呢?
答:python中符合序列的有序序列都支持切片,例如列表,字符串,元组。
11.如果我要将一个12345678的字符串通过切片倒过来显示输出需要怎么弄?
格式:[start:end:step]
start:起始索引,从0开始
end:结束索引
step:步长,步长为正时,从左向右取值。步长为负时,反向取值
注:切片取值是顾头不顾尾;切片的步长默认为1,不可为0
答: a=’12345678’
print(a[: : -1])
12.有大概统计过自己写个多少个自动化测试脚本吗?
一般是功能测试模块的10%-30%
我们那个项目写的自动化测试脚本写的比较少,我负责的模块写了50个
13.深拷贝以浅拷贝
一个对象有对象父级和对象子级中如果嵌套了其他类型
内部元素的type为number、str、tuple(不可变类型)类型的,改变其中的值,浅拷贝和深拷贝始终不变
内部元素的type为list、set、dict(可变类型,改变其中的值,浅拷贝地址值会变,深拷贝地址值不变
浅拷贝只会将父类复制到新的储存空间,子类的地址值使用原对象子类的地址值
深拷贝会将父级和子级全部复制到对应的新的储存空间,与原对象互不影响
14. setup 、teardown怎么用
setup和teardown是用来处理用例的开始前工作和结束后的工作
setup_module;teardown_module;(模块级别的,优先级最高)
最先执行的前置或者后置,且在整个 *.py 文件执行时只执行一次
setup_function;teardown_function;(不在类中)
只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次
setup_class;teardown_class;(类级)
在类中运行的前置或者后置,只运行一次
setup_methond;teardown_methond;(方法级)
在类中每条用例前后运行的前置或后置,每条case分别运行一次
setup teardown (在类里面的)
既可以在类中运行,也可以在类外运行,每条用例前后分别执行一次
15.怎么理解装饰器///装饰器的原理
装饰器本身是一个函数\方法,它的入参和返回结果也是一个函数\方法。被标记的方法是装饰器的入参,装饰器会对这个方法进行功能改造返回一个新的方法,最后执行的就是这个新的方法。
16.测试固件(测试夹具)的作用域和使用方法
@pytest.fixture(autouse=True):声明固件时设置
@pytest.fixture(autouse=True):声明测试固件,并在要使用固件的用例中以参数形式传入固件(beanshell)
@pytest.fixture(autouse=True):声明测试固件,并对要使用固件的域用装饰器进行标记
@pytest.mark.usefixtures('beanshell')
function: 函数级,每个测试函数都会执行一次固件;
class: 类级别,每个测试类执行一次,所有方法都可以使用;
module: 模块级,每个模块执行一次,模块内函数和方法都可使用;
session: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。
17.怎么做数据驱动
就是在测试的时候,我们用的这些测试脚本和测试数据是分离管理的,使用文件存放测试数据(比如我经常使用的是excel),然后封装好一个加载测试数据的方法,在测试脚本中调用该方法获取测试数据,并对需要做数据驱动的测试方法用@pytest.mark.parametrize()(婆ruai母翘以斯)进行装饰,该测试方法就会在测试数据的驱动下重复执行,有多少条测试数据,该测试方法就执行多少次
1.定义:用测试数据驱动测试方法的执行,有多少条测试用例,测试方法就执行多少次
2.对测试方法进行装饰:@pytest.mark.parametrize('data',testdata)
18.最常用的第三方库有哪些
1)xlrd、xlwt 2)pymysql 3)requests 4)pyyaml 5)pytest 6)allure-pytest
19. pytest装饰器
pytest装饰器
跳过不执行 @pytest.mark.skip( )
有条件跳过 @pytest.mark.skipif( )
标记测试方法为失败 @pytest.mark.xfail( )
标记测试用例的执行顺序 @pytest.mark.run(order=3) 需要安装:pip install pytest-ordering
对测试失败的用例进行重试一共重试3次,每次间隔2秒 @pytest.mark.flaky(reruns =3 , reruns_delay=2)
需要安装:pip instal
20.使用pytest生成测试报告
使用pytest生成测试报告
1安装测试报告所使用的第三方库:pip install pytest html
2运行测试用例并生成测试报告:pytest.main(['-vs','./test_pytest_251.py',
'--hum]=../report/result.htmI'])
21.使用allute生产测试报告
使用allute生成测试报告
pytest.main(["--alluredir"/report/allure_ison''_-clean-alluredir''/T)
1 -alluredir:使用allure运行测试用例
2 ./ report/allureison:定义运行结果数据存储的位置(json格式的结果)
3. -clean-alluredir:每次执行前先清除历史数据
4 ./:运行当前文件所在路径下的所有测试模块
os.system ('allure generate report/ allure_json -o report/allure_report --clean'
- 将json格式的结果数组装成html格式
22.常见的异常
NameError
IndexEttor:下标越
TypeError
ValueError
KeyError
ZeroDivisionError: 被除数为0
异常从高到低 OFF. FATAL. ERROR, WARN, INFO, DEBUG. TRACE, ALL
23.方法与函数的区别
1. 方法是写在类里面的函数,函数是直接写在python模块里面的
2. 方法只能被类的对象调用,函数可以被导入到其他任意模块,无条件的调用
3. 方法的第一参数要写self 《赛额复》
4. 私有方法只能在当前类中被调用,类的对象无法调用
24.继承
一个类继承另一个类的属性和方法,子类的实例可以访问父类的属性和方法
25.方法重写(方法覆盖)
如果从父类继承的方法不能满足子类的需求,可以对其进行改写。这个过程叫方法的覆盖(override)也称之为方法的重写,子类的实例调用该方法时调用的是重写之后的方法,父类的实例调用这个方法时,调用的是原方法,多个父类有同名方法时,继承时写在前面的父类的方法的优先级高
26.xlrd
Path=”../路径“
file=xlrd.open_ workbook(path) #创建文件对象
sheets= file.sheet_names0 #茯取该文件的所有sheet,以列表返回
sheet1=file.sheet_by_index(0)#通过下标选取要读取的sheet
sheet2=file.sheet_by_name('name')#通过名称选取要读取的sheet
name = sheet.name #获取sheet的名宇
nrow=sheet1.nrows #获取当前sheet的总行数
ncol=sheet1.ncols #获取当前sheet的总列数
data_row=sheet1.row_values(rowx, start_colx=0,end_colx=None)#读取某一行
data_col=sheet1.col_values(colx, start_rowx=0, cnd_ rowx=None)#读取某一列
data_cell= sheet1.cell_value(×, y). value#读取某一个单元格的值
27.pymysql
conn = pymysgl.connect(host,user,password,database)#获取连接对象
cursor = conn.cursor( ) 创建游标
cursor.execute(sql) 执行sql
cursor.fetchone( ) 获取查询结果的一条数据
cursor.fetchall( ) 获取所有查询结果
conn.commit( ) 提交(增删改之后都妥提交)
cursor.close( ) 关闭游标
conn .close( ) 关闭连接
conn .rollback( ) 发生错误时回滚
先关闭游标,再关闭连接
28.pytest
文件名以test_*.py或*_test.py
类要以Test开头,不能包含_init_方法
以test开头的方法
如果类不以Test开头,类中的方法即使是以test开头也不会执行
运行该模块下所有的测试用的
pytest.main(["./ test pytest_01.py"])#运行指定模块
-s-v-g 命令参数
#运行指定模块,
-V是详细信息模式,输出更详细的执行用例信息
pytest.main(['-s', './ test_ pytest_ 01-Py'])
#运行指定模块,-q是静默模式,只显示运行结果
pytest.main([‘-q','./test_pytest_01.py'])
#运行指定模块,
#-s是显示用例中的打印信息和日志信息
Pytest.main(['-s','./test_pytest_01.py'])
29.测试夹具
fixture概念和作用
1 fixture是pytest 用于在测试前后进行预备、清理工作的代码处理机制。
2fixture优势
fixrure相对于unittest中的setup和teardown来说有以下几点优势:
1. fixure命名更加灵活,局限性比较小;
2. conftest.py 配置里面可以实现数据共享,不需要import就能自动找到一些配置;
3. scope=”session”可以实现多个py跨文件使用一个session来完成多个用例。
Fixture是pytest精髓所在,就像unittest中的setup和teardown一样,但相对之下它的功能更加强大和灵活。
(详解)试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,
但是fixture却可以解决这个问题
不需要会)用return返回初始化浏览器,return后面的后置条件不会执行,因此需要将return改成yield,后置条件就会被调用执行。
Yield是Python中的一个关键字,表示生成器。测试夹具的前置条件遇到yield时返回一个结果,然后将测试夹具挂起,
转而去执行测试用例,最后回来测试夹具中执行后置条件。Return和yield后面可以不写任何返回值,
表示空没有数据返回
30.常见的配置文件的格式
yaml文件;.properties文件(扑扑替斯);.ini文件;.json文件;.xml文件
31.sql注入
就是通过把SQL命令插入到Web表单递交或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
防止SQL注入的方法和理念:
1:永远不要信任用户的输入
2:永远不要使用动态拼装SQL
3:不要使用管理员权限
4:密码要加密
32. log是什么,log的级别,log的作用
og是什么:是详细的记录程序运行过程的文件
log的级别:error(爱柔)错误;warn(物嗯)警告; info信息;debug调试
log的作用:方便找到BUG
Log.v 的调试颜色为黑色的
Log.d的输出颜色是蓝色的
Log.i的输出为绿色
Log.w的意思为橙色
Log.e为红色,可以想到error错误
33. pytest框架下文件、类、方法的命名规范
文件名以test_.py开头
以Test开头的类,不能包含__int__方法
以小写的test开头的方法
如果类不以Test开头的类,即使类里面的方法是test开头也不会执行(默认的是这样,可以自定义更改)
34.最常见的断言
assert == ;
!= ; <= ; >= ;
is True; is not True ;
is Flase ; is not Flase ;
in ; not in ;
35.用过哪些装饰器(pytest,allure)
Plaintext
@allure.severity('blocker')
@allure.epic(爱呸克)("总描述")
@allure.feature(费切)("测试模块描述")
@allure.story(斯刀锐)("测试描述")
@allure.parent_suite(拍润特,斯锐迟)("上海车进科技信息有限公司-Demo1")
@allure.suite(斯锐迟)('上海车进-注册登录')
@allure.sub_suite('登录')
@allure.description(第斯克瑞斯)("描述内容的意思")
@allure.title(抬头)("用例名称")
@allure.severity(斯歪瑞情)('blocker'):(用例等级)
等级severity_level介绍
blocker:阻塞缺陷(功能未实现,无法下一步)
critical:严重缺陷(功能点缺失)
normal:一般缺陷(边界情况,格式错误)
minor:次要缺陷(界面错误与ui需求不符)
trivial:轻微缺陷(必须项无提示,或者提示不规范)
36.如何生成测试报告
pytest自带的测试报告不够优美,我们使用allure生成最终的测试报告
37.自动化测试框架的搭建
a. 简历: 基于python + pytest + request + allure 编写接口自动化脚本
b. 安装pytest、request、allure
c. 配置配置文件:log配置文件,环境配置文件、数据库配置文件
d. 封装工具类和方法:http请求的工具类、数据库操作的工具类、测试数据读取的工具类……
e. 对业务中常用的一些操作进行封装
f. 开发测试脚本
g. 组装测试套件(suit),生成allure测试报告
38.python的定位方式?
答:有八种,分别是by.id,by.name,by.class name,by.tag name,by.link text,by.partial link text,by.xpath,by.css selector。我常用的有id,name,class name,link text,xpath。