程序员软件测试开发辅助技术

Android APP 自动化测试

2020-04-08  本文已影响0人  hydCoder

自动化测试环境安装

Android APP 自动化测试框架

Unittest框架

使用unittest编写用例,必须遵守以下规则:

1、测试文件必须先import unittest;

2、测试类必须继承unittest.TestCase;

3、测试方法必须以“test_”开头;

4、测试类必须要有unittest.main()方法。

Test Fixture

A test fixture represents the preparation needed to perform one or more tests, and any assoicate cleanup actions.

Test Case & Test Suite &Test Runner

官网的含义介绍:

A test case is the smallest unit of testing. It checks for a specific response to a particular set of inputs. 测试用例是最小的测试单元。它检查对特定输入集的特定响应。

A test suite is a collection of test cases, test suites, or both. It is used to aggregate tests taht should be executed together. 测试套件是测试用例、测试套件或两者的集合。它用于聚合应该一起执行的测试。

A test runner is a component thich orchestrates the execution of tests and provides the outcome to the user. 测试运行器是一个组件,它协调测试的执行并向用户提供结果。

应用Test Suite 和Test Runner 运行自动化脚本
import unittestdemo
import unittest


# 以一个类的维度去执行
cases = unittest.TestLoader.loadTestsFromTestCase(unittestdemo.MyTestCase)
# 可以一次添加多个cases
my_suite = unittest.TestSuite([cases])

# 添加单个测试用例,在使用ddt后,将会不可用
# my_suite = unittest.TestSuite()
# my_suite.addTest(unittestdemo.MyTestCase("test_something"))

my_runner = unittest.TextTestRunner(verbosity=2)
my_runner.run(my_suite)
数据驱动DDT

官网

DDT(Data-Driven Tests) allows you to multiply one test case by runing it with different test data, and make it appear as multiple test cases.

DDT(数据驱动测试)允许您将一个测试用例与不同的测试数据一起运行,从而使它显示为多个测试用例。

数据驱动DDT的使用

抓包神奇Fiddler

环境准备

注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的 程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。

基本界面
用户界面
设置断点修改Request/Response

如图,箭头所指的位置时可以点击的。共三种状态:
空白:不设置断点。
箭头向上:表示断点请求。此时客户端的请求是无法直接到达目标服务器的,需要手动控制。
箭头向下:表示断点响应。此时目标服务器的响应是无法直接到达客户端的,需要手动控制。

构造HTTP请求

Composer允许自定义请求发送到服务器,可以手动创建一个新的请求,也可以在会话表中,拖拽一个现有的请求。

Parsed模式下你只需要提供简单的URLS地址即可(如下图,也可以在RequestBody定制一些属性,如模拟浏览器User-Agent)。

构造get请求
抓取手机数据包
手机抓包设置

fiddler监听端口默认是 8888,你可以把它设置成任何你想要的端口。勾选上 “Allow remote computersto connect” ,允许远程设备连接。

为了减少干扰,可以去掉 “Act assystem proxy on startup” 。

手机端(客户端)设置
下载证书

中,选择“修改网络”。在接下来弹出的对话框中,勾选“显示高级选项”。在接下来显示的页面中,点击“代理”,选择“手动”。代理服务器主机名设为 PC 的 IP ,代理服务器端口设为 Fiddler 上配置的端口 8888,点”保存”。

数据驱动DDT实现API接口自动化测试

pip install requests

Android Native APP自动化(Python)

自动化测试工具Appium

Appium 是一个开源、跨平台的自动化测试工具,用于测试Native(原生)Hybrid(混合)应用,支持iOS,Android和FirefoxOS平台。

在Android平台,是基于UIAutomator 框架。

Appium的理念
Appium的特点
appium.jpg
脚本设计原则

LOVE原则

自动化测试脚本demo编写

下面的demo是对系统自带的计算器APP进行测试的,界面元素的id和包名都是通过UIAutomator viewer获取的。

import unittest
from appium import webdriver


class MyTestCase(unittest.TestCase):

    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '9.0'
        desired_caps['deviceName'] = '192.168.115.101:5555'
        desired_caps['appPackage'] = 'com.android.calculator2'
        desired_caps['appActivity'] = '.Calculator'
        desired_caps["unicodeKeyboard"] = "True"
        desired_caps["resetKeyboard"] = "True"
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def test_something(self):
        self.driver.find_element_by_id("digit_1").click()
        self.driver.find_element_by_id("digit_3").click()
        self.driver.find_element_by_id("digit_5").click()
        self.driver.find_element_by_id("op_add").click()
        self.driver.find_element_by_id("digit_8").click()
        self.driver.find_element_by_id("digit_9").click()
        self.driver.find_element_by_id("op_mul").click()
        self.driver.find_element_by_id("digit_3").click()
        self.driver.find_element_by_id("digit_9").click()
        self.driver.find_element_by_id("digit_2").click()
        self.driver.find_element_by_id("eq").click()

        result = self.driver.find_element_by_id("result").text
        self.assertEqual(result, "35,023")

    def tearDown(self):
        # 一定记得退出driver,不然下次运行会直接报错,除非在Appium中手动停止连接
        self.driver.quit()


if __name__ == '__main__':
    unittest.main()

先运行Appium,点击android图标进行设置,主要设置platformVersion,我是用的Appium版本为appium1.4.16,由于appium1.4.16版本最高只支持安卓6.0版本,所以可以参考这篇文章进行一些修改设置,然后运行Appium启动连接,再运行上面的demo,可以得到下面的输出结果:

Testing started at 11:56 ...
E:\Python27\python.exe "E:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pycharm\_jb_unittest_runner.py" --target unittestdemo.MyTestCase
Launching unittests with arguments python -m unittest unittestdemo.MyTestCase in F:\code\AutomatedTestingDemo


Ran 1 test in 16.699s

OK

Process finished with exit code 0
Appium常用的相关API的介绍

Android Native APP自动化(Python)

针对于Hybrid的App,Appium是基于Selendroid框架实现,而Selendroid框架又是基于Instrumentation框架实现的。

可见,Appium本身是借助于其他框架控制APP。

Selendroid的架构
selendroid原理
定位页面元素
copy_xpath

上下文

基于Selendroid的自动化脚本实现

在页面里搜索一个关键词,并验证和预期一致

结语

本文主要是我自己在学习用Python对Android APP进行自动化测试时踩过的一些坑和写的Demo,离真正的自动化测试还有一定的距离,所以大家可以多写写自动化测试脚本,业精于勤!有不对的地方也请在评论里指出,谢谢!
文中代码已上传至GitHub,传送门

上一篇 下一篇

猜你喜欢

热点阅读