Appium使用教程_Android篇

by admin on 2020年1月17日

#-*- coding:UTF-8 -*-  #
”’
Created on 2016-4-8
 
@author: poptest
”’
import time
from appium import webdriver

前言:

Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android
平台上的原生应用,web 应用和混合应用。


一、Appium介绍

class CommonFunction(object):
        #接收用户名、电话、地址
    def addgoodsaddress(self,revName,revTel,revAddr):
        time.sleep(3)
        #点击头像、登陆进去
       
dr.find_element_by_id(“com.subject.zhongchou:id/avatar_img”).click()
        time.sleep(2)
        #点击收货地址
       
dr.find_element_by_id(“com.subject.zhongchou:id/address_layout”).click()
        time.sleep(2)
        #点击添加收货地址
       
#dr.find_element_by_id(“com.subject.zhongchou:id/add_address_btn”).click()
        dr.find_element_by_android_uiautomator(“new
UiSelector().text(“添加收货地址”)”).click()
        time.sleep(2)
        #收件人
       
dr.find_element_by_id(“com.subject.zhongchou:id/add_address_name_edit”).send_keys(revName)
        time.sleep(2)
        #输入手机号
       
dr.find_element_by_id(“com.subject.zhongchou:id/add_address_tel_edit”).send_keys(revTel)
        time.sleep(2)
        #点击选择省份
        dr.find_element_by_id(“android:id/text1”).click()
        time.sleep(2)
        #滑屏坐标,上下滑屏  需要滑屏次,才能找见需要的省份
        dr.swipe(400,70,460,0,500)
        time.sleep(2)    
        dr.swipe(460,1200,460,200,500)
        time.sleep(2)
        dr.swipe(460,1200,460,200,500)
        time.sleep(2)
        #找见北京,点击选择
        dr.find_element_by_android_uiautomator(“new
UiSelector().text(“北京”)”).click()
        time.sleep(2)
        
        #选择市区
       
dr.find_element_by_id(“com.subject.zhongchou:id/add_address_city_name_text”).click()
        time.sleep(2)
        dr.swipe(400,1050,400,350,500)
        #找见昌平区
        dr.find_element_by_android_uiautomator(“new
UiSelector().text(“昌平区”)”).click()
    
        #输入地址
       
dr.find_element_by_id(“com.subject.zhongchou:id/add_address_detail_edit”).send_keys(revAddr)
        time.sleep(1)
        #点击保存
       
dr.find_element_by_id(“com.subject.zhongchou:id/save_text”).click()
        #接收电话、密码
    
    def exit(self):
        
        dr.quit()
    
    
    def login(self,revTel,revPsd):
        #点击我
       
dr.find_elements_by_id(“com.subject.zhongchou:id/item_name”)[1].click()
        time.sleep(3)
        #点击马上登录
       
dr.find_element_by_id(“com.subject.zhongchou:id/login_now_tv”).click()
        time.sleep(3)
        #输入手机号
       
dr.find_element_by_id(“com.subject.zhongchou:id/loginnumber_phones”).send_keys(revTel)
        time.sleep(2)
        #输入密码
       
dr.find_element_by_id(“com.subject.zhongchou:id/loginnumber_password”).send_keys(revPsd)
        time.sleep(2)
        #点击登录
       
dr.find_element_by_id(“com.subject.zhongchou:id/go_numberlogin”).click()
    def enterApp(self):
        global dr    
        descried_caps={}
        #设置输入法
        descried_caps[“unicodeKeyboard”] = “True”
        descried_caps[“resetKeyboard”] = “True”
        #传输设备号   
        descried_caps[‘device’]=’2014813′
        descried_caps[‘platformName’]=’Android’

一、环境配置

1、安装Node.js

https://nodejs.org/

2、安装Appium

 

3、安装Android SDK

http://tools.android-studio.org/index.php/sdk

4、安装Python-client

pip3 install Appium-Python-Client

5、安装Appium-client

npm install wd

最后,打开命令行,输入“appium-doctor”命令,如果出现以下提示,说明你Appium所需要的各项环境都已准备完成。


Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用。

#-*- coding:UTF-8 -*-  #
'''
Created on 2016-4-8

@author: poptest
'''
import unittest,time
from ShareLibModel import CommonFunction33
P = CommonFunction33.CommonFunction()
class Test(unittest.TestCase):
    def setUp(self):
        P.enterApp()

    def tearDown(self):
        P.exit()



    def testLogin(self):
        P.login("18513253584","111111")
        time.sleep(2)
        P.addgoodsaddress(u"小红","18513253584",u"北京市昌平区")

    def testAddr(self):
        P.login("18513253584","111111")
        time.sleep(2)
        P.addgoodsaddress(u"王亚萍","18513253584",u"北京市昌平区")


#流程为setup-testAddr-teardown,第二遍执行setup-testLogin-teardown. 

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

二、服务关键字

Desired Capabilities在启动session的时候是必须提供的。

Desired Capabilities本质上是以key
value字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。

desired_caps = {}

desired_caps[‘platformName’] =’Android’

desired_caps[‘platformVersion’] =’6.0.1′

desired_caps[‘deviceName’] =’e0bbc8b7′

desired_caps[‘appPackage’] =’com.ximalaya.ting.android’

desired_caps[‘appActivity’]
=’com.ximalaya.ting.android.host.activity.WelComeActivity’

desired_caps[“unicodeKeyboard”] =”True”

desired_caps[“resetKeyboard”] =”True”

self.driver = webdriver.Remote(”,
desired_caps)

它告诉appium Server这样一些事情:

deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator,iPad
Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4…

automationName:使用哪种自动化引擎。appium(默认)还是Selendroid。

•platformName:使用哪种移动平台。iOS, Android, orFirefoxOS。

•platformVersion:指定平台的系统版本。例如指的Android平台,版本为5.1。

•appActivity:待测试的app的Activity名字。比如MainActivity、.Settings。注意,原生app的话要在activity前加个”.“。

•appPackage:待测试的app的Java package。比如com.example.android.myApp,
com.android.settings。

其中:

aapt dump badging <file.apk>

可获取appActivity,appPackage等~~


1、Appium 理念

        descried_caps[‘deviceName’]=’HM2014813′
        descried_caps[‘version’]=’5.1′
        #找见appium的IP地址和端口号     
        dr =
webdriver.Remote(“)
        time.sleep(5)

三、定位控件

1、ID定位

使用方法:driver.find_element_by_id(‘com.android.calculator2:id/formula’)

2、name定位

使用方法:driver.find_element_by_name(“9”))

3、class name定位

使用方法:driver.find_element_by_class_name(“android.widget.Button”))

4、XPath定位

使用方法:用class的属性来替代做标签的名字。

driver.find_element_by.xpath(“//android.view.ViewGroup/android.widget.Button”)

当果如果出现class相同的情况下可以用控件的属性值进行区分。

driver.find_element_by_xpath(“//android.widget.Button[contains(@text,’7′)]”).click();

driver.find_element_by_xpath(”//android.widget.Button[contains(@content-desc,’times’)]”).click();

driver.find_element_by_xpath(“//android.widget.Button[contains(@text,’7′)]”).click();

driver.ffind_element_by_xpath(“//android.widget.Button[contains(@content-desc,’equals’)]”).click();

XPath在Appium上的用法依然很强大,有时需要写更臭更长的定位语法,因为APP上元素的class命令本来就长,再加上多层级,结果可想而知。

5、Accessibility ID定位

使用方法:其实,我们的核心是要找到元素的contentDescription属性。它就是元素的content-desc。

driver.find_element_by_accessibility_id(“plus”).click();

6、android uiautomator定位

使用方法:

一个元素的任意属性都可以通过android
uiautomator方法来进行定位,但要保证这种定位方式的唯一性。

driver.find_element_by_android_uiautomator(“new
UiSelector().text(”8″)”).click();

driver.find_element_by_android_uiautomator(“new
UiSelector().description(”plus”)”).click();


Appium是基于以下的四个理念设计来满足移动平台测试自动化的要求的:

四、应用操作

1、安装应用

installApp()

安装应用到设备中去。需要apk包的路径。

2、卸载应用

removeApp()

从设备中删除一个应用。

3、关闭应用

closeApp()

关闭打开的应用,默认关闭当前打开的应用,所以不需要入参。这个方法并非真正的关闭应用,相当于按home键将应用置于后台,可以通过launchApp()再次启动。

4、启动应用

launchApp()

启动应用。你一定很迷惑,不是在初始化的配置信息已经指定了应用,脚本运行的时候就需要启动应用,为什么还要有这个方法去启动应用呢?重新启动应用也是一个测试点,该方法需要配合closeApp()使用的。

5、检查应用是否安装

isAppInstalled()

检查应用是否已经安装。需要传参应用包的名字。返回结果为Ture或False。

6、将应用置于后台

runAppInBackground()

将当前活跃的应用程序发送到后台。这个方法需要入参,需要指定应用置于后台的时长。

7、应用重置

resetApp()

重置当前被测程序到出始化状态。该方法不需要入参。


1)您不应该因为需要自动化测试您的应用而不得不以任何形式去重新编译或者修改你的app

五、键盘操作

1、SendKeys()方法

driver.find_element_by_name(“Name”).send_keys(“jack”);

2、PressKeyCode()方法

除此之外,Appium扩展提供了pressKeyCode()方法。该方法Android特有。

发送一个键码的操作。(键码对照表请自行百度,此处不展示了。)

driver.press_keycode(3)//点击Android的HOME键

driver.press_keycode(27)//点击拍照键

3、输入法问题:

必须使用appium自带键盘,并添加:

desired_caps[“unicodeKeyboard”] = “True”

desired_caps[“resetKeyboard”] = “True”


2)您不应该把自己固定在一门特定的语言和一个特定的框架上去实现和运行你的测试

六、TouchAction操作

Appium的辅助类,主要针对手势操作,比如滑动、长按、拖动等。

1、按压控件press()

开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。

press(WebElement el, int x, int y)

2、长按控件longPress()

开始按压一个元素或坐标点(x,y)。相比press()方法,longPress()多了一个入参,既然长按,得有按的时间吧。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。

longPress(WebElement el, int x, int y, Duration duration)

3、点击控件tap()

对一个元素或控件执行点击操作。用法参考press()。

tap(WebElement el, int x, int y)

4、移动moveTo()

将指针(光标)从过去指向指定的元素或点。

movTo(WebElement el, int x, int y)

5、暂停wait()

暂停脚本的执行,单位为毫秒。

action.wait(1000);


3)当说到测试自动化APIs的时候,一个移动测试框架不应该做“重新发明轮子”的事情,

七、其他操作

其它操作针对移动设备上特有的一些操作。

1、熄屏

方法:lockDevice()

点击电源键熄灭屏幕。

在iOS设备可以设置熄屏一段时间。Android上面不带参数,所以熄屏之后就不会再点亮屏幕了。

driver.lockDevice(1000);// iOS

driver.lockDriice();//Android

2、收起键盘

方法:hideKeyboard()

收起键盘,这个方法很有用,当我们对一个输入框输入完成后,需要将键盘收起,再切换到一下输入框进行输入。

driver.hideKeyboard();//收起键盘

3、滑动

方法:swipe()

模拟用户滑动。将控件或元素从一个位置(x,y)拖动到另一个位置(x,y)。

swipe(int startx, int starty, int endx, int endy, int duration)

* start_x:开始滑动的x坐标。* start_y:开始滑动的y坐标。

* end_x:结束滑动的x坐标。* end_y:结束滑动的y坐标。

* duration:持续时间。

例:driver.swipe(75, 500, 75, 0, 800);

4、截屏

方法:get_screenshot_as_file()

用法:driver.get_screenshot_as_file(‘../screenshot/foo.png’),参数为保存的图片路径和名称

5、获取控件各种属性

方法:get_attribute()

用法: driver.find_element_by_id().get_attribute(name),

name即是左侧的标志(class,package,checkable,checked….),

可获取的字符串类型:

name(返回content-desc或text)

text(返回text)

className(返回class,只有API=>18才能支持)

resourceId(返回resource-id,只有API=>18才能支持)


4)一个移动测试自动化框架应该是开源的,无论是在精神上,实际上,还是名义上!

八、unittest之断言

在unittest单元测试框架中,TestCase类提供了一些方法来检查并报告故障:

>>assertEqual(first, second, msg=None)

判断first和second的值是否相等,如果不相等则测试失败,msg用于定义失败后所抛出的异常信息。

>>assertNotEqual(first, second, msg=None)

测试first和second不相等,如果相等,则测试失败。

>>assertTure(expr,msg=None)

>>assertFalse(expr,msg=None)

测试expr为Ture(或为False)

>>assertIs(first, second, msg=None)

>>assertIsNot(first, second, msg=None)

测试的first和second是(或不是)相同的对象。

>>assertIsNone(expr, msg=None)

>>assertIsNotNone(expr, msg=None)

测试expr是(或不是)为None

>>assertIn(first, second, msg=None)

>>assertNotIn(first, second, msg=None)

测试first是(或不是)在second中。second包含是否包含first。


2、使用Appium进行自动化测试有两个好处

九、实例代码(例子app:喜马拉雅FM)

import os

import unittest

from appium import webdriver

from time import sleep

# Returns abs path relative to this file and not cwd

PATH =lambdap: os.path.abspath(

os.path.join(os.path.dirname(__file__), p)

)

class Contacts Android Tests(unittest.TestCase):

def setUp(self): 

desired_caps = {}

desired_caps[‘platformName’] =’Android’

desired_caps[‘platformVersion’] =’6.0.1′

desired_caps[‘deviceName’] =’e0bbc8b7′

desired_caps[‘appPackage’] =’com.ximalaya.ting.android’

desired_caps[‘appActivity’]
=’com.ximalaya.ting.android.host.activity.WelComeActivity’

desired_caps[“unicodeKeyboard”] =”True”

desired_caps[“resetKeyboard”] =”True”

self.driver = webdriver.Remote(”,
desired_caps)

sleep(6)

def tearDown(self):

self.driver.close_app()

self.driver.quit()

deftest_Login(self):

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/tab_myspace’).click()

sleep(2)

self.driver.find_element_by_accessibility_id(‘设置’).click()

sleep(2)

width =self.driver.get_window_size()[‘width’]

height =self.driver.get_window_size()[‘height’]

self.driver.swipe(width /2, height *7/8, width /2, height *4/8,1000)

#
不同的手机分辨率不同,所以一个坐标如果用另一个分辨率不同的手机可能位置就有所变化了,为了让apppium
更好的兼容不同分辨率的设备,

# 在执行滑动前先获取屏幕的分辨率。

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_tv_login’).click()

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_username’).send_keys(‘18500425217’)

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_password’).send_keys(‘wj1234’)

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_login’).click()

sleep(4)

text
=self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/tab_myspace’).text

self.assertEqual(text,’我的’)

deftest_Search(self):

sleep(3)

message
=self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_item_finding_title’).text

self.assertEqual(message,’天天好书’)

self.driver.find_element_by_accessibility_id(“搜索”).click()

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_search_et’).send_keys(‘段子’)

self.driver.find_element_by_id(‘com.ximalaya.ting.android:id/main_search_button’).click()

self.driver.get_screenshot_as_file(‘/Users/wangjuan/截图图库/1.jpg’)

self.driver.press_keycode(4)

self.assertEqual(message,’天天好书’)

if__name__ ==’__main__’:

suite =
unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)

unittest.TextTestRunner(verbosity=2).run(suite)


以上,希望对你有所帮助~~

Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用。

Appium支持Selenium
WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium
WebDriver的Api。Appium支持任何一种测试框架.Appium实现了真正的跨平台自动化测试。(本文主要介绍Python的用法)

3、Appium架构

Appium 是一个用Node.js编写的HTTP server,它创建、并管理多个 WebDriver
sessions 来和不同平台交互,如 iOS ,Android等等. 

Appium 开始一个测试后,就会在被测设备(手机)上启动一个 server
,监听来自 Appium server的指令. 每种平台像 iOS
和Android都有不同的运行、和交互方式。所以Appium会用某个桩程序“侵入”该平台,并接受指令,来完成测试用例的运行。

二、Appium环境搭建(Android)

1、首先需要准备

1) jdk(步骤不再啰嗦)

2) android
SDK,下载地址:
tools,可能需要FQ,提供一个国内下载地址:

3) appium,下载地址:

4) nodejs,下载地址:

5) appium
lib,下载地址:http://appium.io/downloads.html

     选择Python版本的Lib: Appium-Python-Client-0.22.tar.gz

由于Appium依赖于Selemium,所以还要下载 Selemium Lib:
selenium-2.53.2.tar.gzhttps://pypi.python.org/pypi/selenium

6) python,
下载地址:https://www.python.org/,
下载2.X 的版本。

上述软件都准备好后,则进入搭建步骤。

2、安装、配置

将上述软件依次安装。

1) android sdk安装完毕后,需要配置环境变量

新建ANDROID_HOME    D:ProgramFiles (x86)Androidandroid-sdk

在PATH中添加:%ANDROID_HOME%platform-tools;%ANDROID_HOME%tools;

2)  nodejs安装完毕后,需要配置环境变量

在PATH中添加:D:Program Filesnodejs;

3) appium安装完毕后,需要配置环境变量

D:Program Files (x86)Appiumnode_modules.bin;

4) 配置好后,启动cmd,

输入node -v,查看node安装版本

输入appium-doctor检查appium的安装环境是否成功,如下图:

5) 安装Python,配置环境变量,如C:Python27,检查是否设置成功,如下图:

三、开始例子(Python)

1) 启动Appium

打开命令行,输入appium, 显示成功启动:

2)连接Android手机(或者模拟器)

3)编写客户端代码

假设我们的代码放在目录E:PythonTestAppiumClientPython 中。首先把
Appium-Python-Client-0.22.tar.gz 里面的 appium
目录解压到AppiumClientPython 中, 把 selenium-2.53.2.tar.gz里面的
selenium 目录解压到AppiumClientPython中。

创建文件hello_appium.py , 编辑内容:

#coding=utf-8

from appium import webdriver

desired_caps = {}

desired_caps[‘platformName’] = ‘Android’

desired_caps[‘platformVersion’] = ‘4.4.2’

desired_caps[‘deviceName’] = ‘Android Emulator’

desired_caps[‘appPackage’] = ‘com.android.calculator2’

desired_caps[‘appActivity’] = ‘.Calculator’

driver = webdriver.Remote(”, desired_caps)

driver.find_element_by_name(“1”).click()

driver.find_element_by_name(“5”).click()

driver.find_element_by_name(“9”).click()

driver.find_element_by_name(“9”).click()

driver.find_element_by_name(“5”).click()

driver.find_element_by_name(“+”).click()

driver.find_element_by_name(“6”).click()

driver.find_element_by_name(“=”).click()

driver.quit()

4)运行

打开命令行,cd到E:PythonTestAppiumClientPython 中,运行
python hello_appium.py,
正常情况可以看到手机按照代码控制,打开计算器,逐个点击按钮完成计算。

四、Appium文档

1、安装应用后打开

import os

from appium import webdriver

APK_PATH = ‘apk/ECloud-debug.apk’

COMMAND_EXECUTOR_URL = ”

    desired_caps = {}

    desired_caps[‘platformName’] = ‘Android’

    desired_caps[‘platformVersion’] = ‘5.0’

    desired_caps[‘deviceName’] = ‘Android Emulator’

    desired_caps[‘app’] = os.path.abspath(APK_PATH)

    driver = webdriver.Remote(COMMAND_EXECUTOR_URL, desired_caps)

2、查找控件

1)通过名称查找

btn = driver.find_element_by_name(“+”)

2)  通过ID查找

start_btn
=driver.find_element_by_id(‘com.cn21.ecloud:id/instruction_close_btn’)

或 start_btn = driver.find_element_by_id(‘instruction_close_btn’)

3)通过类名查找

child_text
=parent.find_element_by_class_name(‘android.widget.TextView’)

4)通过android_uiautomator查找

start_btn =driver.find_element_by_android_uiautomator(‘new
UiSelector().clickable(true)’)

以上find_element_by_XX
都是返回符合条件的第一个控件,如果要返回多个控件,可以调用
find_elements_by_XX, 返回的是一个list。

注意:如果找不到符合条件的控件,会抛出异常。

5)查找结点,不希望返回异常,写个函数就行了

def find_element_by_id_no_except(driver, id):

    element = None

    try :

        element = driver.find_element_by_id(id)

    except Exception,e:

        print Exception, ‘:’, e

    return element

3、模拟按钮点击

login_btn.click()

注意:有的点击如果需要等待动画、或者网络请求,建议等待一会:

import time

time.sleep(2)  # 睡眠2秒

4、输入框输入文本

user_input.send_keys(‘123456’)

注意:Android如果要正确输入,需要把使用系统自带的输入法,第三方输入法无法正确输入。

5、模拟点击返回键

driver.press_keycode(4)

其中按钮的定义,由Android里的KeyEvent.java里定义的,所以其它的Android按钮也是支持的。

6、关闭driver

driver.quit()

注意:一定要记得关闭driver,
否则下次连接的时候可能会出异常,因为Appium以为你上次未关闭,会创建Session失败。

为了避免代码出现异常而没有关闭,可以在捕获异常时再关闭。

7、滑动界面

下面的例子,演示点击屏幕中间,并向上拉动(相当于查看列表下面的内容了)。

from appium.webdriver.common.touch_action import TouchAction

def test_scroll_down(driver):

    screen = driver.get_window_size()

    action = TouchAction(driver)

    action.press(x=screen[‘width’]/2,y=screen[‘height’]/2)

    action.move_to(x=0,y=-screen[‘height’]/10)

    action.release()

    action.perform()

等等,怎么获取界面的属性来验证正确性?

8、获取界面属性,控件属性

1)获取当前Activity名称

activity = driver.current_activity

2) 获取屏幕宽高

screen = driver.get_window_size()

3)获取控件文本

mobile_name.get_attribute(‘text’) 或者 mobile_name.text

4)获取控件类名

mobile_name.get_attribute(‘className’)

5)判断控件是否显示

mobile_name.is_displayed() 或者
mobile_name.get_attribute(‘displayed’)

6)获得控件位置

mobile_name.location

7)获得控件大小

mobile_name.size

8)查找控件子结点

parent.find_elements_by_class_name(‘android.widget.TextView’)

同样:查找控件的其它方法,也适用于查找子结点。

对于交互后的验证,无法验证到具体的数据内容,可以验证当前的Activity,或者文本,或者列表是否为空等等。

更多参考:http://blog.csdn.net/crisschan/article/details/50416860

五、结合单元测试框架编写用例

Python自带有unittest用于单元测试,其结构类似于JUnit。

一个测试类需要继承于unittest.TestCase, 方法setUp
用于测试初始化,每个用例开始前都会调用,tearDown用于用例结束时调用,每个以test开始的函数被当成一个用例。

test_random.py

import random

import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):

        self.seq = range(10)

    def test_shuffle(self):

        # make sure the shuffled sequence does not lose any elements

        random.shuffle(self.seq)

        self.seq.sort()

        self.assertEqual(self.seq, range(10))

        # should raise an exception for an immutable sequence

        self.assertRaises(TypeError, random.shuffle, (1,2,3))

    def test_choice(self):

        element = random.choice(self.seq)

        self.assertTrue(element in self.seq)

    def test_sample(self):

        with self.assertRaises(ValueError):

            random.sample(self.seq, 20)

        for element in random.sample(self.seq, 5):

            self.assertTrue(element not in self.seq)

if __name__ == ‘__main__’:

    unittest.main(verbosity=2)

运行此测试: python test_random.py 可以查看测试的结果

上面结果显示,有2个用例测试通过,1个用例不通过。

可以在一个目录下写多个以test开头的测试文件,然后通过以下命令运行所有测试类:

python -m unittest discover . -v

六、完整例子

1、测试登陆登出功能

test_ecloud_login_logout.py

#coding=utf-8

测试天翼云登陆登出功能

用例1:快速登陆,验证登陆后的Activity为MainPageActivity

#
用例2:普通登陆,输入用户名密码,验证登陆后的Activity为MainPageActivity

# 用例3:快速登陆后注销,验证注销后的Activity为LoginActivity

import unittest

import appium_ecloud

import appium_util

from appium import webdriver

import os

class LoginLogoutTest(unittest.TestCase):

 ##

 def setUp(self):

 #print(‘Installing …’)

 desired_caps = {}

desired_caps[‘platformName’] = ‘Android’

 desired_caps[‘platformVersion’] = ‘5.0’

 desired_caps[‘deviceName’] = ‘Android Emulator’

 desired_caps[‘app’] = os.path.abspath(appium_ecloud.APK_PATH)

 self.driver = webdriver.Remote(appium_util.COMMAND_EXECUTOR_URL,
desired_caps)

 def tearDown(self):

 self.driver.quit()

 def test_FastLogin(self):

appium_ecloud.agree_document(self.driver)

appium_ecloud.quick_login(self.driver)

 self.assertTrue(self.driver.current_activity.endswith(‘MainPageActivity’))

 def test_SlowLigin(self):

appium_ecloud.agree_document(self.driver)

appium_ecloud.slow_login(self.driver)

 self.assertTrue(self.driver.current_activity.endswith(‘MainPageActivity’))

 def test_Logout(self):

appium_ecloud.agree_document(self.driver)

appium_ecloud.quick_login(self.driver)

 if (self.driver.current_activity.endswith(‘MainPageActivity’)):

appium_ecloud.test_logout(self.driver)

 self.assertTrue(self.driver.current_activity.endswith(‘LoginActivity’))

if __name__ == ‘__main__’:

unittest.main(verbosity=2)

2、自动乱点测试崩溃的情况

auto_test_ecloud.py

#coding=utf-8

import random

import time

import traceback

import appium_ecloud

def auto_interact(driver):

activity = driver.current_activity

 # 一定的机率滑动,返回键,点击

 rate = random.random()

 if rate < 0.1:

 print activity + ‘ Scroll Down’

 appium_ecloud.test_scroll_down(driver)

 elif rate < 0.2:

 print activity + ‘ Scroll Up’

 appium_ecloud.test_scroll_up(driver)

 elif rate < 0.3:

 print activity + ‘ Key Back’

 driver.press_keycode(4)

 else:

btn_list = driver.find_elements_by_android_uiautomator(‘new
UiSelector().clickable(true)’
)

 if (len(btn_list) > 0):

index = random.randint(0, len(btn_list) – 1)

 print activity + ‘ Click Button index = %d’ % (index,)

btn_list[index].click()

def main():

driver = None

 try

:

driver = appium_ecloud.install_app()

time.sleep(appium_ecloud.LONG_WAIT_TIME)

appium_ecloud.agree_document(driver)

appium_ecloud.quick_login(driver)

step = 0

while step < 100:

 if (driver.current_activity.endswith(‘LoginActivity’)):

appium_ecloud.test_login(driver)

 elif (driver.current_activity.endswith(‘.Launcher’)):

driver.background_app(1)

driver.launch_app()

 else:

auto_interact(driver)

time.sleep(appium_ecloud.CLICK_WAIT_TIME)

step += 1

# 正常退出

 driver.quit()

 except Exception, e:

 print Exception, “:”, e

traceback.print_exc()

 # 异常退出

 if (driver != None):

driver.quit()

if __name__ == ‘__main__’:

 for in range(20000):

 try:

main()

 except Exception, e:

 print Exception, “:”, e

traceback.print_exc()

注:为了更方便的编写python代码,推荐使用PyCharm
IDE,编辑代码跟Java一样方便。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图