json 本质上还是字符串,只是按 key:value 这种键值对的格式来的字符串,
json和python中的字典的相互转化可参考下边文章
json和字典的相互转化
自动化测试中,测试数据如何管理?
首先要做好充分的调研,明确自动化的测试目标,以及他要解决的问题,在设计框架的时候主要关注以下几个因素,
1.合理模块化(是指我们需要合理的分层封装,常见的是我们的数据和业务的一个分离,提高代码的复用率)
2.低耦合(低耦合各个模块各个类之间的耦合度不要太高,方便后期维护)
3.可维护、可拓展、可移植(可扩展性是指在框架设计的过程当中,咱们要预留入口方便后期进行功能升级)
可移植性(是指我们在自动化设计时使用的语言,应该使用跨平台的语言方便部署)
可维护性是指要有合理的方案设计,完整的日志系统以及清晰的代码注释
参数化的意义就在于,当我们把用例代码编写完成之后,我们只需要设计用例相关的测试数据以及维护就可以了
我们可以准备非常多组的测试数据,但是我们的用例代码只需要一份,接口自动化测试中,excel管理我们的测试用例相关的数据
比如说用openpyxl来处理excel,那我们在python自动化测试中,如果你是unittest框架的话,可以使用ddt来获取我们的参数化,当然如果你是pytest框架,可以使用pytest本身自带的参数化方式
位于用户与目标服务器之间,用户直接访问反向代理服务器就可以获得目标服务器的资源,使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率
变量引用的数据类型,如果在更改值的时候没有开辟新的内存,那么说明他是可变类型,反之如果在更改值的时候开辟了新的内存,那么说明他是不可变类型,在python常见数据类型当中比如像数字类型,字符串类型,布尔值类型都是不可变的类型,像列表,字典这种这种是可变类型
1.作用域不同,全局变量作用域是整个程序,而局部变量的作用域是函数内或者循环内部
2.生命周期的不同,全局变量的生命周期是跟主程序是一起的,主程序销毁呢全局变量也就销毁了,局部变量是函数退出或者循环退出的时候呢就不存在了
3.使用方式不同,全局变量在程序的各个部分都是可以直接使用的,而局部变量只能在函数内部或者说循环内部去使用,
在函数内部我们优先使用局部变量,然后再去使用全局变量
自动化测试的目标还是在手工点点点以外去利用代码完成测试工作从而提高测试效率,而测试开发呢就是在自动化测试以外呢我们可能需要开发一些小工具、小平台来辅助功能测试以及自动化团队提升效率,可能还需要针对目前开源的平台做二次开发,测试开发相对于自动化测试而言需要掌握更高的编程能力以及需要掌握开发能力
是因为文件对象实现了上下文管理协议,主要实现了两个方法,第一个是进入 _enter_(),第二个就是_exit_()退出_enter_方法主要是将with之后返回的对象绑定到as后的变量,那么_exit_()退出方法在这里主要实现的就是我们资源的关闭
1.application/x-www-form-urlencoded
2.multipart/form-data
3.application/json
4.text/html
5.text/xml
6.text/plain
7.application/xml
框架的分层:
自动化测试框架怎么去设计?
自动化测试框架比较多,接口、web、app都是,那么一般来讲在工作中都是根据分层设计思想来独立设计几个模块
第一个模块,主要是存放通用的框架代码,比如说excel操作,数据库操作,basepage封装,日志操作的封装等这些
第二个模块,主要是用来存放测试用例,和测试逻辑相关的代码
第三个模块,主要是用来存放测试数据
第四个模块,一般会有一个入口文件用来进行收集测试用例,执行测试用例和生成测试报告
前置条件, 测试用例执行之前都会执行的代码,主要是进行测试前的初始化工作,比如在接口测试前面做一些前置的参数赋值,数据库操作等等
后置条件,测试用例执行之后会执行的代码,是测试后的清除工作,比如参数还原或销毁,数据库的还原恢复等
通过第三方库openpyxl来操作excel表,
代码的基本常用操作如下:
findElement,查找页面的某个元素,返回的是一个对象,
findElements他主要是在页面当中去查找符合条件的所有元素,他返回的一般是个列表,
我们单独会去维护一个数据表,这个数据表的格式可以是excel或者是yaml或者是数据库,
然后我们通过这个数据表里面的数据和我们的测试代码的进行隔离,这样的话,我们可以
同时分开去维护测试数据和测试脚本,然后呢我们通过参数化的手段把这个数据和脚本连接到一块
1.一个用例为一个完整的场景,从用户的登录到最后的退出,
2.就是一个用例呢验证一个功能点,不要试图在登录系统后把所有的功能点都验证完成
3.尽量少的编写逆向逻辑用例,主要是因为1.逆向逻辑用例会比较多,2.复杂的逆向逻辑用例它实现比较麻烦,而且容易出错
4.用例与用例之间尽量避免依赖
5.一条用例完成之后需要对测试场景进行还原以免影响其他用例的运行
是通过装饰器@pytest.fixture方式来实现,一般是定义一个函数,在这个函数内部呢,用过yield关键字来区分前置和后置
主要是实现了http请求,在测试领域主要是用来做接口测试,request库首先它封装了各种请求像get、post、delete和put等,
以关键字参数的方式呢,封装了各种请求参数,像params是用来做get请求,那其他的像delete、post的这些呢就是在data字段里面
header字段呢代表的是请求头,response分装了响应内容,比如像status_code,它代表的是响应状态码,那text代表的是响应的响应体
最后request还有一个session对象,如果项目是cookies建成,那么你用session对象就会自动传递
1.可能是元素还没有出现,页面加载过慢,所以呢需要加等待时间
2.是元素在iframe当中,需要切换到iframe再操作
3.元素是动态元素定位方式呢需要优化
4.识别到了元素但是不能够操作,比如说元素不可点击不可用等需要用js呢把前置的操作完成
1.是要确认哪些业务功能可以拿出来做自动化测试
2.根据项目本身特色去选择对应的测试框架或者测试工具,并搭建对应的自动化测试环境
3.第三步呢就是着手编写自动化测试用例并且调试
4.就是执行测试用例并得到对应的一个结果当然这个时候我们需要确认断言的正确性
5.在编写到一定量的自动化用例之后我们需要考虑优化用例以及优化执行效率,加入持续集成,可以定时执行定时通知,定时生成报告
1.打算做哪些类型的自动化,是接口呢还是UI,为什么要做这个,可以解决什么问题
2.打算做多久分为几个阶段来做
3.几个人一起做,
4.选择什么样的技术来做或者工具,选择他的理由是什么
5.会遇到哪些问题或者风险需要什么样的协助或者资源
6.最终的成果是什么样的,可以达到一个什么样的效果
1.界面上无法预测的弹框,比如说版本更新消失这些
2.页面元素的动态变化这个问题可能是由于需求变更引起的,产品会根据当前用户状态去呈现不同的内容
3.随机页面延迟造成控件识别失败,这个可能由于网络环境以及设备状态等其他元素引起的
4.测试数据的变更,UI用例呢步骤差距是比较大的,如果我们的测试数据发生变化,而我们自动化脚本没有同步变更的话也是会造成问题
1.就是优化我们的测试用例,比如在等待方面的话,我们可以多用显性等待,少用sleep和隐性等待
2.减少不必要的操作步骤,比如要经过三四个页面才能到达 我们测试的页面,那我们直接可以通过网站直接访问到
3.中断页面加载,如果加载的内容不影响我们的测试呢,我们可以设置超时时间
在稳定性提升方面呢
1.就是要减少测试用例的复杂度和耦合度
2.就是在编写元素定位的时候呢尽可能用更加灵活的定位方式
3.我们在设计测试用例的时候,如果说是前置和后置,可以通过接口和数据库来处理的那么我们就用这样的方式
自动化的本质还是测试不过是利用自动化的技术手段来代替部分手工的一个测试工作,
首先呢,自动化测试用例本质上是源于我们功能测试的用例,同样的包含了前置、后置 ,步骤以及断言
其次呢自动化测试用例在用例设计原则上与功能测试都是一样的,当然他们也有不一样的地方,自动化测试需要解决以下这些问题,
1.是环境依赖问题,比如手工测试的时候呢,如果我们的前置条件不满足,我们是可以手工去准备的,但是在自动化里面你需要用代码
或者其他手段去提前准备好,而不能等到执行的时候再去手工准备,
2.自动化的用例断言要非常明确,我们要将手工测试看到的期望结果转成代码来实现
3.自动化测试用例执行需要考虑重复执行的时候呢不受到其他环境数据或者用例的影响
Pytest是第三方库,unittest是内置的标准库,那pytest相对于unittest来讲呢他在使用上更高效更灵活,首先pytest的有丰富的插件其次pytest的夹具在处理前置后置的时候呢更加的灵活,最后呢pytest提供了mark,可以给用例打标记,那么在过滤用例也是很方便的
首先是从登录接口的响应结果当中提取token,提取的方式可以是jsonpath或者用正则表达式,其次提取出来之后,可以将token设置为全局变量可以用一个类来承载全局,也可以用一个文件(py文件)来承载全局变量,最后呢要看一下在查询接口当中token是放在请求头当中还是请求体当中,可以从全局变量当中读取进来,然后存放到对应的位置
在我的框架当中采用的是数据驱动模式,所有与测试用例相关的测试数据全部都是存放在excel当中,在excel当中呢,专门开辟了一系列用来做数据库断言比对,他是一个列表形式,在列表当中呢存储的主要就是字典,每个字典涵盖了3个key,一个是sql语句,第二个是切换结果,第三个是sql查询方式,在框架当中专门封装了一个数据库断言的方法,在这个方法里面呢会去建立一个列表,会将列表当中的每一个sql语句,去执行并且与期望结果相等,这样子的话既能够支持一条sql语句的比对也能支持多条sql语句的比对
大体的原则就是减少实现的成本时间和复杂度,
重复的 不变的 规范的
在selenium中直接去调用 js 的scrollto 方法就可以实现窗口滚动了
一般不需要进行全部校验,只需要校验关键的参数就可以了
第一种方式可以通过json数据的路径一步一步的解析
第二种我们可以通过jsonpath这种表达方式去断言
在用例执行之前加前置条件然后呢通过异常捕获这种形式去进行处理
Error通常来说表示的是不期望程序能够处理的异常,像系统级的一些内存溢出这样的情况,程序是无法去处理的,而Exception主要表示的就是以期望或者是程序能够捕获的异常
当我们一个浏览器里面打开了多个标签页的时候close这个方法表示关闭当前标签页,如果在浏览器整个执行过程当中只打开了一个标签页,那么close会把整个浏览器的窗口都关掉, 而quit方法是直接把这个浏览器都关掉,不管是存不存在多个标签
前后端联调完成以后我们可以进行接口的手工测试,当进入了集成测试以后,我们可以进行接口自动化测试,当功能测试完成以后,产品结余稳定呢,我们就可以渐渐引入UI自动化测试,自动化测试主要是提升回归测试效率
对于那些用例逻辑只有测试数据不一样的这些用例呢我们可以把所有的测试用例单独提取出来,存放到excel或者是yaml这样的文件中,然后通过参数化的方式去实现或者生成对应的测试用例,在python当中的unittest框架当中,我们可以使用DDT这个模块去实现数据驱动或者是参数化,在pytest的这个框架当中,它自带了一个实现参数化的装饰器,也可以用来实现数据驱动
首先你需要去确定在这个接口里面传递参数使用的是什么样的类型,如果参数传递是使用的查询字符串的方式的,那么我么可以通过params参数传递,如果在接口当中我们使用的是json格式传递数据,我们可以使用json关键字去传递参数,如果还有其他的方式,你需要上传文件,我们可以指定在files这样一个关键字里面去传递你的文件,另外我们可以去使用data 这个关键字传递,另外请求格式的数据比如说form表单当你使用form表单去传递数据的时候,我们默认是使用data参数,当然我们可以通过去指定contentype这样的类型,通过data参数也是可以传递json数据的