车载自动化项目:Python
作者:mmseoamin日期:2024-02-06

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()

车载自动化项目:Python,第1张

反向排序(降序)--a.sort(reverse=True)

车载自动化项目:Python,第2张

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。