Python3 + Appium + 安卓模拟器 实现APP自动化测试,并生成测试报告

2020年4月补充

鉴于配置自动化测试这套框架确实稍微有点麻烦,许多小伙伴在配置的过程中总是踩坑,最近写了篇简化版的入门教程,不想折腾Android SDK的小伙伴可以移步到那篇文章:https://blog.csdn.net/u013314786/article/details/105768650


概述

本文主要分为以下几个部分

  1. 安装Python3
  2. 安装Python3的Appium库
  3. 安装Android SDK
  4. 安装JDK
  5. 安装Appium
  6. 安装模拟器
  7. 编写测试脚本并生成测试报告

项目示例下载地址: https://github.com/lixk/apptest

正文

一、安装Python3

直接登录Python官网https://www.python.org/,下载最新版本即可。
在这里插入图片描述
然后安装的时候注意一下安装路径,比如我的安装路径D:\Python37,接下来会用到这个安装路径。

二、安装Python3的Appium库

打开Python安装目录,找到Scripts文件夹,点进去,示例:
在这里插入图片描述在地址栏上输入cmd,然后回车,打开控制台:
在这里插入图片描述
在控制台里输入命令pip install Appium-Python-Client,然后回车
在这里插入图片描述
看到下图的提示就表明安装成功了
在这里插入图片描述

三、安装Android SDK

我懒得折腾,所以就直接下载了Android Studio
下载地址
https://developer.android.com/studio/#downloads
在这里插入图片描述
下载完成开始安装
在这里插入图片描述
如果需要安装自带的模拟器,就把这一项勾选上,然后Next,接下来选择安装路径,比如我的同样放在D
在这里插入图片描述
接下来一路Next,到了选择SDK的页面注意一下
在这里插入图片描述
选择Custom,这样可以只安装自己喜欢的部分,接下来选择主题,当然这个以后可以在Android Studio里边改
在这里插入图片描述
继续Next,到达定制组件页面,如下图
在这里插入图片描述
设置一下SDK的安装路径,比如我的是D:\Android\SDK,接下来继续Next…finish。然后就进入了缓慢的下载环节,让它在这儿慢慢的下载吧,下载完成后就好了。我们可以进入下一节了。

四、安装JDK

这里我使用的是JDK8,下载地址
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

接受协议,然后选择对应平台下载即可
在这里插入图片描述
接下来安装过程比较简单,也是一路Next,注意选择一下安装路径,比如我的安装路径D:\Java\jdk1.8
在这里插入图片描述

五、安装Appium

官网地址 http://appium.io/
在这里插入图片描述
点击下载按钮会到GitHub的下载页面,选择对应平台下载
在这里插入图片描述
Windows就选这个(快捷下载)

安装完成后,启动Appium,host和port默认的即可,然后编辑下配置信息
在这里插入图片描述
在这里插入图片描述
然后点下边那个保存并重启的按钮,然后点第一个Start Server按钮,将会看到
在这里插入图片描述
如果使用真机测试,插上手机就可以开始编写脚本测试了。但是呢,由于手边没有数据线,就采用模拟器了,所以有了下一节。

六、安装模拟器

这里使用的是夜神模拟器下载地址 https://www.yeshen.com/,之所以不用Android自带的,是因为记得多年前启动一次要好久,然后就再也没用过。
这个也没有什么好说的,也是注意一下安装路径,然后一路下一步就好了。
安装完成后要进行一下简单修改:

  1. 打开安装目录,进入到bin目录(比如:D:\Nox\bin
  2. 把第三节里安装好的Android SDK里的adb.exe文件(比如我的在D:\Android\SDK\platform-tools目录下)复制到该目录覆盖掉该目录已存在的adb.exe文件
  3. 删掉该目录的nox_adb.exe文件,再复制一份adb.exe并重命名为nox_adb.exe
  4. 启动模拟器
  5. 再该目录打开控制台,执行nox_adb.exe connect 127.0.0.1:62001,然后执行adb devices,看到如下信息就表示成功了在这里插入图片描述
  6. 在模拟器里安装测试apk文件,这里以一个计算器为例,直接将apk文件拖到模拟器里即可在这里插入图片描述
  7. 继续在刚刚的控制台窗口里输入aapt dump badging D:\apk\com.youdao.calculator-2.0.0.apk,其中D:\apk\com.youdao.calculator-2.0.0.apk是测试apk的完整路径。
    在这里插入图片描述
    可以看到安装包的信息都打印出来了,记录下红框里这两个名称,待会儿写测试脚本的时候要用。
    注意,如果模拟器重启了,需要执行第5步的nox_adb.exe connect 127.0.0.1:62001

七、编写测试脚本并生成测试报告

  1. 创建测试用例目录testcase,在该目录下创建test_app.py文件

    import time
    import unittest
    

from appium import webdriver

class MyTests(unittest.TestCase):
# 测试开始前执行的方法
def setUp(self):
desired_caps = {‘platformName’: ‘Android’, # 平台名称
‘platformVersion’: ‘4.4.2’, # 系统版本号
‘deviceName’: ‘127.0.0.1:62001’, # 设备名称。如果是真机,在’设置->关于手机->设备名称’里查看
‘appPackage’: ‘com.youdao.calculator’, # apk的包名
‘appActivity’: ‘com.youdao.calculator.activities.MainActivity’ # activity 名称
}
self.driver = webdriver.Remote(“http://127.0.0.1:4723/wd/hub”, desired_caps) # 连接Appium
self.driver.implicitly_wait(8)

<span class="token keyword">def</span> <span class="token function">test_calculator</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> t<span class="token operator">=</span><span class="token number">500</span><span class="token punctuation">,</span> n<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token triple-quoted-string string">"""计算器测试"""</span>
    time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span>
    window <span class="token operator">=</span> self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>get_window_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
    x0 <span class="token operator">=</span> window<span class="token punctuation">[</span><span class="token string">'width'</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.8</span>  <span class="token comment"># 起始x坐标</span>
    x1 <span class="token operator">=</span> window<span class="token punctuation">[</span><span class="token string">'width'</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.2</span>  <span class="token comment"># 终止x坐标</span>
    y <span class="token operator">=</span> window<span class="token punctuation">[</span><span class="token string">'height'</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.5</span>  <span class="token comment"># y坐标</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">:</span>
        self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>swipe<span class="token punctuation">(</span>x0<span class="token punctuation">,</span> y<span class="token punctuation">,</span> x1<span class="token punctuation">,</span> y<span class="token punctuation">,</span> t<span class="token punctuation">)</span>
        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
    self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>find_element_by_id<span class="token punctuation">(</span><span class="token string">'com.youdao.calculator:id/guide_button'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>click<span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
        self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>find_element_by_accessibility_id<span class="token punctuation">(</span><span class="token string">'Mathbot Editor'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>click<span class="token punctuation">(</span><span class="token punctuation">)</span>
        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>

    btn_xpath <span class="token operator">=</span> <span class="token string">'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v4.widget.DrawerLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.LinearLayout[3]/android.view.View/android.widget.GridView/android.widget.FrameLayout[{0}]/android.widget.FrameLayout'</span>
    self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>find_element_by_xpath<span class="token punctuation">(</span>btn_xpath<span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>click<span class="token punctuation">(</span><span class="token punctuation">)</span>
    self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>find_element_by_xpath<span class="token punctuation">(</span>btn_xpath<span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>click<span class="token punctuation">(</span><span class="token punctuation">)</span>
    self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>find_element_by_xpath<span class="token punctuation">(</span>btn_xpath<span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>click<span class="token punctuation">(</span><span class="token punctuation">)</span>
    time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span>

<span class="token comment"># 测试结束后执行的方法</span>
<span class="token keyword">def</span> <span class="token function">tearDown</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
    self<span class="token punctuation">.</span>driver<span class="token punctuation">.</span>quit<span class="token punctuation">(</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 创建run.py文件

    import os
    import time
    import unittest
    
  • from HTMLTestRunner import HTMLTestRunner

    test_dir = ‘./testcase’
    discover = unittest.defaultTestLoader.discover(start_dir=’./testcase’, pattern=“test*.py”)

    if name == main:
    report_dir = ‘./test_report’
    os.makedirs(report_dir, exist_ok=True)
    now = time.strftime("%Y-%m-%d %H-%M-%S")
    report_name = ‘{0}/{1}.html’.format(report_dir, now)

    <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>report_name<span class="token punctuation">,</span> <span class="token string">'wb'</span><span class="token punctuation">)</span><span class="token keyword">as</span> f<span class="token punctuation">:</span>
        runner <span class="token operator">=</span> HTMLTestRunner<span class="token punctuation">(</span>stream<span class="token operator">=</span>f<span class="token punctuation">,</span> title<span class="token operator">=</span><span class="token string">"测试报告"</span><span class="token punctuation">,</span> description<span class="token operator">=</span><span class="token string">"本测试报告内容包含超级计算器的简单测试"</span><span class="token punctuation">)</span>
        runner<span class="token punctuation">.</span>run<span class="token punctuation">(</span>discover<span class="token punctuation">)</span>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    导出测试报告用到了HTMLTestRunner,但是Python3的好像有问题,在网上找了两个修改后支持Python3的, 需要的话可以在本文尾部的示例项目中下载。

  • 运行run.py文件
    等程序运行完之后即会在test_report目录下生成测试报告
    在这里插入图片描述
    在这里插入图片描述
    在浏览器里打开即可看到报告内容,示例
    在这里插入图片描述
    到此,全部完成。如果有空的话可以再补充下Appium的使用,比如元素定位之类的,希望本文能帮到初学自动化测试的同学。
    项目示例下载地址 https://github.com/lixk/apptest
    艾玛,罗嗦这么多,都八点了还没吃晚饭,好饿,今天就先到这里了。


  • 2019/5/21 补充

    如果配置跟上边那几步都一致,确实没问题,结果不能正常运行。那么问题可能出在模拟器配置。下边补充下我这边的模拟器配置。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    代码中的'platformVersion': '4.4.2'就是上图中的Android版本。

    如果还是有许多人跑不起来,接下来可以考虑抽空录个操作视频,哈哈哈。

                                    </div>
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值