自动化测试总结一
-
自动化测试:
什么是自动化?
由机器设备代替人工自动完成指定目标的过程
为什么要自动化?
减少人工劳动力,提高工作效率,产品规格统一标准,规模化
怎么完成自动化?
使用软件或脚本代码完成自动化执行过程。
自动化测试?
让程序代替人工去验证系统功能的过程。
自动化测试分类?
开发周期: 接口自动化测试<灰盒测试>, UI自动化测试<本质是功能测试,属于黑盒>, 单元自动化测试<白盒测试>。 测试目的: 功能自动化测试<黑盒测试> 性能自动化测试<灰盒测试>。
自动化测试框架?
自动化测试组针对一个项目开发的一个代码框架,这个框架封装了很多基础模块,报告模块等等。
自动化测试能解决什么问题?
解决:回归测试的重复性高的问题。 结局:压力测试的多用户测试不好实现问题。 解决:兼容性测试的测试条件多,手工执行效率差的问题。
自动化测试的作用:
提高测试效率,保证产品质量。
自动化测试优缺点:
优点: 较少时间内运行更多测试用例,自动化脚本可重复执行,减少人为错误,克服手工测试局限性。 缺点: 不能替代手工测试,不是一定比手工测试厉害,不能发掘更多的bug,不适用所有的功能。
什么项目适合自动化测试?
需求稳定,不频繁变更,项目开发周期长,需要频繁回归测试(UI自动化最大的应用场景)
-
自动化测试分类详解:
单元测试化框架:
Java中的Junit 和 TestNg Python中的UnitTest 和 Pytest
什么是单元测试?
单元测试是指在软件开发中,针对软件的最小单位--函数、方法--进行正确性的检查测试。
单元测试框架主要做什么?
测试发现:寻找测试用例 测试执行:按照顺序和规则执行测试用例 测试判断:通过断言预期结果和实际结果的差异 测试报告:统计测试进度,耗时,通过率,生成测试报告
接口自动化测试?
接口测试:对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制过程,以及相互逻辑依赖关系。 接口自动化测试过程:针对服务器,使用脚本代码,模拟客户端向服务器发送请求,借助断言自动检验服务器发回的响应数据是否符合预期。
接口自动化测试框架?
工具实现:Jmeter,Fiddler,Postman+Newman+Git+Jenkins 代码:Python+Requests+Pytest/UnitTest+Allure+Jenkins
接口测试流程?
1.分析需求,产生需求文档 2.开发产生接口文档,测试解析接口文档 3.产生测试用例(送审) 4.执行测试用例: 工具:Postman,Jmeter 代码:Python + Requests + UnitTest/Pytest 5.提交、跟踪缺陷 6.生成测试报告 7.(可选)接口自动化持续集成
UI自动化测试?
UI自动化测试:通过代码或工具对软件项目的界面进行的测试过程。 开始阶段:功能测试完毕。/与功能测试同步实现(要求公司具备自动化测试组)
UI自动化测试框架?
Pytest+Selenium
-
主要使用框架和软件:
Pytest:
Pytest模块: Pytest常用插件: pytest-html:生成html格式的自动化测试报告 pytest-xdist:测试用例分布式执行,多CPU并发 pytest-ordering:用于改变测试用例的执行顺序(默认从上到下) pytest-rerunfailures:用例失败重跑 allure-pytest:美化默认的html测试报告 Pytest前后置(夹具)://也可以通过@pytest.fixture()装饰器来实现 def setup() <方法前执行> def teardown() <方法后执行> def setup_class() <类前执行> def teardown_class() <类后执行> @pytest.fixture(scope="",params="",autouse="",ids="",name="") def my_fixture(): print('这是前后置方法') Pytest常用标记://置于使用该标记的方法上方 @pytest.mark.run://使用run标记修改默认执行顺序 @pytest.mark.skip(reasom="")://无条件跳过执行 @pytest.mark.skipif(condition Expression,reason="")://根据条件判断是否跳过 @pytest.mark.自定义冒烟标记://实现分组分模块执行 Pytest执行模式: 主函数模式执行:根据路径范围及参数列表执行测试用例 命令行模式执行:根据命令,参数列表和路径范围执行测试用例 pytest.ini核心配置文件执行:pytest运行时,根据核心配置文件顺序执行 Pytest核心配置文件:一般放在项目的根目录,无论哪种执行方式,都会先读取该配置文件
Requests:
Requests模块:用来发送http请求以及接收http响应的python第三方库,主要用于接口自动化测试。 Requests库常用的请求方法<Restful风格>: request.get():url是接口地址,params用于传输参数。常用于'查询'请求。 request.post():url是接口地址,data用于传输参数,也可以使用json进行参数传输。常用于'添加'请求。 data与json传输请求参数主要差异,取决于请求头中的Content-Type类型。 request.put():常用于'修改'请求。 request.delete():常用于'删除'请求。 requests.request():根据类型参数,封装以上四种请求。 Requests库的响应体解析: response.json():获得返回数据的字典格式 response.text():获得返回数据的字符串格式 response.content():获得返回数据的bytes字节类型 response.status_code:获得返回状态码 response.reason:获得返回状态信息 response.cookies:获得cookie信息 response.headers:获得响应头 response.request.xxx:返回请求数据的参数:请求头/请求类型... Requests库的数据格式: json.loads():把json字符串格式转换为dict字典格式 json.dumps():把嵌套的dict字典格式数据转换为json数据格式 ##get/post/put/delete都是调用requests.request()方法,而requests.request()方法调用的是session.request()方法。这表明,可以通过一个session去转发多个请求,同时绕过cookie鉴权。
Selenium:
Selenium:自动化测试工具,主要做WEB项目的自动化功能测试 Selenium配合浏览器驱动,实现自动化过程中,浏览器对象的生成,以下所有内容在浏览器对象生成的基础上实现。 Selenium中的webdriver模块负责实现元素定位: 属性:属性值-> id,name,class_name 标签名-> tag_name 超链接元素-> link_text,paratial_link_text 路径定位-> Xpath 选择器定位-> CSS 通过调用Selenium的API可以实现的浏览器操作:<driver:实例化生成的浏览器对象> driver.maximize_window(): 最大化浏览器窗口->模拟浏览器最大化按钮 driver.set_window_seize(width,height): 设置浏览器窗口大小->宽、高(像素点) driver.set_window_position(x,y): 设置浏览器窗口位置 driver.back():模拟浏览器后退按钮 driver.forward():模拟浏览器前进按钮 driver.refresh():模拟浏览器刷新 driver.close():关闭当前窗口 driver.quit():关闭浏览器驱动对象->关闭当前浏览器的所有窗口 driver.title:获取页面的title driver.current_url:获取当前页面URL 通过Selenim中浏览器的定位方法driver.find_element()获得元素elsement,以下操作在获得元素对象基础上执行: element.size:返回元素大小 element.text:返回元素文本 element.get_attribte('xxx'):获取属性值,传递的参数为元素的属性名 element.is_displayed():判断元素是否可见 element.is_enabled():判断元素是否可用 element.is_selenctd():判断元素是否选中->用于复选框或单选按钮 通过Selenium中的ActionChains类和Keys类模拟鼠标和键盘操作: action = ActionChains(driver): 给当前浏览器driver绑定一个鼠标对象 action.context_click(element): 模拟右键点击效果 action.double_click(element): 模拟鼠标双击效果 action.drag_and_drop(sourceElement,targetElement): 模拟鼠标拖动效果 action.move_to_element(element): 模拟鼠标悬停效果 action.perform(): 此方法用来执行以上所有鼠标操作 ## username:假设为一个输入框元素: username.send_keys(Keys.BACK_SPACK):按删除键一次 username.send_keys(Keys.CONTROL,'a'):组合键Ctrl+A -> 表示全选 ## 元素等待: 隐式等待->主要使用 driver.implicitly_wait(timeout) 显式等待->主要使用 WebDriverWait(driver,timeout,poll_frequency).until(lambda x:x.find_element()) Selenium中的下拉框: driver.find_element(By.CSS_SELECTOR,'[value="gz"]').click():通过直接定位下拉框中的内容对应的元素,完成对下拉框元素的处理 Or 通过Select类: selectObject = Select(element): element->select标签对应的元素,通过元素定位获取 selectObject.select_by_index():根据option索引来定位,从0开始 selectObject.select_by_value():根据option属性value值来定位 selectObject.select_by_visible_text(text):根据optioin显示文本来定位 Selenium弹窗:alert = driver.switch_to.alert alert.text: 返回alert/confirm/prompt中的文字信息 alert.accept(): 接受弹框选项 alert.dismiss(): 取消弹框选项 Selenium滚动条:使用JavaScript脚本实现->用于协议阅读,页面注册等UI情况 jsDescription = "window.scrollTo(0,1000)" -> 0:左边距,1000:上边距 Selenium的frame框架:当元素信息可以获取,但是代码执行无法定位时,考虑是否存在iframe标签: driver.switch_to.frame(frame_reference):切换到指定frame的方法,frame_reference:可以为frame框架的name,id或者定位到该frame中的元素 driver.switch_to.default_content():切换到默认的frame ## driver在不同frame中切换时,需要先切换到默认的frame Selenium的多窗口window切换: driver.current_window_handle: 获取当前窗口句柄->handle句柄,窗口的唯一标识码 driver.window_handles: 获取浏览器所有窗口的句柄 driver.switch_to_window(handele): 根据句柄切换到指定窗口 driver.switch_to.window(handles[-1]): 切换到最新打开的窗口 Selenium截图操作和验证码处理: driver.get_screenshot_as_file(imgpath):imgpath->图片保存路径 ## 利用时间戳保存图片 now_time = strftime('%Y%m%d_%H%M%S') driver.get_screenshot_as_file('./info_{}.png'.format(now_time)) ## 验证码测试:在自动化测试中,必须处理验证码,否则无法执行后序测试。 常见验证码处理策略: 1.去掉验证码[常用]:测试环境下使用 2.设置万能验证码[常用]:生产环境和测试环境下采用,必须注意保密不能外泄万能验证码 3.验证识别技术:通过python-tesseract来识别图片类型验证码->识别率很难达到100% 4.记录cookie:通过记录cookie绕过登录验证,对登录本身功能进行测试时不能使用。
PO设计模式:
PageOgject的缩写,是自动化测试项目开发实践的最佳设计模式之一。核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性,可读性。 PO模式为面向页面编程:把一个页面分为三层:对象库层,操作层,业务层。 对象库层:封装定位元素的方法 操作层:封装对元素的操作 业务层:将一个或多个操作组合起来完成一个业务功能。<当前页面可能出现的所有操作> 基本框架:-> 通过对象层获得driver,其中封装获得元素的方法;元素之间的一组操作被命名为业务层;业务层的具体实现是通过操作层。 ### 业务层调用对应业务方法,业务方法指示操作层,利用从对象层获得的driver并定位element,然后执行element对应的方法。 # 1.对应页面创建页面的PO模式代码文件->命名规则:页面功能_page.py # 2.定义三个类:对象层(XxxPage)/操作层(XxxHandle)/业务层(XxxTask) # 3.对象层: 1>.init方法中获取浏览器对象 2>.自定义方法: 封装元素定位方法 -> 供操作层对象调用 3>.封装元素定位方法需要添加返回值 # 4.操作层: 1>.init方法获取对象层对象 2>.自定义方法:封装元素操作方法 -> 供业务层对象调用 # 5.业务层: 1>.init方法获取操作层对象 2>.自定义方法:封装测试业务逻辑 # 6.在测试用例文件中,实例化业务层对象,调用测试业务方法,执行测试。
Postman应用:
配合安装node.js与newman插件
模拟客户端向服务器发送请求,对请求数据进行封装,对响应数据进行解析处理。可以模拟多个通信环境,并定义环境变量以及全局变量。
Postman可以干什么? <请求组成:请求方法,URL,请求头,请求体> 请求方法:get,post,put,delete URL: 协议部分://域名部分/端口号/资源路径?查询参数 请求头: User-Agent->发送端的浏览器类型 Content-Type->请求体的数据类型 请求体: post和put有请求体(类型由Content-Type决定); get和delete没有请求体 <响应组成:响应行(包含状态码),响应头,响应体> 响应行: 协议版本、 状态码 响应头: Content-Type->描述响应体中的数据类型 响应体:绝大多数不为空.(请求成功回发数据<数据类型参考Content-Type>,请求失败回发错误消息) 状态码: 1xx: 表示请求已经被接收,等待被处理 2xx: 表示请求被成功处理,接收-> 200,201 3xx: 表示请求必须重定向,访问的资源需要重新指定路径访问 4xx: 代表客户端错误->404: 不存在, 403: 存在但无权限 5xx: 代表服务端错误 Postman常用操作? 1.模拟客户端向服务器发送请求,并查看响应。 2.通过Params、Headers、Body分别设置请求查询参数、请求头、请求体。 3.通过Tests设置断言响应码进行响应数据检验->Postman实现接口测试的主要途径。<也可以通过JavaScript脚本,将响应中的数据设置为全局变量或环境变量,供其他后续的关联请求使用。> 4.通过PreTest设置请求前置脚本->该脚本在Send按钮点击后,第一时间执行,在postman内部实际http请求之前。可以通过JavaScript脚本,在Send发送后,服务器解析前将变量存储到环境中或全局中。<pm.global.set("全局变量名",全局变量值) or pm.environment.set("环境变量名",环境变量)> 5.在Postman界面使用全局变量或环境变量时,使用'{{}}'符号,代码中使用时,使用'data.字段名'引用文件中数据。 6.Postman可以批量执行测试用例(请求集合)->使用Run功能,引入外部数据文件<csv类型文件/json类型文件> 7.导出Export测试用例集,导出环境变量文件,将环境文件,测试用例集文件,放置到同一个目录下,然后windows终端使用命令生成测试报告。<newman run 测试用例集文件.json -e 环境文件.json -r html --reporter-html-export 测试报告文件名.html>