Python+Appium+unittest实现安卓APP UI 自动化测试

合集下载

Python如何实现自动化测试

Python如何实现自动化测试

目录
CONTENTS
1
Python简述
2
Unittest / Pytest
3
Python + Requests
4
Python + Selenium
5
Python + Appium
6
辅助库简述
LOGO Python + Selenium
介绍
Selenium是用于Web应用程序测试的工具。Selenium测试直接运行在浏览 器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等
提供了SetUpClass()和TearDownClass()
C
setup_class/teardown_class只在类前后运行一次
用例运行前和结束后只运行一次

D
setup_method/teardown_method作用于方法始末
E
可以在函数前加@pytest.fixture()装饰器
LOGO Unittest / Pytest
68.111.97:90 14/api/safeR est/sysQrCod
post
json
"icon": "",
response.json()
"id": "",
["data"]["succe
"name": "public internet ssful"]==True
y
e/save

(转载)UI接口分层自动化测试框架设计思想

(转载)UI接口分层自动化测试框架设计思想

(转载)UI接⼝分层⾃动化测试框架设计思想阅读本⼩节,需要读者具备如下前提条件:1. 掌握⼀种编程语⾔基础,如java、python等。

2. 掌握⼀种单元测试框架,如java语⾔的testng框架、python的unittest框架。

3. 掌握⽬前主流的UI测试框架,移动端APP测试框架Appium,或者掌握Web端测试框架Selenium。

4. 如果是Appium框架,还需要掌握如何定位控件元素,原⽣页⾯可使⽤安卓SDK⾃带的uiautomatorviewer⼯具,webview页⾯可以使⽤Chrome浏览器⼊"chrome://inspect/#devices",该⽅法需要FQ或者修改hosts。

5. 如果是Web端,浏览器中打开F12即可。

1APP端UI分层⾃动化测试框架的搭建下⾯以Appium+python+unittest为例介绍UI⾃动化框架的搭建思路1. 最开始⼊门级别的代码以登录页⾯举例,如下:最开始的登录脚本:2. 对元素操作的公⽤⽅法进⾏封装按照上述代码写了很多⾏,发现每次操作元素都要写同样的代码,⼀是啰嗦,⼆是⼯作量⼤,这样就要将重复⾼的操作抽象出来进⾏封装成类,及把元素定位,元素点击,元素输⼊、页⾯滑动等⽅法进⾏封装,如下代码:上述代码只是展⽰了查找元素的⽅法,在BaseAction类中封装元素对象的重⽤操作代码笔者就不贴出来,⼤家明⽩思路即可。

3. 测试代码和测试数据分离开始测试数据还是写在测试代码中,如果⽤例多了,后期需要修改数据,这样只能在测试代码中修改,实际中没有这样维护代码的,所以需要将测试数据和代码分离,笔者选择ini配置⽂件存放数据。

那么问题来了,把数据放在ini配置⽂件中,在代码中怎样获取数据呢,这就需要将操作配置⽂件的⽅法封装成⼀个单独的类,即如下代码通过对元素操作公⽤⽅法的封装和测试代码和测试数据的分类,优化的脚本如下:存放数据的ini配置⽂件:app配置:存放元素控件:存放元素输⼊的数据:测试脚本:4. 通⽤的公⽤类封装以上的脚本中,其实还缺少⼀些东西,如启动appiumsever,⽇志记录,发送邮件,数据库操作等,这⼏种操作都是框架公⽤的,所以单独封装成类,代码如下:appiumsever类:log⼯具类:还有发送邮件类和数据库操作类笔者就不贴出来了,重在⼤家理解思路即可。

写自动化用例测试代码

写自动化用例测试代码

写自动化用例测试代码自动化测试用例是软件开发过程中非常重要的一环,它可以帮助开发团队快速验证软件功能的正确性和稳定性。

在编写自动化测试用例的过程中,我们通常会使用测试框架和编程语言来实现。

下面我将以Python语言为例,简单介绍一下编写自动化测试用例的基本步骤。

首先,我们需要选择一个合适的测试框架,比较流行的有unittest、pytest、nose等。

这里以unittest为例进行介绍。

1. 首先,我们需要导入unittest模块:python.import unittest.2. 然后,我们创建一个测试类,继承unittest.TestCase类:python.class TestCalculator(unittest.TestCase):def test_addition(self):# 测试加法。

result = 2 + 3。

self.assertEqual(result, 5)。

def test_subtraction(self):# 测试减法。

result = 5 3。

self.assertEqual(result, 2)。

3. 接下来,我们可以使用unittest提供的assert断言方法来验证测试结果是否符合预期。

在上面的例子中,我们使用了self.assertEqual()方法来比较实际结果和预期结果是否相等。

4. 最后,我们可以使用unittest提供的main()函数来执行测试用例:python.if __name__ == '__main__':unittest.main()。

以上就是一个简单的自动化测试用例的编写过程。

当然,实际的测试用例可能会更加复杂,涉及到页面操作、接口调用等。

在实际编写测试用例时,我们需要根据具体的需求和场景来设计和实现测试用例,保证覆盖到软件的各个功能点和边界条件,从而保证软件质量和稳定性。

希望这个简单的例子可以帮助你理解自动化测试用例的编写过程。

如何搭建基于C#和Appium的Android自动测试环境

如何搭建基于C#和Appium的Android自动测试环境

如何搭建基于C#和Appium的Android⾃动测试环境本⽂由葡萄城技术团队于博客园原创并⾸发转载请注明出处:,葡萄城为开发者提供专业的开发⼯具、解决⽅案和服务,赋能开发者。

如果想做⼿机端的⾃动化测试,Appium是⾸选的测试框架,因为⽹上使⽤的⼈多,资料丰富,⽀持语⾔多 Jave,Python,C#,Ruby,PHP,碰见问题也容易得到帮助。

关于Appium环境搭建的例⼦⽹上⽐较多,不过都是关于Python,Java的,使⽤C#客户端的资料⽐较少,公司现有的测试系统是基于C#构建的,因为要和现有系统集成,所以选择的C#语⾔作为客户端,下载Appium 官⽹提供的C#例⼦,但是对应的Android 版本,Nunit 版本都⽐较旧,对于初次接触⼿机测试的⼈来说,⼀步⼀个坑,把例⼦拿下来,折腾了⼀两天,还是各种问题。

最终通过百度,Google,终于搭建好了环境,现在分享⼀下过程,希望对于后来⼈会有些帮助。

默认⼤家是安装了Visual Studio 的,如果没有安装,请百度如何安装Visual Studio搭建环境有三部分,模拟器环境准备,Appium服务器环境准备,C#单元测试⼯程环境准备,关于前两部分腾讯课堂,⽹易课堂都有视频资料,⼤家可以参考。

下⾯我们开始:1. 模拟环境搭建模拟环境搭建建议⽤Android Studio ,这样配置简单,模拟器的性能也强⼀些。

安装完成后打开 Android Studio在Tools菜单下找到 SDK Manager 菜单打开( Tools –>SDK Manager)显⽰如下:找到 Android SDK (Appearance & Behavior ->System Setting -> Android SDK)安装 Android SDK 例如:Android 6.0接下来配置环境变量:配置ANDROID_HOME 变量,对应的⽬录可⽤从下⾯位置找,我对位置做过调整,和默认安装的位置不⼀样。

Android测试中的自动化工具评测与选择

Android测试中的自动化工具评测与选择

Android测试中的自动化工具评测与选择随着移动应用开发的快速发展,Android平台成为了最受欢迎的移动操作系统之一。

然而,随之而来的是对移动应用质量的不断追求,这要求开发人员在应用发布之前进行全面而准确的测试。

为了提高效率和质量,Android测试中的自动化工具成为开发人员的首选。

本文将对几种常用的Android自动化测试工具进行评测,并提供选择的建议。

1. AppiumAppium是一种开源的移动应用自动化测试工具,支持多种操作系统(包括Android)。

它使用WebDriver协议进行测试,并支持各种编程语言(如Java、Python和Ruby)。

Appium的优点在于可以在真实设备和模拟器上运行测试,且支持多种操作系统版本。

然而,Appium需要开发人员具备较强的编程能力,并且在配置和安装方面较为复杂。

2. EspressoEspresso是由Google开发的Android自动化测试工具,专注于用户界面(UI)测试。

它提供了一套简洁明了的API,可以方便地编写和运行UI测试。

Espresso的优点在于速度快、稳定性高,且无需涉及设备配置或者系统安装。

然而,在处理复杂场景或者多个应用程序之间的交互时,Espresso的能力相对较弱。

3. UI AutomatorUI Automator也是由Google开发的自动化测试框架,用于执行跨应用程序的功能测试。

它可以与Android系统进行交互,并模拟用户在多个应用程序之间的操作。

UI Automator的优点在于支持多应用程序测试和跨应用程序交互,适用于复杂的测试场景。

然而,使用UI Automator需要对Android框架有一定的了解,并且测试脚本编写较为繁琐。

4. RobotiumRobotium是一种Android自动化测试工具,专注于功能和用户界面的测试。

它提供了易于使用的API,能够模拟用户在应用程序中的操作和事件。

Robotium的优点在于容易上手、功能强大,可用于测试各种应用程序场景。

Python与Appium实现手机APP自动化测试

Python与Appium实现手机APP自动化测试

Python与Appium实现⼿机APP⾃动化测试⽬录1.什么是Appium2.启动⼀个app⾃动化程序的步骤3.appium服务介绍4. appium客户端使⽤5.adb的使⽤6.Appium启动过程分析1.什么是Appiumappium是⼀个开源的测试⾃动化框架,可以与原⽣的、混合的和移动的web应⽤程序⼀直使⽤。

它使⽤WebDriver协议驱动IOS(内置的测试引擎xcuitest)、Android(uiautomator2,Espresso)和Windows应⽤程序很多⼈学习蟒蛇,不知道从何学起。

很多⼈学习寻找python,掌握了基本语法之后,不知道在哪⾥案例上⼿。

很多已经可能知道案例的⼈,却不怎么去学习更多⾼深的知识。

这三类⼈,我给⼤家提供⼀个好的学习平台,免费获取视频教程,电⼦书,以及课程的源代码!QQ群:101677771欢迎加⼊,⼀起讨论学习原⽣应⽤程序:安卓程序是⽤JAVA或kotlin开发出来的,这种程序是原⽣应⽤程序,原⽣应⽤⽐较流畅,好调⽤,缺点是不同的端需要的开发语⾔不同web应⽤程序:就web应⽤程序可以直接放到⼿机端来运⾏,web是⽤html+css+js编写的混合应⽤程序:结合原⽣与web应⽤程序,有些页⾯⽤原⽣的,有些页⾯使⽤web应⽤程序国内⽐较出名的框架:appiumairtest 现在是由阿⾥在维护,最开始是运⽤在游戏测试,和appium的功能差不多uiautomator2(⽤法简单,⾮常python,只⽀持原⽣的,不⽀持其他)设计哲学:你没有必要为了⾃动化⽽重新编译你的应⽤或者经任何⽅式修改它(Android/IOS系统⾃带框架)你不应该被限制在特定的语⾔或框架上来编写运⾏测试(API调⽤,接⼝)移动端⾃动化框架在⾃动化接⼝⽅⾯不应该重造轮⼦(WebDriver,appium是在selenium的基础上开发的)移动端⾃动化框架应该开源,不但是在名义上⽽且在精神和实践上都要实⾄名归2.启动⼀个app⾃动化程序的步骤打开模拟器,或者连接上⼿机(注意开发者模式以及USB调试模式已经开启,⼿机授权要确认,否则是连接不上的)在命令窗⼝输⼊adb devices(查看设备名称)开启appium服务appium客户端代码连接服务3.appium服务介绍中⽂设置除了简单设置,还有⼀些⾼级设置,我们可以看⼀下保存了可以查看预设,⽅便以后使⽤编辑配置是进⼊修改环境变量主机和端⼝号不需要设置,直接可以开启服务器开启后,可以看到服务器运⾏中,右边三个按钮的功能分别是启动检查器会话,获取原始⽇志,停⽌运⾏服务器点击后⾃动经记事本打开,如果安装了其他编辑软件,可以选择打开⽅式服务开启后,就可以使⽤python来进⾏客户端来连接服务4. appium客户端使⽤使⽤前确定已经安装了,pip install appium-python-client,安装后,直接导⼊使⽤看⼀下Remote的源代码同时appium服务端也会显⽰500的错误犹豫appium1.20.2版本的,不像之前的版本需要传⼊的必须参数多了,现在只需要传platformName即可,所以具体可以看⾃⼰安装的是什么版本,不过加上更多参数也不受影响常⽤的caps参数:platformName 平台名称(Android,IOS)必选deviceName 设备名称(可选)udid (和deviceName作⽤⼀样,在不同版本下这个参数重好⽤,所以以后⽤udid代替deviceName)app apk的存放路径(可选)appActivity(页⾯名称,相当于web页⾯中title)和 appPackage(包名)platformVersion 系统版本号(可选,版本不匹配会报错)noReset 选择True 不重启(意思是app的引导页⾯,缓存数据等不清空,如果选择False,app相当于重新安装了,把之前的数据都清空了)automationName 驱动名称browserName 直接测web⽤ChromeautoWebview 开机进⼊webview模式(开机直接进⼊⽹页模式,不需要进⼊原⽣页⾯)chromedriverExecutable ⽹页浏览器驱动所放路径(必须是完整路径)chromedriverExecutableDir ⽹页浏览器驱动所放⽬录unicodekeyboard 开启unicode编码形式的键盘resetKeyboard 重启键盘(和上⼀个⼀块配置,两个都设置成True,就可以开启中⽂输⼊,相当于我们的电脑安装输⼊法)autoGrantPermissions 开启⼿机权限(相当于web端中弹出来的alert弹框,⽆法定位元素,设置了True,就⽅便定位元素)官⽹上还有很多⽤法,感兴趣的可以参考⼀下:通过adb获取appPackage和appActivity:⽅法⼀:adb shell am monitor 监控操作(在cmd中执⾏此命令后,然后在⼿机上或模拟器上操作对应的app,就会显⽰对应的包名)⽅法⼆:adb logcat | findStr -i displayed 从⽇志进⾏查询包名和页名称通过aapt获取appPackage和appActivity:aapt dump badging 全路径.apk拿到appPackage和appActivity后,可以使⽤包名的⽅式来访问app,代码如下:from appium.webdriver import Remote# 启动⼀次请求# 1.指明需要连接的服务地址和端⼝号# 2.You must include a platformName capabilitycaps = {"platformName": "Android","udid": "emulator-5554","appPackage": "com.lemon.lemonban","appActivity": ".activity.WelcomeActivity"}driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=caps)运⾏结果:总结:platformName 必填,其他可选deviceName重要app安装apk包,⾃动打开(已经安装过的不会重新安装),apk包路径最好不要有中⽂,不知道为什么我的电脑⽤这种⽅式运⾏⼀直报错,最后也未能解决,所以我使⽤包名运⾏在复制appActivity时,注意⼀定是app的⾸页页⾯名称,别复制错了5.adb的使⽤adb(Android Debug Bridge)安卓调试桥:作⽤就是操作安卓⼿机中的app相关命令:adb devices 查看设备是否连接(可以⼿动连接 adb connect 127.0.0.1:5554,⽹上可以搜索不同模拟器的端⼝号)adb shell 登录设备(进⼊⼿机系统⾥⾯)adb shell dumpsys activity | find "mFocusedActivity" 查看前台应⽤activity应⽤名称(注意⼀定要打开了app,再去执⾏命令,dumpsys下有很多命令,可以查看帮助⽂档进⾏更多了解)adb install 电脑/包名.apk 安装软件adb uninstall 电脑/包名.apk 制裁软件adb pull ⼿机⽂件路径电脑⽂件路径从⼿机下载/拉⽂件电脑端adb push 电脑⽂件路径⼿机⽂件路径从电脑推送/上传到⼿机端adb shell pm list packages 显⽰所有的安装包名6.Appium启动过程分析客户端通过wd/hub/session发送请求创建⼀个会话session提供了参数就是cpas服务端接收到caps信息后,检验caps参数是否合法adb install io.setting.appium判断有没有包名启动app获取操作系统的版本:adb.exe -P 5037 -s emulator-5554 shell getprop ro.build.version.release判断包名是否已经安装到⼿机上:adb.exe -P 5037 -s emulator-5554 shell dumpsys package com.lemon.lemon启⽤app:adb.exe -P 5037 -s emulator-5554 shell am start -W -n com.lemon.lemonban/.activity.WelcomeActivity -S 到此这篇关于python+appium实现⾃动化测试的⽰例代码的⽂章就介绍到这了。

自动化测试中常用的UI自动化测试框架介绍

自动化测试中常用的UI自动化测试框架介绍

自动化测试中常用的UI自动化测试框架介绍在软件开发的过程中,UI(用户界面)自动化测试是一项必不可少的工作。

自动化测试可以简化测试流程,提高测试效率,减少测试成本。

目前,在市面上有很多UI自动化测试框架,本文将介绍一些常用的UI自动化测试框架。

一、SeleniumSelenium是一个自动化测试框架,它可以模拟用户在Web页面中的操作。

它提供了很多不同编程语言的API,比如Java、C#、Python等。

Selenium可以支持各种浏览器,包括Chrome、Firefox、IE等。

它可以通过记录、回放用户的操作,在不同浏览器中自动执行测试用例。

此外,Selenium还支持一些高级功能,比如截图、断言等。

二、AppiumAppium是一个移动应用自动化测试框架。

它可以用来测试各种移动应用,包括iOS、Android、Windows等平台。

与Selenium类似,Appium也提供了各种编程语言的API,比如Java、Python 等。

它可以模拟用户在移动应用中的操作,包括点击、滑动、输入等。

Appium还提供了一些高级功能,比如录制和回放测试用例。

三、TestCompleteTestComplete是一款功能强大的自动化测试工具,它可以测试各种应用程序,包括Web应用、桌面应用、移动应用等。

TestComplete支持多种编程语言,比如JavaScript、Python等。

它还可以对各种技术框架进行测试,比如AngularJS、ReactJS等。

此外,TestComplete还提供了非常详细的测试报告。

四、Robot FrameworkRobot Framework是一款基于Python开发的自动化测试框架。

它可以测试各种应用程序,包括Web应用、桌面应用、移动应用等。

Robot Framework不仅支持Python编写的测试用例,还可以支持其他编程语言编写的测试用例。

此外,Robot Framework还提供了很多内置库,比如SeleniumLibrary、AppiumLibrary等,方便用户快速进行测试。

python+appium+yaml移动端自动化测试框架实现详解

python+appium+yaml移动端自动化测试框架实现详解

python+appium+yaml移动端⾃动化测试框架实现详解结构介绍之前分享过⼀篇安卓UI测试,但是没有实现数据与代码分离,后期维护成本较⾼,所以最近抽空优化了⼀下。

不想看⽂章得可以直接去Github,欢迎拍砖⼤致结构如下:testyaml管理⽤例,实现数据与代码分离,⼀个模块⼀个⽂件夹public 存放公共⽂件,如读取配置⽂件、启动appium服务、读取Yaml⽂件、定义⽇志格式等page 存放最⼩测试⽤例集,⼀个模块⼀个⽂件夹results 存放测试报告及失败截图logs 存放⽇志testcase 存放测试⽤例runtest.py 运⾏所有测试⽤例yaml格式介绍⾸先看下yaml⽂件的格式,之前也写过⼀点关于yaml语法学习的testcase部分是重点,其中:element_info:定位元素信息find_type:属性,id、xpath、text、idsoperate_type: click、sendkeys、back、swipe_up 为back就是返回,暂时就四种上⾯三个必填,operate_type必填send_content:send_keys 时⽤到index:ids时⽤到times: 返回次数或者上滑次数testinfo:- id: cm001title: 新增终端门店execute: 1testcase:-element_info: 客户find_type: textoperate_type: click-element_info: com.fiberhome.waiqin365.client:id/cm_topbar_tv_rightfind_type: idoperate_type: click-element_info: com.fiberhome.waiqin365.client:id/custview_id_singletv_inputtextfind_type: idsoperate_type: send_keyssend_content: auto0205index: 0-element_info:find_type:operate_type: swipe_uptimes: 1-element_info: 提交find_type: textoperate_type: click-element_info:find_type:operate_type: backtimes: 1代码部分公共部分个⼈觉得核⼼的就是公共部分,相当于建房⼦,公共部分搞好了,后⾯仅仅是调⽤即可,建房⼦把架⼦搭好,后⾯就添砖加⽡吧。

python+appium自动化测试-通用设置(一)

python+appium自动化测试-通用设置(一)

python+appium⾃动化测试-通⽤设置(⼀)这篇⽂章总结了我平时⽤的⽐较多的3个设置,后续有⽤到其它的,会继续更新哦。

⼀、运⾏时会重装APP问题问题:在使⽤Appium运⾏⾃动化代码的时候,每次运⾏会⾃动清除APP的原来数据,并将APP卸载,再重新安装打开。

解决:在APP启动的参数设置中添加"noReset": True,表⽰启动APP时不清除APP⾥的原有的数据。

未设置该参数,系统默认为"noReset": False,表⽰在启动APP时会⾃动清除卸载APP,重新安装,所以每次打开的APP都是新安装的APP。

代码⽰例:from appium import webdriverdef start(self):caps = {"platformName": "Android","deviceName": "ABCDEFGHIJKLMNOPQ","platforVersion": "9","appPackage": "com.sina.weibo","appActivity": "com.sina.weibo.SplashActivity","autoGrantPermissions": "true","automationName": "UiAutomator2",# 启动app时不要清除app⾥的原有的数据"noReset": True}self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)self.driver.implicitly_wait(20)⼆、执⾏测试⽤例会重启APP问题:执⾏多条测试⽤例时,每执⾏完⼀个测试⽤例,都会重新启动AP解决:在测试⽤例类中导⼊pytest,将测试⽤例类中的初始化函数设置为setup_class,修改后启动APP,只会执⾏⼀次初始化。

Android测试中的UI自动化测试工具推荐

Android测试中的UI自动化测试工具推荐

Android测试中的UI自动化测试工具推荐在Android测试领域,UI自动化测试工具是至关重要的一环。

它们的目的是通过模拟用户交互来验证应用程序在不同设备和屏幕尺寸下的可靠性和稳定性。

本文将介绍几款在Android测试中被广泛推荐的UI自动化测试工具。

一、Appium:跨平台的自动化测试工具Appium是一款开源、跨平台的自动化测试工具,支持多种编程语言,包括Java、Python、Ruby等。

它可以针对Android和iOS应用进行测试,而且与操作系统解耦,使得测试用例可以在不同平台上重复使用。

Appium使用WebDriver协议进行操作,支持多种自动化框架和测试框架,如JUnit和TestNG。

二、Espresso:Google官方推荐的测试框架Espresso是一个强大的UI测试框架,由Google官方推出并维护。

它专为Android应用程序设计,提供了简单易用的API和丰富的匹配器(Matcher)来组织测试用例。

Espresso支持事件同步和异步操作的优化,能够准确地模拟用户交互,并进行可靠的断言和验证。

三、UI Automator:面向系统级测试的工具UI Automator是Google提供的一种系统级开发测试框架,用于验证Android应用的用户界面。

它提供了一组强大的API,可以访问和操作应用程序中的UI组件。

UI Automator适用于系统级UI测试场景,如跨应用测试、应用间交互和系统设置的测试。

它支持多个设备和多个应用的并行测试,并提供JUnit测试运行器执行测试。

四、Robot Framework:基于关键字的测试框架Robot Framework是一个开源的、通用的自动化测试框架,可以用于Android应用程序的UI自动化测试。

它采用关键字驱动的方式编写测试脚本,非常易读且可维护。

Robot Framework支持多种自动化库和插件,可与其他工具无缝集成,提供了广泛的测试报告和日志。

用 Pytest+Appium+Allure 做 UI 自动化的那些事

用 Pytest+Appium+Allure 做 UI 自动化的那些事

文本主要介绍下Pytest+Allure+Appium 记录一些过程和经历,一些好用的方法什么的,之前也没写过什么文章,文章可能有点干,看官们多喝水主要用了啥:▪Python3▪Appium▪Allure-pytest▪Pytes tAppium 直接执行adb shell 方法# Appium 启动时增加--relaxed-security 参数 Appium 即可执行类似ad b shell的方法> appium -p 4723--relaxed-security# 使用方法def adb_shell(self, command, args, includeStderr=False): """appium --relaxed-security 方式启动adb_shell('ps',['|','grep','android']):param command:命令:param args:参数:param includeStderr: 为 True 则抛异常:return:"""result = self.driver.execute_script('mobile: shell',{'command': command,'args': args,'includeStderr': includeStderr,'timeout':5000})return result['stdout']Appium 直接截取元素图片的方法element = self.driver.find_element_by_id('cn.xxxxxx:id/login_si gn')pngbyte = element.screenshot_as_pngimage_data = BytesIO(pngbyte)img = Image.open(image_data)img.save('element.png')# 该方式能直接获取到登录按钮区域的截图Appium 直接获取手机端日志# 使用该方法后,手机端 logcat 缓存会清除归零,从新记录# 建议每条用例执行完执行一边清理,遇到错误再保存减少陈余 log 输出# Androidlogcat = self.driver.get_log('logcat')# iOS 需要安装 brew install libimobiledevicelogcat = self.driver.get_log('syslog')# web 获取控制台日志logcat = self.driver.get_log('browser')c ='\n'.join([i['message']for i in logcat])allure.attach(c, 'APPlog', allure.attachment_type.TEXT)#写入到 allure 测试报告中Appium 直接与设备传输文件# 发送文件#Androiddriver.push_file('/sdcard/element.png', source_path='D:\works\e lement.png')# 获取手机文件png = driver.pull_file('/sdcard/element.png')with open('element.png', 'wb') as png1:png1.write(base64.b64decode(png))# 获取手机文件夹,导出的是zip文件folder = driver.pull_folder('/sdcard/test')with open('test.zip', 'wb') as folder1:folder1.write(base64.b64decode(folder))# iOS# 需要安装 ifuse# > brew install ifuse 或者> brew cask install osxfuse 或者自行搜索安装方式driver.push_file('/Documents/xx/element.png', source_path='D:\w orks\element.png')# 向 App 沙盒中发送文件# iOS 8.3之后需要应用开启 UIFileSharingEnabled 权限不然会报错bundleId = 'cn.xxx.xxx' # APP名字driver.push_file('@{bundleId}/Documents/xx/element.png'.format (bundleId=bundleId), source_path='D:\works\element.png') Pytest 与Unittest 初始化上的区别很多人都使用过unitest 先说一下pytest 和unitest 在Hook method上的一些区别class TestExample:def setup(self):print("setup class:TestStuff")def teardown(self):print ("teardown class:TestStuff")def setup_class(cls):print ("setup_class class:%s"% cls.__name__)def teardown_class(cls):print ("teardown_class class:%s"% cls.__name__)def setup_method(self, method):print ("setup_method method:%s"% method.__name__) def teardown_method(self, method):print ("teardown_method method:%s"% method.__name__) 2.使用pytest.fixture()@pytest.fixture()def driver_setup(request):request.instance.Action= DriverClient().init_driver('android')def driver_teardown():request.instance.Action.quit()request.addfinalizer(driver_teardown)初始化实例1.setup_class 方式调用class Singleton(object):"""单例ElementActions 为自己封装操作类"""Action = Nonedef __new__(cls,*args,**kw):if not hasattr(cls, '_instance'):desired_caps={}host ="http://localhost:4723/wd/hub"driver = webdriver.Remote(host, desired_caps) Action = ElementActions(driver, desired_caps) orig =super(Singleton, cls)cls._instance= orig.__new__(cls,*args,**kw) cls._instance.Action= Actionreturn cls._instanceclass DriverClient(Singleton):pass测试用例中调用class TestExample:def setup_class(cls):cls.Action= DriverClient().Actiondef teardown_class(cls):cls.Action.clear()def test_demo(self)unch_app()self.Action.set_text('123')class DriverClient():def init_driver(self,device_name):desired_caps={}host ="http://localhost:4723/wd/hub"driver = webdriver.Remote(host, desired_caps)Action = ElementActions(driver, desired_caps)return Action# 该函数需要放置在 conftest.py, pytest 运行时会自动拾取@pytest.fixture()def driver_setup(request):request.instance.Action= DriverClient().init_driver()def driver_teardown():request.instance.Action.clear()request.addfinalizer(driver_teardown)测试用例中调用#该装饰器会直接引入driver_setup函数@efixtures('driver_setup')class TestExample:def test_demo(self):unch_app()self.Action.set_text('123')Pytest 参数化方法1.第一种方法parametrize 装饰器参数化方法@pytest.mark.parametrize(('kewords'),[(u"小明"),(u"小红"),(u "小白")])def test_kewords(self,kewords):print(kewords)# 多个参数@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42),])def test_eval(test_input, expected):assert eval(test_input)== expected2.第二种方法,使用pytest hook 批量加参数化# conftest.pydef pytest_generate_tests(metafunc):"""使用 hook 给用例加加上参数metafunc.cls.params 对应类中的 params 参数"""try:if metafunc.cls.params and metafunc.function.__name__ i n metafunc.cls.params: ## 对应 TestClass paramsfuncarglist = metafunc.cls.params[metafunc.function._ _name__]argnames = list(funcarglist[0])metafunc.parametrize(argnames,[[funcargs[name]for n ame in argnames]for funcargs in funcarglist])except AttributeError:pass# test_demo.pyclass TestClass:""":params 对应 hook 中 metafunc.cls.params"""# params = Parameterize('TestClass.yaml').getdata()params ={'test_a':[{'a':1,'b':2},{'a':1,'b':2}],'test_b':[{'a':1,'b':2},{'a':1,'b':2}], }def test_a(self, a, b):assert a == bdef test_b(self, a, b):assert a == b使用pytest-dependency 库可以创造依赖关系当上层用例没通过,后续依赖关系用例将直接跳过,可以跨Class 类筛选如果需要跨.py 文件运行需要将site-packages/pytest_dependency.py 文件的class DependencyManager(object):"""Dependency manager, stores the results of tests."""ScopeCls ={'module':pytest.Module, 'session':pytest.Sessio n}@classmethoddef getManager(cls, item, scope='session'): # 这里修改成 ses sion如果> pip install pytest-dependencyclass TestExample(object):@pytest.mark.dependency()def test_a(self):assert False@pytest.mark.dependency()def test_b(self):assert False@pytest.mark.dependency(depends=["TestExample::test_a"])def test_c(self):# TestExample::test_a 没通过则不执行该条用例# 可以跨 Class 筛选print("Hello I am in test_c")@pytest.mark.dependency(depends=["TestExample::test_a","Tes tExample::test_b"])def test_d(self):print("Hello I am in test_d")pytest -v test_demo.py2 failed- test_1.py:6 TestExample.test_a- test_1.py:10 TestExample.test_b2 skippedPytest 自定义标记,执行用例筛选作用1.使用@pytest.mark模块给类或者函数加上标记,用于执行用例时进行筛选@pytest.mark.webtestdef test_webtest():pass@pytest.mark.apitestclass TestExample(object):def test_a(self):pass@pytest.mark.httptestdef test_b(self):pass仅执行标记webtest 的用例pytest -v -m webtestResults(0.03s):1 passed2 deselected执行标记多条用例pytest -v -m "webtest or apitest"Results (0.05s):3 passed仅不执行标记webtest 的用例pytest -v -m "not webtest"Results (0.04s):2 passed1 deselected不执行标记多条用例pytest -v -m "not webtest and not apitest" Results (0.02s):3 deselected2.根据test 节点选择用例pytest -v Test_example.py::TestClass::test_a pytest -v Test_example.py::TestClasspytest -v Test_example.py Test_example2.py3.使用pytest hook 批量标记用例# conftet.pydef pytest_collection_modifyitems(items): """获取每个函数名字,当用例中含有该字符则打上标记 """for item in items:if"http" in item.nodeid:item.add_marker(pytest.mark.http) elif "api" in item.nodeid:item.add_marker(pytest.mark.api) class TestExample(object):def test_api_1(self):passdef test_api_2(self):passdef test_http_1(self):passdef test_http_2(self):passdef test_demo(self):pass仅执行标记api 的用例pytest -v -m apiResults(0.03s):2 passed3 deselected可以看到使用批量标记之后,测试用例中只执行了带有 api 的方法用例错误处理截图,app 日志等1.第一种使用python 函数装饰器方法def monitorapp(function):"""用例装饰器,截图,日志,是否跳过等获取系统log,Android logcat、ios 使用syslog"""@wraps(function)def wrapper(self,*args,**kwargs):try:allure.dynamic.description('用例开始时间:{}'.format (datetime.datetime.now()))function(self,*args,**kwargs)self.Action.driver.get_log('logcat')except Exception as E:f = self.Action.driver.get_screenshot_as_png()allure.attach(f, '失败截图', allure.attachment_type. PNG)logcat = self.Action.driver.get_log('logcat')c ='\n'.join([i['message']for i in logcat])allure.attach(c, 'APPlog', allure.attachment_type.T EXT)raise Efinally:if self.Action.get_app_pid()!= self.Action.Apppid:raise Exception('设备进程 ID 变化,可能发生崩溃') return wrapper2.第二种使用pytest hook 方法(与方法一选一)@pytest.hookimpl(tryfirst=True, hookwrapper=True)def pytest_runtest_makereport(item, call):Action = DriverClient().Actionoutcome = yieldrep = outcome.get_result()if rep.when=="call" and rep.failed:f = Action.driver.get_screenshot_as_png()allure.attach(f, '失败截图', allure.attachment_type.PNG) logcat = Action.driver.get_log('logcat')c ='\n'.join([i['message']for i in logcat])allure.attach(c, 'APPlog', allure.attachment_type.TEXT) if Action.get_app_pid()!= Action.apppid:raise Exception('设备进程 ID 变化,可能发生崩溃') Pytest 另一些hook 的使用方法1.自定义Pytest 参数> pytest -s -all# content of conftest.pydef pytest_addoption(parser):"""自定义参数"""parser.addoption("--all", action="store_true",default="type 1",help="run all combinations")def pytest_generate_tests(metafunc):if 'param' in metafunc.fixturenames:if metafunc.config.option.all: # 这里能获取到自定义参数paramlist =[1,2,3]else:paramlist =[1,2,4]metafunc.parametrize("param",paramlist) # 给用例加参数化# 怎么在测试用例中获取自定义参数呢# content of conftest.pydef pytest_addoption(parser):"""自定义参数"""parser.addoption("--cmdopt", action="store_true",default="t ype1",help="run all combinations")@pytest.fixturedef cmdopt(request):return request.config.getoption("--cmdopt")# test_sample.py测试用例中使用def test_sample(cmdopt):if cmdopt =="type1":print("first")elif cmdopt =="type2":print("second")assert1> pytest -q --cmdopt=type2second.1 passed in 0.09 seconds2.Pytest 过滤测试目录#过滤 pytest 需要执行的文件夹或者文件名字def pytest_ignore_collect(path,config):if 'logcat' in path.dirname:return True #返回 True 则该文件不执行Pytest 用例优先级(比如优先登录什么的)@pytest.mark.run(order=1)class TestExample:def test_a(self):Pytest 用例失败重试#原始方法pytet -s test_demo.pypytet -s --lf test_demo.py #第二次执行时,只会执行失败的用例pytet -s --ll test_demo.py #第二次执行时,会执行所有用例,但会优先执行失败用例#使用第三方插件pip install pytest-rerunfailures #使用插件pytest --reruns 2 # 失败case重试两次Pytest 其他常用参数。

如何在Python中进行GUI测试和自动化

如何在Python中进行GUI测试和自动化

如何在Python中进行GUI测试和自动化GUI(图形用户界面)测试是一种用于验证应用程序的用户界面的方法。

通过模拟用户与应用程序的交互,GUI测试可以检测潜在的错误和缺陷,确保应用程序的可靠性和用户友好性。

Python是一种功能强大的编程语言,它提供了许多用于进行GUI测试和自动化的工具和库。

本文将介绍如何在Python中进行GUI测试和自动化。

一、选择适合的GUI测试框架在Python中,有多个GUI测试框架可供选择。

以下是一些常用的框架:1. Pytest-qt:这是一个针对Qt应用程序的框架,它提供了许多用于GUI测试的功能,如模拟用户输入和验证界面元素状态的方法。

2. Tkinter:这是Python自带的GUI工具包,它提供了创建和管理GUI应用程序的功能。

虽然Tkinter本身并不是一个测试框架,但你可以使用其内置的事件模拟来进行GUI测试。

3. Pyautogui:这是一个用于GUI自动化的库,它可以模拟鼠标和键盘操作。

你可以使用Pyautogui编写脚本,自动执行GUI测试任务。

二、准备测试环境在开始GUI测试之前,你需要准备一个干净的测试环境,例如安装所需的Python版本和GUI应用程序。

确保你的测试环境与你的开发环境保持一致,以便准确地测试应用程序的行为。

三、编写GUI测试脚本1. 使用Pytest-qt框架进行GUI测试Pytest-qt框架提供了一些方便的装饰器和断言,可以帮助你编写简洁和可读性高的GUI测试脚本。

以下是一个使用Pytest-qt框架编写的例子:```pythonimport pytestfrom PyQt5 import QtWidgets@pytest.fixturedef application(qtbot):app = QtWidgets.QApplication([])window = QtWidgets.QMainWindow()# 在这里创建你的应用程序窗口# ...window.show()qtbot.addWidget(window)return app, windowdef test_gui_functionality(application, qtbot):app, window = application# 在这里写你的GUI测试逻辑# ...# 示例:模拟用户点击按钮并验证结果button = window.findChild(QtWidgets.QPushButton, "my_button") qtbot.mouseClick(button, QtCore.Qt.LeftButton)assert button.text() == "Clicked!"# 示例:模拟用户输入文字并验证结果text_input = window.findChild(QtWidgets.QLineEdit,"my_text_input")text_input.setText("hello")assert text_input.text() == "hello"# ...if __name__ == "__main__":pytest.main()```在这个示例中,我们使用Pytest-qt框架编写了一个简单的GUI测试脚本。

如何利用Monkey工具进行Android自动化测试

如何利用Monkey工具进行Android自动化测试

如何利用Monkey工具进行Android自动化测试自动化测试在软件开发中起到了至关重要的作用,它可以有效地提高测试效率、节省测试时间,并且能够减少人为错误的可能性。

而在Android开发领域,Monkey工具是一种非常实用的自动化测试工具,它可以模拟用户在设备上的随机操作,从而对应用程序进行全面的测试。

本文将介绍如何使用Monkey工具进行Android自动化测试。

一、Monkey工具简介Monkey工具是Android平台提供的一种压力测试工具,它通过产生伪随机事件(如点击、滑动、触摸等)来模拟用户操作。

Monkey工具不需要源代码,只需要一个APK文件即可进行测试。

因此,它可以对任何已安装的Android应用进行测试,包括系统应用和第三方应用。

二、Monkey工具的使用步骤1. 连接设备首先,将Android设备连接到开发电脑上,确保设备处于调试模式下,并且已安装好ADB工具。

2. 启动Monkey工具在命令行窗口中输入以下命令来启动Monkey工具:```adb shell monkey <参数>```其中,参数是指定Monkey工具的具体配置和行为方式。

3. 配置参数根据测试需求,设置不同的参数来指导Monkey工具的行为。

以下是常用的参数配置示例:- `--pct-touch`:设置触摸事件的百分比。

- `--pct-motion`:设置手势事件的百分比。

- `--throttle`:设置事件之间的间隔时间,单位为毫秒。

- `--ignore-crashes`:忽略崩溃错误。

- `--ignore-timeouts`:忽略超时错误。

- `--package`:指定要测试的应用程序包名。

4. 运行Monkey测试配置完参数后,输入以下命令来运行Monkey测试:```adb shell monkey -p <应用程序包名> <事件次数>```其中,应用程序包名是指定要测试的应用程序包名,事件次数是指定Monkey工具执行事件的总次数。

移动应用UI自动化测试的技巧和工具推荐

移动应用UI自动化测试的技巧和工具推荐

移动应用UI自动化测试的技巧和工具推荐随着移动应用的普及和快速发展,用户对于应用的质量和用户体验要求也越来越高。

为了确保移动应用的正常运行,开发人员必须进行全面的测试工作。

而自动化测试作为一种高效的测试方式,越来越受到开发人员和测试人员的重视。

在移动应用UI自动化测试中,开发人员需要掌握一些技巧和工具。

下面将介绍一些常用的技巧和工具,帮助开发人员更好地进行移动应用UI自动化测试。

首先,要保证测试用例的覆盖率。

移动应用的UI界面非常多样化,不同的用户操作都可能引发不同的场景和交互效果。

因此,在编写测试用例时,要考虑尽可能多的用户操作和交互场景,充分覆盖不同的UI界面和功能模块。

其次,要选择合适的自动化测试框架和工具。

目前市面上有许多优秀的自动化测试框架和工具可供选择,如Appium、Calabash、Robot Framework等。

这些工具都具有简单易用、功能丰富的特点,可以帮助开发人员实现自动化测试流程的快速执行和结果分析。

此外,要注意选择合适的测试环境和设备。

不同的移动操作系统和设备版本对应用的兼容性和性能有不同的要求。

因此,在进行自动化测试时,要选择覆盖常用设备和操作系统版本的测试环境,确保测试结果的准确性和可靠性。

另外,对于需要进行重复测试的场景,可以使用录制回放功能来简化测试过程。

录制回放是一种将用户操作记录为脚本并可以重复执行的功能,可以大大提高测试效率。

一些自动化测试工具,如Appium和Calabash,都提供了录制回放功能,开发人员可以根据需要选择合适的功能。

此外,对于测试结果的分析和报告,也是十分重要的。

测试结果的分析可以帮助开发人员快速定位和修复问题,提高开发效率。

而测试报告可以为开发人员和测试人员提供测试进度和质量的评估依据。

因此,在进行自动化测试时,要选择支持测试结果分析和报告生成的测试工具,并灵活运用这些功能。

在进行移动应用UI自动化测试时,需要关注一些常见的问题。

例如,移动应用的UI界面随着版本更新和功能变更可能会发生变化,因此测试用例也要随之调整,确保测试用例的有效性。

常用的Android手机自动化测试工具

常用的Android手机自动化测试工具

常用的Android手机自动化测试工具Android手机是如今最多用户使用的智能手机,其相关的自动化测试工具也很受工程师的关注。

以下是店铺为你整理推荐常用的Android手机自动化测试工具,希望你喜欢。

Android手机自动化测试工具1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。

实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。

2、MonkeyRunner也是Android SDK提供的测试工具。

严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。

缺点是脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。

3、Instrumentation是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。

通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。

Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。

缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。

4、UiAutomator也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。

Python编写高质量的自动化测试用例

Python编写高质量的自动化测试用例

Python编写高质量的自动化测试用例自动化测试在软件开发过程中起到了至关重要的作用。

通过编写高质量的自动化测试用例,可以提高测试效率,减少人工测试的工作量,确保软件的质量。

本文将介绍如何使用Python语言编写高质量的自动化测试用例。

一、选择合适的自动化测试框架在开始编写自动化测试用例之前,首先需要选择一个合适的自动化测试框架。

Python有多个流行的自动化测试框架,如Selenium、Pytest和Unittest等。

根据项目需求和团队技术栈选择一个适合的框架进行编写。

二、准备测试环境在编写自动化测试用例之前,需要准备好相应的测试环境。

包括安装Python解释器、相关的测试框架和依赖库等。

确保测试环境的配置正确,能够正常运行测试脚本。

三、编写测试用例1. 设计测试用例在编写测试用例之前,需要进行测试用例的设计。

根据项目的需求和功能点,设计出多个独立、可重复执行的测试用例。

每个测试用例应该有清晰的目标和预期结果,用于验证软件的功能是否正常。

2. 使用适当的断言在编写测试用例时,使用适当的断言来验证测试结果。

Python自带的断言方法assert可以用于判断条件是否为真。

当断言条件为假时,会抛出AssertionError异常,从而标记测试用例执行失败。

3. 封装可重复使用的代码为了提高代码的可重用性,可以将一些常用的操作封装成函数或类。

例如,登录功能是项目中多个测试用例都会使用到的,可以将登录的操作封装成一个函数,供不同的测试用例调用。

4. 使用异常处理在编写测试用例时,需要考虑到可能出现的异常情况。

使用try-except语句进行异常处理,保证测试用例的健壮性。

当出现异常时,可以根据具体情况进行相应的处理,比如记录日志、截图等。

5. 数据驱动测试通过使用参数化的方式,可以实现对不同测试数据的自动化测试。

将不同的测试数据以列表或字典的形式传入测试用例中,然后通过迭代或循环的方式进行测试。

这样可以减少测试用例的重复编写,提高测试的覆盖率。

使用Python进行自动化测试

使用Python进行自动化测试

使用Python行自动化测试
Python 是一种功能强大且易于学习的编程语言,因此它非常适合用于自动化测试。

在Python 中,有许多用于自动化测试的库和框架,例如:unittest、pytest、nose、selenium 等。

以下是一些使用Python 进行自动化测试的步骤:
1.安装Python:如果您还没有安装Python,可以从Python 官网下载并安
装最新版本的Python。

2.选择自动化测试框架:选择一个适合您项目需求的自动化测试框架。

常用
的自动化测试框架有unittest、pytest、nose 等。

3.安装测试框架:使用pip 命令安装所选的测试框架。

例如,如果您选择了
unittest,则可以使用以下命令安装:pip install unittest
4.编写测试用例:使用所选的测试框架编写测试用例。

测试用例应该覆盖应
用程序的所有功能,并检查应用程序在各种情况下的行为。

5.运行测试用例:使用命令行或IDE 运行测试用例。

测试结果会显示测试用
例是否通过或失败,以及失败的原因。

6.分析测试结果:分析测试结果并确定是否需要修复应用程序或测试用例。

7.迭代测试用例:根据分析结果迭代测试用例,并重复运行测试以验证修复
是否有效。

总之,使用Python 进行自动化测试可以大大提高测试效率和质量,帮助您更快地发布更可靠的产品。

详解基于Android的Appium+Python自动化脚本编写

详解基于Android的Appium+Python自动化脚本编写

详解基于Android的Appium+Python⾃动化脚本编写1.AppiumAppium是⼀个开源测试⾃动化框架,可⽤于原⽣,混合和移动Web应⽤程序测试,它使⽤WebDriver协议驱动iOS,Android和Windows应⽤程序。

通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作⽣成相关的脚本代码。

下⾯开始Appium的配置。

appPackage和APPActivity的获取任意下载⼀个app解压但是解压出来的xml⽂件可能是乱码,所以我们需要反编译⽂件。

逆向AndroidManifest.xml下载AXMLPrinter2.jar⽂件,逆向xml⽂件:命令⾏输⼊以下命令:java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt获得以下可以查看的TXT⽂件寻找带有launcher 的Activity寻找manifest⾥⾯的packageDevicename的获取通过命令⾏输⼊ adb devices:appium的功能介绍下⾯将根据上图序号⼀⼀介绍功能:选中界⾯元素,显⽰元素相关信息模拟滑动屏幕,先点击⼀下代表触摸起始位置,在点击⼀下代表触摸结束为⽌模拟点击屏幕模拟⼿机的返回按钮刷新左边的页⾯,使之与⼿机同步记录模拟操作,⽣成相关脚本根据元素的id或者其他相关信息查找元素复制当前界⾯的xml布局⽂件退出2.Python的脚本元素定位的使⽤(1).xpath定位xpath定位是⼀种路径定位⽅式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执⾏效率⽐较低(特别是元素路径⽐较深的时候),⼀般使⽤⽐较少。

通常使⽤xpath相对路径和属性定位。

by_xpath.pyfrom find_element.capability import driverdriver.find_element_by_xpath('//android.widget.EditText[@text="请输⼊⽤户名"]').send_keys('123456')driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('123456')driver.find_element_by_xpath('//android.widget.Button').click()driver.find_element_by_xpath('//[@class="android.widget.Button"]').click()(2).classname定位classname定位是根据元素类型来进⾏定位,但是实际情况中很多元素的classname都是相同的,如⽤户名和密码都是clasName属性值都是:“android.widget.EditText” 因此只能定位第⼀个元素也就是⽤户名,⽽密码输⼊框就需要使⽤其他⽅式来定位,这样其实很鸡肋.⼀般情况下如果有id就不必使⽤classname定位。

Python的自动化测试

Python的自动化测试

Python的自动化测试Python的自动化测试近年来,自动化测试技术在软件开发领域中得到了越来越广泛的应用。

自动化测试能够提高软件测试的效率和质量,减少人工测试的成本。

而Python的自动化测试则以其灵活性、可扩展性和易学性而受到开发人员的欢迎。

一、Python自动化测试的概述Python自动化测试是指使用Python语言开发的自动化测试脚本和工具来实现软件测试过程中的自动化。

Python是一种解释型、面向对象、动态数据类型的编程语言,它具有简单、易学、可读性好、可移植性强等特点。

Python自动化测试的主要优点包括:1.灵活性:Python具有丰富的第三方库和模块,能够支持多种测试框架和工具,满足不同的测试需求。

同时,Python也支持多种测试方法,包括单元测试、集成测试、功能测试、性能测试等。

2.可扩展性:Python自动化测试可以方便地扩展和修改,根据不同的测试需求编写相应的测试脚本和测试工具,并支持测试数据的自动生成和管理。

3.易学性:Python语法简单、高效、易读,开发人员可以很快掌握Python自动化测试的编程技巧,并编写出高质量的测试代码。

4.跨平台性:Python可以运行在各种操作系统上,如Windows、Linux、Mac OS等,开发人员可以在不同平台上编写、运行、调试和维护Python自动化测试脚本。

二、Python自动化测试的应用Python自动化测试广泛应用于各种软件开发项目中,包括Web应用程序、桌面应用程序、嵌入式系统、移动应用程序等。

以下是几个常见的应用场景。

1. Web应用程序自动化测试:Python可通过Selenium WebDriver 模块实现Web应用程序的自动化测试,包括浏览器自动化测试、UI自动化测试、功能测试、性能测试等。

2. API自动化测试:Python可以通过Requests库进行API自动化测试,包括接口测试、集成测试、回归测试等。

3.移动应用程序自动化测试:Python可以通过Appium实现移动应用程序的自动化测试,包括UI测试、功能测试、性能测试等。

UI自动化代码示例

UI自动化代码示例

UI⾃动化代码⽰例import unittestfrom appium import webdriverfrom time import sleepfrom HTMLTestRunner import HTMLTestRunnerimport timefrom mon.touch_action import TouchAction# 写在前⾯,将⼿机USB调试权限打开,将充电不熄屏打开,已经绑定⼿环,更好AGPSclass Dttest(unittest.TestCase):@classmethoddef setUpClass(cls):print("start setup")desired_caps = {'platformName': 'Android', # 被测⼿机是安卓'platformVersion': '10', # ⼿机安卓版本'deviceName': 'xxx', # 设备名,安卓⼿机可以随意填写'appPackage': 'com.zjw.apps3pluspro', # 启动APP Package名称'appActivity': '.SplashActivity', # 启动Activity名称'unicodeKeyboard': True, # 使⽤⾃带输⼊法,输⼊中⽂时填True'resetKeyboard': True, # 执⾏完程序恢复原来输⼊法'noReset': True, # 不要重置App'newCommandTimeout': 6000,'automationName': 'UiAutomator2'}# 连接Appium Server,初始化⾃动化环境cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 设置缺省等待时间cls.driver.implicitly_wait(10)cls.driver.find_element_by_class_name("android.widget.Button").click() # 测试版本加本⾏代码,⾮测试版本不⽤ @classmethoddef tearDownClass(cls):print("over")def test_clickmbsd(self):"""" 点击:⽬标设定 """self.driver.find_element_by_id("layoutPen").click()self.bt = self.driver.find_element_by_id('public_head_title')self.assertEqual(self.bt.text, "⽬标设定")def test_ydmbqd(self):"""" 点击运动⽬标,滑动后,‘确定’ """self.driver.find_element_by_id("layoutStep").click()sleep(1)self.driver.swipe(550, 2000, 550, 1800, duration=3000)sleep(2)self.driver.find_element_by_id("tvOk").click()self.bt = self.driver.find_element_by_id('public_head_title')self.assertEqual(self.bt.text, "⽬标设定")def test_ydmbqx(self):"""" 点击:运动⽬标,滑动后,‘取消’ """self.driver.find_element_by_id("layoutStep").click()sleep(1)self.driver.swipe(550, 2000, 550, 1800, duration=3000)sleep(1)self.driver.find_element_by_id("tvCancel").click()self.bt = self.driver.find_element_by_id('public_head_title')self.assertEqual(self.bt.text, "⽬标设定")def test_smmbqd(self):"""" 点击:睡眠⽬标,滑动后,‘确定’ """self.driver.find_element_by_id("layoutSleep").click()sleep(1)self.driver.swipe(550, 2000, 550, 1800, duration=3000)sleep(2)self.driver.find_element_by_id("tvOk").click()self.bt = self.driver.find_element_by_id('public_head_title')self.assertEqual(self.bt.text, "⽬标设定")def test_smmbqx(self):"""" 点击:睡眠⽬标,滑动后,‘取消’ """self.driver.find_element_by_id("layoutSleep").click()sleep(1)self.driver.swipe(550, 2000, 550, 1800, duration=3000)sleep(1)self.driver.find_element_by_id("tvCancel").click()self.bt = self.driver.find_element_by_id('public_head_title')self.assertEqual(self.bt.text, "⽬标设定")if __name__ == '__main__':suite = unittest.TestSuite()suite.addTest(Dttest("test_clickmbsd"))suite.addTest(Dttest("test_ydmbqd"))suite.addTest(Dttest("test_ydmbqx"))suite.addTest(Dttest("test_smmbqd"))suite.addTest(Dttest("test_smmbqx"))# unittest.TextTestRunner(verbosity=1).run(suite)now_time = time.strftime("%Y-%m-%d %H_%M_%S")fp = open('./report/' + now_time + 'result.html', 'wb')runner = HTMLTestRunner(stream=fp,title="3+PRO",description="运⾏环境:Windows 10, redmi10X" )runner.run(suite)fp.close()。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.项目简介
• 本项目是基于python+appium+unittest中的一些方法搭建的,整体实现是PO (Page Objects)模式,也就是页面对象设计模式。用该模式的好处就是实 现了页面的元素和测试用例分离,后期维护时只要修改测试用对象为单位 • 1.建立项目文件夹,建立PO架构文件夹
3.1 PO结构搭建--示例
4.二次封装方法函数--示例
• 1.BasePage 类下定义了一些公用方法函数以及二次封装的方法
函数
4.1二次封装方法函数--示例
5.建立页面对象
• 1.建立页面对象类(从BasePage继承)
• 新建页面文件,例如:商城页面:ShopPage.py • 建立页面对象类,例如:class ShopPage(BasePage):
6.1编写页面测试用例--初始化驱动示例

6.2编写页面测试用例--实例化示例

6.3编写页面测试用例--编写页面测试用例示例

6.4编写页面测试用例--配置初始化文件示例

7.执行测试用例
• 1.定义测试用例集方法函数
• 2.添加测试用例
• 3.定义主函数
• 设置是否生成测试报告(测试报告html格式) • 执行测试用例
• Config-->存放公共配置文件 • Pages-->存放页面对象 • Picture-->存放测试截图 • Test_Result-->存放测试结果报告 • TestCase-->存放页面测试用例 • TestRunner-->存放用例执行函数
• 2.在相应文件夹下新建所需python文件 • 3.填充文件内容,编写代码
基于Python+Appium框架 APP UI自动化测试
测试部:程晓淼——2019.12.24
1.环境搭建——所需安装包
• 1.jdk1.8.0 (64位) • 2.android-sdk_r24.3.4-windows • 3.python:3.6 • 4.appium:desktop V1.6.2 • 5.Node.js:node-v4.4.7-x64 • 6.Appium-Python-Client • 7.Python 编辑器:Pycharm
• 链接测试手机(打开usb调试) • 启动Appium 服务 • Run TestRunner.py
7.1执行测试用例--添加用例示例
7.2执行测试用例--定义主函数示例
7.3执行测试用例--启动Appium服务,执行测试示例
8.查看测试报告--总览
• 1.设置打印结果到测试报告 • 2.测试完成后,TestResult目录下查看测试报告
• 报告名称:result_yyyymmddhhmmss.html
8.1查看测试报告--详情
谢谢!
2.定位页面元素并提取元素
• 工具:uiautomator.bat (android sdk 包自带) • 方法:by_id、by_xpath、by_class等
• 3.定义页面业务操作方法函数
• 常用业务操作方法:click、send_keys、swipe等
5.1建立页面对象--定位元素示例(by_id)

5.2建立页面对象--定位页面元素示例(by_xpath)

5.3.建立页面对象--提取元素、定义操作函数示例

5.4.建立页面对象--配置初始化文件示例

6.编写页面测试用例
• 1.建立页面测试用例类(继承unittest) • 2.初始化驱动 • 3.实例化需要调用的页面类 • 4.根据页面业务设计测试用例
相关文档
最新文档