使用Python进行Android自动化测试

下面我们开始第一个简单的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()

uiautomator详细用法请参考这篇文章:https://github.com/xiaocong/uiautomator

本人刚开始写博客,如有写的不明白之处可以加本人QQ进行学习交流:1093689803

或留言进行询问

时间: 2024-08-26 10:09:05

使用Python进行Android自动化测试的相关文章

Android 自动化测试(3)<monkeyrunner> 根据ID查找对象&touch&type (python)

我在之前的两篇文章中用java来实现过 Android 自动化测试(1)如何安装和卸载一个应用(java).Android 自动化测试(2)根据ID查找对象(java). 但是本质上都是用monkeyrunner对应的java lib 来实现的,但是相关的文档非常少,如果真的要用monkeyrunner来做功能性的自动化测试,强烈还是推荐使用python语言 1.monkey runner The monkeyrunner tool provides an API for writing pro

Android 自动化测试框架

Android常用的自动化测试工具框架: Monkey,MonkeyRunner,UIAutomator,Robotium,Appium,Monkey Talk 但是这些工具框架都有什么关系呢,先通过一张图来了解一下吧.(图是某博客上借过来的) 是不是一脸懵逼,不知道这是什么鬼.下面详细了解一下. 一.Monkey 是Android SDK自带的测试工具,是一个命令行工具,可以运行在模拟器中或者实际设备中,它向系统发送伪随机的用户事件流(如按键输入,触摸屏输入,手势输入等),实现对正在开发的应用

Android自动化测试解决方案

现在,已经有大量的Android自动化测试架构或工具可供我们使用,其中包括:Activity Instrumentation, MonkeyRunner, Robotium, 以及Robolectric.另外LessPainful也提供服务来进行真实设备上的自动化测试. Android自身提供了对instrumentation测试的基本支持,其中之一就是位于android.test包内的ActivityInstrumentationTestCase2类,它扩展了JUnit的TestCase类来提

使用Adt自带的工具进行Android自动化测试(二)

在这个系列的上一篇文章中,我们介绍了Monkey的用法,这篇文章将继续介绍Adt自带的另外一个自动化工具MonkeyRunner MonkeyRunner和Monkey的关系 在这个系列的上一篇文章中,我们介绍了Monkey最常规的一种用法,即进行完全随机的测试(点击文末"阅读原文"可以打开这篇文章查看).在这种情况下,Monkey会自己产生一些随机的操作指令给自己执行.但是如果想要按照一个特定的指令序列执行,就要借助MonkeyRunner. MonkeyRunner是一个运行于PC

解放双手——Android自动化测试

解放程序猿宝贵的右手(或者是左手) --Android自动化测试技巧 Google大神镇楼 : http://developer.android.com/tools/testing-support-library/index.html#UIAutomator 前言: 觉得文章太长不想往后翻的朋友,你们会后悔的,当然,你也可以选择先看后面的,你会觉得很爽,但是相信我,你还是会回来看前面的.那么,还是慢慢往后翻吧. 导入: 人们懒的走路,才创造了汽车: 人们懒的爬楼,才创造了电梯: 人们懒的扫地,才

Android 自动化测试

前言: 现在Android开发非常红火,Java环境下敏捷开发是不二选择.而敏捷开发都是测试驱动.所以,最近研究了一下Android下的各种自动化测试手段.本文重点在于面上的比较而非点上的细节.时间比较短,所以很可能理解很不充分. 测试手段1:CTS 用来确保某设备符合Android兼容性规范. CTS原来只对OHA联盟开放.最近Google把它Release出来了.似乎做过一些裁剪,比如针对Java虚拟机的测试,似乎被删除了,但我们一般用不着这么高深的. 针对每个版本,比如2.1,2.2,Go

Android 自动化测试(4)<uiautomator> 单元测试

在之前的系列文章中,我介绍过用java来实现过 Android 自动化测试(1)如何安装和卸载一个应用(java).Android 自动化测试(2)根据ID查找对象(java):然后又介绍了用python语言来实现Android 自动化测试(3) 根据ID查找对象&touch&type (python).还说过后续要写点关于单元测试和代码覆盖测试的文章.今天要介绍的就是单元测试. 1. 概要 做过java单元测试的同学,使用Android的单元测试比较简单,参见 如何进行Android单元

Android自动化测试工具实现简述

前言 自动化测试在产品开发和测试中都有着非常重要的作用.在产品开发阶段,可靠又重复性地运行以确保没有引进回归问题:在产品测试阶段,可以节省人力成本和时间成本,并能保证更大范围的覆盖.Android自动化测试工具同样可以节省不少人力和时间成本,对其研究和实现对于提高测试效率具有一定的意义.目前市面上也有不少Android自动化测试工具,本人在现有工具的基础上,加上自己的理解和实践向大家介绍自动化测试工具的原理和实现. 了解自动化测试的一定对Robotium并不陌生,Robotium是一款国外的An

Android 自动化测试(2)根据ID查找对象(java)

之前一篇文章写的是 Android 自动化测试(1)如何安装和卸载一个应用(java) ,下面再探索一下如果在普通java应用程序中,根据ID来查找对象 1.类库依赖: The library dependencies are: chimpchat.jar,common.jar,ddmlib.jar,guava-13.0.1.jar,sdklib.jar,hierchyviewer2lib.jar They can all be found in the sdk/tools/lib subdir