下面我们开始第一个简单的 Android UI 自动化测试
1. 使用 adb 命令连接真机或模拟器
2. 打开 uiautomatorviewer 工具
3. 使用 uiautomatorviewer 工具获取应用的元素进行定位
4. 简单介绍 unittest 框架的使用方法
5. 使用 Python 编写猫宁考勤应用注册模块的自动化测试
1. 使用 adb 命令连接真机或模拟器:
手机 USB 连接电脑,进入开发者模式;
cmd 命令:adb devices ,查看手机是否连接
显示错误
这是因为 adb 的端口被占用,我们需要查看是什么应用占用了这个端口(5037 为 adb 默认端口)
cmd 命令 : netstat -aon|findstr "5037"
可以看到占用 5037 端口对应的程序的 PID 号为 8388;
cmd 命令 : tasklist|findstr "8388"
可以看出 8388 对应的程序为 kadb.exe,说明该程序正在使用 5037 端口;
这时我们需要在任务管理器中结束 kadb.exe 进程,按快捷键 "Ctrl+Shift+Esc" 调出 Windows 任务管理器,找到 "kadb.exe",单击下方的结束进程即可!
我们再次运行 cmd 命令:adb devices
这一步成功后我们才能运行 sdk 自带的 uiautomatorviewer;
我们需要用 uiautomatorviewer 工具来获取元素,用于定位。
cmd 命令:uiautomatorviewer,打开 uiautomatorviewer 界面
或者找到 sdk 目录:sdk\tools 中找到 uiautomatorviewer.bat 文件双击运行
2. 打开 uiautomatorviewer 工具
我们可以根据 text,resource-id,class 等元素进行定位
3. 使用 uiautomatorviewer 工具获取应用的元素进行定位
这里我使用 python 自带的 IDLE 进行编写测试脚本,打开 python 文件找到 IDLE(python GUI)双击打开,如图:
4. 简单介绍 unittest 框架的使用方法
- # - *-coding: utf - 8 - *-from uiautomator import device as d import unittest class Mytest(unittest.TestCase) : #初始化工作def setUp(self) : print "--------------初始化工作"#退出清理工作def tearDown(self) : print "--------------退出清理工作"#测试点击猫宁考勤
- case def test_login(self):
- d(text = "猫宁考勤").click() print "--------------测试1"#测试2 def test_z(self) : print "--------------测试2"#这里你可以写你的第二个测试用例,#测试3 def test_w(self) : print "--------------测试3"#这里你可以写你的第三个测试用例。。。。。。。。。。。。。
- if __name__ == '__main__': unittest.main()
Testing started at 21:14 …
————–初始化工作
————–测试 1
————–退出清理工作
————–初始化工作
————–测试 3
————–退出清理工作
————–初始化工作
————–测试 2
————–退出清理工作
Process finished with exit code 0
从结果中我们可以看出 unittest 框架的运行方式为:
setUp 测试 1 tearDown
setUp 测试 2 tearDown
setUp 测试 3 tearDown
5. 使用 Python 编写猫宁考勤应用注册模块的自动化测试
- # - *-coding: utf - 8 - *-from uiautomator import device as d import time import unittest class MyTestSuite(unittest.TestCase) : #初始化工作def setUp(self) : print "--------------初始化工作"#退出清理工作def tearDown(self) : print "--------------退出清理工作"# * **************************方法 * *************************************#判断控件是否存在 & text def check_controls_exists(self, controls_text) : if d(text = controls_text).exists: return 1
- else: return 0#判断按钮是否置灰 & text & clickable def check_controls_click_text(self, controls_text) : if d(text = controls_text).info.get("clickable") is True: return 1
- else: return 0#assertIn(a, b) a in b def check_ainb(self, resourceid, b) : if d(resourceId = resourceid).info.get("text") in b: return 1
- else: return 0# * **********************************************************#注册模块def test_Aregister(self) : try: time.sleep(2)#猫宁考勤开启全新时代self.assertEqual(self.check_controls_click_text("注册"), 1, u "猫宁考勤开启全新时代")#猫宁考勤开启全新时代--》点击注册按钮进入注册猫宁界面d(text = "注册").click() time.sleep(3)#注册猫宁界面self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_phone", "请输入手机号码"), 1, u "注册页面-》请输入手机号码") self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_verifycode", "请输入验证码"), 1, u "注册页面-》请输入验证码") self.assertEqual(self.check_controls_click_text("获取验证码"), 0, u "注册页面-》获取验证码") self.assertEqual(self.check_controls_click_text("《中科爱讯服务协议》"), 1, u "注册页面-》《中科爱讯服务协议》") self.assertEqual(self.check_controls_click_text("注册"), 0, u "注册页面-》注册") time.sleep(2)#《中科爱讯服务协议》d(text = "《中科爱讯服务协议》").click() time.sleep(2) self.assertEqual(self.check_ainb("com.isentech.attendancet:id/title", "服务协议"), 1, u "注册页面-》服务协议") time.sleep(1) d(resourceId = "com.isentech.attendancet:id/title_back").click() time.sleep(1)#手机号不输入是否能注册d(text = "注册").click() time.sleep(3)#手机号只输入1个数字是否能注册 & 只输入1个数字是否能获取验证码d(resourceId = "com.isentech.attendancet:id/regis_phone").set_text("1") self.assertEqual(self.check_controls_click_text("获取验证码"), 0) time.sleep(1) d(text = "注册").click() time.sleep(1) d(resourceId = "com.isentech.attendancet:id/regis_phone").clear_text() time.sleep(1)#只输入5个数字是否能获取验证码d(resourceId = "com.isentech.attendancet:id/regis_phone").set_text("11111") self.assertEqual(self.check_controls_click_text("获取验证码"), 0) time.sleep(1) d(resourceId = "com.isentech.attendancet:id/regis_phone").clear_text() time.sleep(1)#只输入手机号是否能注册d(resourceId = "com.isentech.attendancet:id/regis_phone").set_text(phone_number) self.assertEqual(self.check_controls_click_text("注册"), 0) time.sleep(1) d(text = "注册").click() time.sleep(1)#输入正确的验证码 & 获取验证码是否高亮d(resourceId = "com.isentech.attendancet:id/regis_verifycode").set_text("5648") time.sleep(1) self.assertEqual(self.check_controls_click_text("获取验证码"), 1) time.sleep(2)#密码只输入1个数字是否能注册 & 注册按钮是否高亮d(resourceId = "com.isentech.attendancet:id/regis_pass").set_text("1") d(resourceId = "com.isentech.attendancet:id/regis_passAgain").set_text("1") time.sleep(1) self.assertEqual(self.check_controls_click_text("注册"), 0, u "密码只输入1个数字是否能注册") time.sleep(1) d(resourceId = "com.isentech.attendancet:id/regis_pass").clear_text() d(resourceId = "com.isentech.attendancet:id/regis_passAgain").clear_text() time.sleep(1)#输入不相同的密码是否能注册d(resourceId = "com.isentech.attendancet:id/regis_pass").set_text("123456") d(resourceId = "com.isentech.attendancet:id/regis_passAgain").set_text("12345") time.sleep(1) self.assertEqual(self.check_controls_click_text("注册"), 0, u "输入不相同的密码是否能注册") time.sleep(1) d(resourceId = "com.isentech.attendancet:id/regis_pass").clear_text() d(resourceId = "com.isentech.attendancet:id/regis_passAgain").clear_text() time.sleep(1)#输入正确的密码是否能注册 & 我已同意是否打钩d(resourceId = "com.isentech.attendancet:id/regis_pass").set_text("123456") d(resourceId = "com.isentech.attendancet:id/regis_passAgain").set_text("123456") time.sleep(1) self.assertEqual(self.check_controls_click_resourceId("com.isentech.attendancet:id/regis_agree"), 1) self.assertEqual(self.check_controls_click_text("注册"), 1) time.sleep(2) d(text = "注册").click() time.sleep(8) except Exception,
- e: print u "Error: 注册模块有问题\n",
- e def test_app() : test_unit = unittest.TestSuite() test_unit.addTest(MyTestSuite("test_Aregister")) if __name__ == "__main__": #测试app unittest.main()
本人刚开始写博客,如有写的不明白之处可以加本人 QQ 进行学习交流:1093689803
或留言进行询问
来源: http://lib.csdn.net/article/python/41929