自动化测试总结一

  1. 自动化测试:

    什么是自动化?

    由机器设备代替人工自动完成指定目标的过程
    

    为什么要自动化?

    减少人工劳动力,提高工作效率,产品规格统一标准,规模化
    

    怎么完成自动化?

    使用软件或脚本代码完成自动化执行过程。
    

    自动化测试?

    让程序代替人工去验证系统功能的过程。
    

    自动化测试分类?

    开发周期:
    接口自动化测试<灰盒测试>,
    UI自动化测试<本质是功能测试,属于黑盒>,
    单元自动化测试<白盒测试>。
    测试目的:
    功能自动化测试<黑盒测试>
    性能自动化测试<灰盒测试>。
    

    自动化测试框架?

    自动化测试组针对一个项目开发的一个代码框架,这个框架封装了很多基础模块,报告模块等等。
    

    自动化测试能解决什么问题?

    解决:回归测试的重复性高的问题。
    结局:压力测试的多用户测试不好实现问题。
    解决:兼容性测试的测试条件多,手工执行效率差的问题。
    

    自动化测试的作用:

    提高测试效率,保证产品质量。
    

    自动化测试优缺点:

    优点:
    较少时间内运行更多测试用例,自动化脚本可重复执行,减少人为错误,克服手工测试局限性。
    缺点:
    不能替代手工测试,不是一定比手工测试厉害,不能发掘更多的bug,不适用所有的功能。
    

    什么项目适合自动化测试?

    需求稳定,不频繁变更,项目开发周期长,需要频繁回归测试(UI自动化最大的应用场景)
    
  2. 自动化测试分类详解:

    单元测试化框架:

    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
    
  3. 主要使用框架和软件:

    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>
    
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
10
分享
牛客网
牛客企业服务