接口自动化
requests库:用来发送http请求,接收http响应
0pytest命名规则:
-
模块名必须以test_开头或_test结尾
-
测试类必须以Test开头,并且不能有__init__方法
-
测试方法必须以test开头
一、安装
pip install requests
二、使用
request对象常用的方法
requests.get()
![](https://i-blog.csdnimg.cn/blog_migrate/960c8dbe510c4add5326499c2e9de63a.png)
requests.post()
data用于传输键值对的字典,{name:"sxp",age:"18"}
无嵌套的使用data
json用于传输json格式的字典,{stu1:{name:"sxp",age:"18},stu2:{name:"haha",age:"19"
}}
有嵌套的使用json
![](https://i-blog.csdnimg.cn/blog_migrate/19be91f5f25dab48096a89b1decfb6f2.png)
files用于传输文件(具体参数可以到requests.post的源码中查看注释)
requests.put()
requests.delete()
requests.request()
-
response对象常用的方法
三、目前企业当中最主流得接口自动化测试技术体系
requests+pytest+allure+yaml+parametrize+config_logging体系
第一个阶段:写接口测试自动化得用例
第二个阶段:写接口自动化的测试框架并且维护这个框架
四、pytest数据驱动
-
概念:把我们的测试用例数据放到excel/yaml/csv/mysql然后通过改变数据而改变测试用例的执行结果。
-
@pytest.mark.paramtrize(args_name,args_value)装饰器
args_name:参数名
args_value:参数值(list,tuple,字典列表,字典元组)
参数的值有多少个,则测试方法就会执行多少次
场景:同一个业务逻辑会存在许多组数据
yml文件:
![](https://i-blog.csdnimg.cn/blog_migrate/37e06e34a89e8a539815c609110cc82a.png)
读取yml函数:
![](https://i-blog.csdnimg.cn/blog_migrate/5dc25e0a3afa117a1ef4c805fffc2abd.png)
parametrize:
![](https://i-blog.csdnimg.cn/blog_migrate/a10c0491fa14aa05a281896e53ae6290.png)
-
使用key来获取数据驱动传入的字典
-
如何传入两个参数?
五、yaml介绍
-
概念:yaml是一个数据文件,保存的时个数据格式,支持注释,换行,裸字符串(最小单位的数据)
-
用途用于全局配置文件:环境,数据库信息,账号信息,日志格式,报告名称用于接口自动化里面的多接口串联用于编写接口测试用例
-
语法规则区分大小写通过缩进的方式来表示层级关系 (不可以使用tab缩进,只能使用空格)和缩进多少层无关,只和左边是否对其有关#表示注释
-
yaml常用数据结构map对象(键值对):dict 如:name:sxp数据(列表list):用以组横线开头(横线后必须有空格)如:name:- sxp- sxp1- sxp2
-
如何读yaml文件yaml.load()
-
如何写入yaml文件yaml.dump()
六、封装
-
封装的原则:能够覆盖到所有的请求情况get:url,params(非嵌套的字典格式)post:url,data,json,filesput:url,datadelete:url其他:headers/cookies
-
post请求的data为文件格式时,需要使用open函数转换为文件流。如:但在yaml中是不支持配置open函数的。所以我们要在封装的requests方法里面对files类型的参数进行同义转换
七、热加载(未做过多介绍,可以自己查一下资料)
-
概念:在代码运行过程中,实时的去调用python的方法并执行得到返回值
八、单元测试框架对比
常见的单元测试框架
-
基于python:unittest和pytest基于java:junit和testng
-
unittest和pytest的区别(1)用例编写规则unittest:提供了testcase测试用例、testsuites测试套件、testfixtures测试夹具、testload测试加载器、testrunner测试运行器。必须遵守以下规则:1、测试文件必须先倒入import unittest2、测试类必须继承unittest.TestCase3、测试方法必须以test开头pytest:是python的第三方测试框架。基于unittest扩展的框架。必须遵守以下规则:1、测试文件名必须以test_开头或者以_test结尾2、测试类名必须以Test开头3、测试方法必须以test开头(2)用例的前置和后置unit test:setUp/tearDown:在每个用例之前或之后运行一次setUpClass/tearDownClass:在每个类运行之前或之后运行一次setUpModule/tearDownModule:在每个模块之前和之后执行一次pytest:方法级:setup_method/teardown_method和setup/teardown两个都是在方法之前和之后执行一次,两个都存在的情况下先执行前者再执行后者函数级:setup_function/teardown_function:在函数之前和之后类级别:setup_class/teardown_class模块级:setup_module/teardown_module装饰器:@pytest.fixture()(3)断言unittest:assertTure、assertEqual、assertIn等pytest:as sert只有一个(4)报告unittest:htmltestrunnerpytest:插件pytest-HTML、allure(5)失败重跑unittest:没有pytest:pytest-rerunfallures插件(6)数据驱动unittest:ddtpytest:@pytest.mark.paramtrize装饰器(7)用例分类执行unittest:默认执行所有,可以通过testsuite来执行部分用例,或者-k参数pytest:@pytest.mark
-
单元测试框架主要做了什么1、测试发现:从多个py文件中收集并且加载测试用例2、测试执行:将测试用例按照一定的顺序和条件去执行并且生成结果3、测试判断:通过断言判断结果是否正确4、测试高高:统计测试进度、通过率、生成报告
![](https://i-blog.csdnimg.cn/blog_migrate/33a0c868f1290db5498c833c01962d82.png)
Unittest
-
定义:单元测试框架,测试程序的最小单元(函数\方法),并且每个函数的方法是独立的
-
框架底层原理:module='__main__’, 测试用例所在的路径 __main__表示当前模块defaultTest=None, 待测试用例的名称,默认是所有argv=None, 接收外部的参数testRunner=None, 测试运行器testLoader=loader.defaultTestLoader, 指定使用默认的测试用例加载器exit=True, 是否在测试完成之后结束python程序verbosity=1, 类似于命令行的-v 0,1,2failfast=None,catchbreak=None,buffer=None,warnings=None,tb_locals=False
-
自动化框架组成部分:单元测试框架pom:页面对象模型Ddt数据驱动全剧配置文件封装selenium二次封装日志监控断言、邮件发送等等
-
重要组件1、TestCase2、TestSuitemain方法unittest.TextTestRunner().run(suite)3、TestFixture4、TestLoader5、TestRunner
-
使用方式:创建类的时候继承unittest.TestCase类
-
运行方式:1、pycharm直接run运行方法2、python -m unittest test.Test.test01命令行输入【文件名.类名.方法名】运行(集成jenkins时比较常用)-m 以二进制脚本方式运行一个模块-v 显示详细执行结果信息-k 匹配模式运行测试用例。 1、通配符-k *_weiwei。 2、-k weiwei3、使用unittest.main(),以模块的方式运行配置pycharm的环境或者使用python 模块名.py
-
用例执行顺序按照ascii码的顺序执行:【0~9 A~Z a~z】
-
忽略测试用例1、@unittest.skip ( "忽略测试用例" )2、@unittest.skipIf (age>= 18 and age<= 25 , "18<=age<=25 的时候会被忽略" )3、@unittest.skipUnless (age< 18 , "age<18时忽略" )如果使用pycharm直接运行的时候没有打印出来skip信息,说明日志级别没有调整。或者使用命令行- v的方式 或者使用main函数配置日志等级的方式: unittest.main( defaultTest = 'suite' , verbosity = 2 )
九、断言
-
断言是测试方法中必不可少的部分1、状态断言:一定要有2、业务断言:可以有多条
-
常用的六种断言
-
实例:访问网页并且保存cookie 跳过验证码登录
十、Cookie
-
定义:cookie是在服务器产生的存储在客户端的一小段文本信息,格式是字典,键值对
-
分类:会话级:保存在内存中当浏览器关闭就会丢失持久化:保存在硬盘,只有当失效时间到了才会被清除
-
查看cookie:打开浏览器- F12-Application-cookies常见字段包含:name、value、domain、path、expires、sizename:开发自定义的cookie名称value:cookie值domain:cookie所作用的ippath:cookie作用的IP所在目录expires:sission---会话级 具体日期---持久化size:cookie大小
-
如何实现鉴权?当客户端第一次访问服务器时,服务器就会产生Cookie,然后通过响应头的方式在Set-Cookie传输到客户端,客户端从2-N词请求都会自动带上这些cookie
-
弱点:cookie保存在客户端,对于一些敏感信息:用户名、密码、身份证。不安全
-
代码实现cookie鉴权
十一、Session
-
定义:当用户第一次访问服务器的时候,在服务器端保存一个sessionid这个sessionid时经过加密的,然后通过cookie把这个sessionid保存到客户端,请求服务器的时候只发送sessionid
-
当使用session鉴权的时候,需要把session设置为全局变量,否则在不同方法中调用的时候会产生不同的session,无法实现功能
-
session鉴权的弱点:虽然解决了cookie的不安全问题,但是又出现了新的问题。sissionid 是保存在服务器的,当用户量特别大的时候会导致服务器崩溃解决方式:请求IP捆绑、session复制、单点登录
十二、token鉴权
-
定义:当用户登陆后给他发送一个token令牌,下一次用户再次请求的时候只需要带上这个令牌。
-
由于token可以通过抓包获取,可以通过加密的方式保证token的正确性和保密性对称加密:DES。AES双钥加密:RSA只加密不揭秘:MD5 SHA
-
token的分类:access_token:有时间限制,限制在15分钟refresh_token:一般15天
-
cookie、session、token鉴权方式的相同点和区别?
相同点:都是用于做鉴权的,都是服务器产生的。
区别:
1、cookie是存储在客户端,session存储在服务器。session安全性比cookie高,所以一般情况下把重要的信息放到session把不重要的放在cookie
2、session存在服务器内存,token存在服务器的文件或者数据库中,token的好处就是比session更节省服务器资源。token只需要在服务器揭秘即可
-
为什么有postman和jmeter还需要做代码级别的接口自动化?
1、敏捷开发,接口量巨大
2、工具太死板,无法自定义一些功能
3、一个项目中有多种协议的接口
4、定位问题,使用工具会比较繁琐
5、工具没有办法生成美观的报告
6、对于复杂的接口,多接口串联和数据库操作使用工具不方便
7、日志监控
十三、POM
-
为什么要引入POM可以让我们的测试代码变得可读性更好,可维护性更高,复用性更高
-
定义:页面对象模型(Page Object Model)是一种设计模式,用来管理维护一组web元素集的对象库在POM下,应用程序的每一个页面都有对应的page class每个page class维护着该web页的元素集和操作这些元素的方法page class中的方法明明最好根据其对应的业务场景进行,例如:通常登陆后我们需要等待几秒钟,可以这样命名waitingForLoginSuccess()POM的代码目录组织示例:
-
优势:1、提供了一种在UI层操作、业务流程与验证分离的模式,使得测试代码变得更加清晰和高可读性2、对象库与用力分离,使得我们更好的复用对象,甚至能与不同的工具进行深度结合应用3、可复用的页面方法代码会变得更加优化4、更加有效的命名方式是我们清晰的知道方法所操作的UI元素。