当前位置: 首页 > news >正文

深圳公司网站建设服务织梦网站模板更换

深圳公司网站建设服务,织梦网站模板更换,超链接 网站,甘肃兰州今天的最新消息目录 前言#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…目录 前言 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某个方法 运行某个类 运行 P0 级 运行非 P0 级 main 方式 报告 失败详情 失败截图 uiautomator2 基本操作 启动服务 事件 点击 滑动 监听 查看元素 安装 启动工具 无线运行 前言 uiautomator2是基于Android平台的UI自动化测试框架pytest是一种功能丰富的Python测试框架而allure是一种用于生成漂亮测试报告的工具。结合使用这三个工具您可以进行Android的UI自动化测试并生成直观且可视化的测试报告。 本文主要讲解使用 uiautomator2pytestallure 进行 Android 的 UI 自动化测试,其实主要目的是写一些实战的脚本来更深入学习 pytest 框架. 另外也顺便介绍一下 uiautomator2 这款自动化框架,在使用上也是非常的顺畅. 之前我已经使用 appiumtestng 写了一套自动化脚本了并且在公司实际使用了.这次就不用公司的 app 测试了,使用上家公司 58 同城的 app 进行自动化测试. 介绍 做 UI 自动化肯定需要选择一种适合的测试框架,比如 java 的 testng、python 的 unittest,主要目的是让代码的层级明确、简洁、复用性强,本次介绍下 python 的 pytest 框架. pytest pytest 官方:pytest: helps you write better programs — pytest documentation The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 官方的一段介绍,简单来说就是让写测试代码更容易并且没有那么多约束.当然这块不重点介绍 pytest 为什么好、怎么好,只需要记住 pytest 就是一个测试框架就够了. uiautomator2 uiautomator2 是一个 Android UI 自动化框架,支持 Python 编写测试脚本对设备进行自动.底层基于 Google uiautomator,隶属于最近比较火热的 openatx 项目中. 下图是运行示意图: 设备中需要安装 atx-agent 作为 uiautomator2 的服务端,解析收到的请求,并转化成 uiautomator2 的代码.总体看来交互过程没有那么繁琐,在实际使用上的确比 appium 快不少. allure allure 是一款测试报告,炫酷的页面加上多种数据统计,比 HTMLTestRunner 报告强百倍,当然也支持多语言. 官方地址:http://allure.qatools.ru 环境搭建 使用 mac 电脑搭建环境 pytest 最新版本出到 4.0 了,但是实际使用 4.0 和 allure 有些不兼容. 所以推荐使用 3.7 版本的 pytest pip install pytest3.7uiautomator2 uiautomator2 也是 python 的一个类库,用 pip 安装即可. pip install uiautomator2allure brew install allure pip install pytest-allure-adaptor有了测试框架、自动化框架、测试报告,基本上就能 coding 了. pytest 插件 pytest 插件可以实现失败重试、打印进度、指定顺序 pip install pytest-sugar # 打印进度pip install pytest-rerunfailures # 失败重试pip install pytest-ordering # 执行顺序当然插件还有很多,这里就不一一介绍了. 实例 初始化 driver 做 UI 自动化都需要初始化一个 driver 对象,这个 driver 对象可以点击事件、滑动、双击等操作 uiautomator2 的初始化 driver 方式 相比 appium 配置很少,同时可以设置全局隐式等待元素时间 import uiautomator2 as ut2 def init_driver(self,device_name):初始化driver:return:drivertry:logger.info(device_name)d ut2.connect(device_name)#logger.info(设备信息:{}.format(d.info))# 设置全局寻找元素超时时间d.wait_timeout wait_timeout # default 20.0# 设置点击元素延迟时间d.click_post_delay click_post_delay#d.service(uiautomator).stop()# 停止uiautomator 可能和atx agent冲突logger.info(连接设备:{}.format(device_name))return dexcept Exception as e:logger.info(初始化driver异常!{}.format(e))fixture 机制 unittest 框架有 setup 和 teardown 方法,用来做初始化和结束测试操作.pytest 是用pytest.fixture方法来实现 setup 和 teardown. 下面这段代码就是定义一个 driver_setup 方法,来初始化和结束. # 当设置autouse为True时, # 在一个session内的所有的test都会自动调用这个fixture pytest.fixture() def driver_setup(request):logger.info(自动化测试开始!)request.instance.driver Driver().init_driver(device_name)logger.info(driver初始化)request.instance.driver.app_start(pck_name, lanuch_activity, stopTrue)time.sleep(lanuch_time)allow(request.instance.driver)def driver_teardown():logger.info(自动化测试结束!)request.instance.driver.app_stop(pck_name)request.addfinalizer(driver_teardown)另外还有一种方式实现,可以理解为 setup 和 teardown 在一个方法内,通过 yield 关键字停顿. pytest.fixture() def init(self,scopeclass):self.home Home(self.driver)self.home.news_tab()self.news News(self.driver)logger.info(初始化消息模块)yield self.newslogger.info(结束消息模块)yield 关键字是在 python 语法生成器和迭代器中使用,用来节省内存. 比如 for 循环一个大列表,一次性都循环出来非常浪费性能. 所以通过 yield 关键字来控制循环. 下面演示下 yield: #!/usr/bin/env python # -*- coding: utf-8 -*-def yt():print 第一次打印yield 0print(第二次打印)if __name__ __main__:a yt()print next(a)print next(a)如果直接调用 yt 函数会发现啥也打印不出来,因为此时只是声明了 yt 函数并没有真正的使用. 使用 next 方法调用第一次,输入结果如下: yield 在此时相当于 return 0,此时不会输出第二次打印,会在这块停住. 第一次打印 0使用 next 方法调用第二次,输入结果如下: 第二次打印再来回顾下上面那个例子: 在 yield 之前完成了 setup 操作并且返回 self.news 对象 在 yied 之后完成了 teardown 操作 pytest.fixture() def init(self,scopeclass):self.home Home(self.driver)self.home.news_tab()self.news News(self.driver)logger.info(初始化消息模块)yield self.newslogger.info(结束消息模块)数据共享 在 pytest 中只需要写 conftest.py 类,可以实现数据共享,不需要 import 就能自动找到一些配置. 刚才讲到的初始化 driver_setup 函数,就可以定在 conftest.py 类中,此时这个函数是全局可以函数,在测试类中使用如下: 使用pytest.mark.usefixtures 装饰器就能引用到 driver_setup 函数 allure.feature(测试发布) pytest.mark.usefixtures(driver_setup) class TestNews:pytest.fixture(paramsitem)def item(self, request):return request.param测试类 pytest 检测如果是 test 开头或者 test 结尾的类,都认为是可以执行测试类. 在测试类中写 test 开头的测试方法 allure.story(测试首页搜索) def test_home_search(self,init):init.home_search()参数化 假设场景是首页搜索多个词,需要借助参数化来完成 使用pytest.mark.parametrize pytest.mark.parametrize((kewords), [(u司机), (u老师), (u公寓)]) def test_home_moresearch(self, init,kewords):init.home_more_search(kewords)指定顺序 假设发布用例,需要先登录才可以.可以通过用例排序的方式先登录,再发布 使用pytest.mark.run,odrer 从小到大优先执行 pytest.mark.usefixtures(driver_setup) pytest.mark.run(order1) # 指定login先执行 class TestLogin:运行指定级别 假设已经写了很多用例,有些用例是冒烟用例,可以指定级别运行. 使用pytest.mark.P0 allure.story(测试首页更多) pytest.mark.P0 def test_home_more(self, init):init.home_more()命令行执行: pytest -v -m P0, 会执行所有 P0 级别的用例 重试 这个时候需要借助 pytest-rerunfailures 插件,用法如下: pytest.mark.flaky(reruns5, reruns_delay2) allure.story(测试精选活动) def test_news_good(self,init):init.news_good()当然这种方法是指定某个 case 失败重试 还可以全局设置用户如下: pytest --reruns 2 --reruns_delay 2reruns:重试次数 reruns_delay:重试的间隔时间 hook 函数 在 conftest.py 文件中定义pytest.hookimpl函数,这个函数可以 hook 住 pytest 运行的状况 pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call):hook pytest失败:param item::param call::return:# execute all other hooks to obtain the report objectoutcome yieldrep outcome.get_result()# we only look at actual failing test calls, not setup/teardownif rep.when call and rep.failed:mode a if os.path.exists(failures) else wwith open(failures, mode) as f:# lets also access a fixture for the fun of itif tmpdir in item.fixturenames:extra (%s) % item.funcargs[tmpdir]else:extra f.write(rep.nodeid extra \n)从代码中可以看出可以获取失败情况的相关信息,当时有了失败信息就可以搞事情了,比如当用例失败的时候截图或者记录失败数量做数据统计. 断言 在跑用例的时候最后一步都会断言一下,比如断言元素是否存在等 def assert_exited(self, element):断言当前页面存在要查找的元素,存在则判断成功:param driver::return:if self.find_elements(element):logger.info(断言{}元素存在,成功!.format(element))assert Trueelse:logger.info(断言{}元素存在,失败!.format(element))assert False还可以这样优化代码: def assert_exited(self, element):断言当前页面存在要查找的元素,存在则判断成功:param driver::return:assert self.find_elements(element) True,断言{}元素存在,失败!.format(element)logger.info(断言{}元素存在,成功!.format(element))assert 失败后会跑出 AssertionError 和定义的文案 AssertionError: 断言xxxxx元素存在,失败!运行 介绍下几种常用命令行运行 运行某个文件夹下的用例 运行某个文件下的所有用例 pytest android/testcase运行某个方法 类文件地址::方法名 pytest test_home.py::test_home_more或者使用-k 参数 方法名 pytest -k test_home_more运行某个类 有的时候需要调试正个测试类中所有测试方法 直接跟上类文件地址 pytest test_home.py运行 P0 级 pytest -v -m P0运行非 P0 级 pytest -v -m not P0main 方式 在 run.py 中写如下代码,这种方式相当于把命令行参数封装到脚本中. pytest.main([-s,--reruns2, android/testcase,--alluredirdata])报告 测试代码写完了,还差一个非常好看的报告.以前我们一般都用 HTMLTestRunner 报告,但是 HTMLTestRunner 报告功能比较单一并且也不支持失败截图. 偶然在社区中看到了 allure 的帖子,看了展示报告简直是吊炸天,先附一张跑完用例的截图. 另外可以在代码中设置报告层次,用法如下: allure.feature(测试首页) pytest.mark.usefixtures(driver_setup) class TestHome:pytest.fixture()def init(self,scopeclass):self.home Home(self.driver)logger.info(初始化首页模块)yield self.homelogger.info(结束首页模块)allure.story(测试首页搜索)def test_home_search(self,init):init.home_search()设置 allure.feature 和 allure.story,相当于上下级关系. 失败详情 点击失败用例就能看到失败的相关信息 失败截图 在跑自动化的过程已经遇到失败情况,需要一张截图描述当时的情况. 在上面提到pytest.hookimpl函数中,最后调用截图方法,使用 allure.attach 把截图加上. 需要注意的是 attach 中的第二个参数是图片的二进制信息. pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call):hook pytest失败:param item::param call::return:# execute all other hooks to obtain the report objectoutcome yieldrep outcome.get_result()# we only look at actual failing test calls, not setup/teardownif rep.when call and rep.failed:mode a if os.path.exists(failures) else wwith open(failures, mode) as f:# lets also access a fixture for the fun of itif tmpdir in item.fixturenames:extra (%s) % item.funcargs[tmpdir]else:extra f.write(rep.nodeid extra \n)pic_info adb_screen_shot()with allure.step(添加失败截图...):allure.attach(失败截图, pic_info, allure.attach_type.JPG) uiautomator2 基本操作 启动服务 执行如下命令: python -m uiautomator2 init会在手机上安装 atx-agent.apk 并且会在手机上启动服务 2018-12-14 18:03:50,691 - __main__.py:327 - INFO - Detect pluged devices: [ua3f8ca3a] 2018-12-14 18:03:50,693 - __main__.py:343 - INFO - Device(a3f8ca3a) initialing ... 2018-12-14 18:03:51,154 - __main__.py:133 - INFO - install minicap 2018-12-14 18:03:51,314 - __main__.py:140 - INFO - install minitouch 2018-12-14 18:03:51,743 - __main__.py:168 - INFO - apk(1.1.7) already installed, skip 2018-12-14 18:03:51,744 - __main__.py:350 - INFO - atx-agent is already running, force stop 2018-12-14 18:03:52,308 - __main__.py:213 - INFO - atx-agent(0.5.0) already installed, skip 2018-12-14 18:03:52,490 - __main__.py:254 - INFO - launch atx-agent daemon 2018-12-14 18:03:54,568 - __main__.py:273 - INFO - atx-agent version: 0.5.0 atx-agent output: 2018/12/14 18:03:52 [INFO][github.com/openatx/atx-agent] main.go:508: atx-agent listening on 192.168.129.93:7912 监听的是手机上的 ip 默认 7921. 事件 事件类型比如点击和滑动等,介绍几个常用的. 点击 根据 id、xpath、text 定位元素,和 appium 使用上差别不大. self.d(resourceIdelement).click() self.d.xpath(element).click() self.d(textelement).click()滑动 前 4 个参数是坐标,time 是控制滑动时间 self.d.drag(self.width / 2, self.height * 3 / 4, self.width / 2, self.height / 4, time)监听 这个用于首次启动 app 点击权限或者开屏幕广告 when 方法就相当于 if 判断,满足条件才会点击,可以生去一大堆逻辑代码. driver.watcher(允许).when(text允许).click(text允许) driver.watcher(跳过 ).when(text跳过 ).click(text跳过 ) driver.watcher(不要啦).when(text不要啦).click(text不要啦)查看元素 安装 需要安装 weditor 库 pip install weditor启动工具 python -m weditor会在自动打开浏览器并且展示元素,相当于 web 版本的 uiautomatorviewer,使用起来比较方便. 无线运行 上边提到的手机 ip,有个这个手机 ip 就可以进行无线运行脚本 把 connect 中的方法替换成手机 ip 就可以了 # d ut2.connect(device_name) d ut2.connect(192.168.129.93)作为一位过来人也是希望大家少走一些弯路 在这里我给大家分享一些自动化测试前进之路的必须品希望能对你带来帮助。 软件测试相关资料自动化测试相关资料技术问题答疑等等 相信能使你更好的进步 点击下方小卡片
http://www.hkea.cn/news/14436124/

相关文章:

  • 微信如何做网站网站seo外链接
  • 建设牌官方网站免费发布信息的网站
  • 驻马店市住房和城乡建设局网站首页郑州汉狮做网站费用
  • 做网站徐州ios开发app
  • 做网站页面报价移动端cpu性能天梯图
  • 平面设计师长逛的网站有哪些怎样用dw做 网站首页
  • 书店网站html模板搜索引擎关键词排名优化
  • 网站logo是什么意思南昌网站开发建设
  • 西安微信网站建设公司做网站前应该怎么处理
  • 廊坊网站建设公司墨子公司网站建设费用 知乎
  • 买域名哪个网站好中药网站模板
  • 专业的深圳网站设计wordpress模板优劣
  • 如何做ps4的游戏视频网站自己给公司做网站难不难
  • 哪个平台做网站好深圳营销型网站需要多少钱
  • 做网站服务器和域名个人网站背景图片
  • 珠海专业网站建设自己如何做一个网络平台
  • 做网站服务怎么赚钱网站产品说明书模板
  • 绍兴网站seo柳州做网站去哪家公司好
  • 博物馆文化网站建设四川网站建设服务公司
  • 两学一做网站 新闻php网站多语言翻译怎么做
  • 广告推广网站网站模板分类
  • 网站即将上线页面代码网站模板源码下载网
  • wordpress 搭网站网站的几种提交方式
  • 网站开发未来发展趋势中企动力销售好做吗
  • 中小企业网站优化王也为什么这么受欢迎
  • 南京专业做网站的公司有哪些如何在百度上投放广告
  • 中科院网站建设网站内容建设培训通知
  • 河北建设部官方网站在线crm
  • 建个网站需要多少钱?江西省大余县建设局网站
  • 太原市做网站做网站用什么云服务器吗