[雪峰磁针石博客]软件测试专家工具包3移动端

简介: UI Automator UI Automator提供了一组API来构建基于交互UI的测试。API允许你执行操作,如打开设置菜单,非常适合黑盒自动化测试,在测试代码不依赖于应用的内部实现 uiautomatorviewer提供了一个方便的图形用户界面进行扫描和分析在Android设备上当前显示的UI组件。

UI Automator

UI Automator提供了一组API来构建基于交互UI的测试。API允许你执行操作,如打开设置菜单,非常适合黑盒自动化测试,在测试代码不依赖于应用的内部实现

uiautomatorviewer提供了一个方便的图形用户界面进行扫描和分析在Android设备上当前显示的UI组件。您可以使用此工具来检查的布局层次和查看UI组件。

UiDevice类可以访问设备并进行操作。你可以调用它的方法来访问设备属性,如当前的方向或显示尺寸。该UiDevice类也让您执行操作,例如:旋转设备;按下D-pad按钮;按Back、Home、Menu等;打开通知树栏;当前窗口截图等。

应用相关的API: UiCollection枚举容器的UI元素以计数,或通过文字(或属性等)针定位子元素; UIObject表示是在设备上可见的UI元素; UiScrollable?:为可滚动UI容器提供查找支持; UiSelector?:查询一个或者多个UI元素; Configurator: 设置参数。

图片.png

示例:更改语言

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from uiautomator import device as d

d.screen.on()
d.press.home()
d(text=u"设置").click()
d(text=u"其他高级设置").click()
d(text=u"语言和输入法").click()
d(text=u"中文 (简体)").click()
d(text=u"English").click()

https://github.com/xiaocong/uiautomator

Appium

Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生应用是指用android或ios的sdk编写的应用,移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏览器的应用。混合应用是指一种包裹webview的应用,原生应用网页内容交互性的应用。跨平台,是当今比较流行的开源测试工具。

配置比uiautomator复杂,需要指定被测应用。

图片.png

图片.png

示例:python代码操作计算器

#-*-coding: utf-8 -*-
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.4'
desired_caps['deviceName'] = 'baf59937'
desired_caps["unicodeKeyboard"]="True"  
desired_caps["resetKeyboard"]="True"  
desired_caps['appPackage'] = 'com.miui.calculator'  
desired_caps['appActivity'] = '.cal.CalculatorActivity'  
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)  

driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_id("btn_plus").click()
driver.find_element_by_name("6").click()
driver.find_element_by_id("btn_equal").click()
driver.quit()

图片.png

Eggplant

使用VNC server之类的网关。 支持iOS, Android,Windows Phone, BlackBerry,是基于图像识别的测试工具。脚本:SenseTalk。不受坐标限制。

脚本跨OS、不会修改应用,能完全控制设备。

商业软件 http://www.testplant.com/eggplant/testing-tools/

流行的软件测试工具介绍

流行的软件测试工具介绍

adb

adb用于获取Android日志,android设备的日志存储在设备的循环内存缓冲区中。adb在android SDK的platform-tools目录。首先在系统设置 - >开发人员设置中打开USB调试。

图片.png

然后使用USB连接线将手机连接到计算机。运行adb devices获取连接的设备列表。

图片.png

如果要将整个日志保存到文件而不进行过滤,请使用命令“adb logcat> logs.txt“。
图片.png

运行命令“adb logcat | findstr Exception“仅显示例外情况。Linux使用“adb logcat | grep Exception“。
图片.png

或者,您可以从Google Play安装logcat查看器(如Catlog)查看logcat条目。

图片.png

CPU Monitor Advanced Lite

来自Google Play,用于监控CPU,可以保存历史记录,并以图形直观展示,但是大陆的应用市场貌似搜索不到。

通常使用替代:CPU Monitor(豌豆荚)、CPU-Z等。

流行的软件测试工具介绍

流行的软件测试工具介绍

流行的软件测试工具介绍

流行的软件测试工具介绍

TestObject

TestObject是拥有成百上千真实设备的测试平台,可以直接通过浏览器访问。上载APP然后可以查看执行情况,支持Robotium, Espresso和Appium。

通常用于安卓机型的测试。

商业软件:https://testobject.com/

有几个类似的提供云测试服务的公司:

云测汇:https://www.yuncehui.cn/ 专注于性能测试

Testin: 即云测,http://testin.cn/ 支持Robotium、淘宝Athrun框架

易测云:支持Robotium、Athrun、Guerrilla等开源测试框架,并使用基于控件识别的、东软自主研发的测试工具Radar。http://www.yiceyun.com/

以上几家没有TestObject强大,但是有中国特色的选择之一。

流行的软件测试工具介绍

流行的软件测试工具介绍

Scan

IOS命令行工具:

图片.png

ZAPTEST

用于测试跨平台应用程序的软件测试自动化解决方案。ZAPTEST允许在任何现代操作系统,移动设备或移动设备上测试任何基于GUI的软件。包括iOS,Android,WinMo,Blackberry,Windows,Mac和Linux,并支持Agile和CI(DevOps)开发的测试。 社区版本是免费的,允许您测试网络,新的Windows应用程序或移动应用程序。

图片.png

图片.png

图片.png

Traceview

很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。

记录过程中每个API的耗时及调用次数,出现卡顿时,可通过top排序等手段分析是哪些API引起的。

图片.png

https://developer.android.com/studio/profile/traceview

Memory Profiler

Android Profiler 中的一个组件,可帮助您识别导致应用卡顿、冻结甚至崩溃的内存泄漏和流失。 它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

要打开 Memory Profiler,请按以下步骤操作:

点击 View > Tool Windows > Android Profiler(也可以点击工具栏中的 Android Profiler )。
从 Android Profiler 工具栏中选择您想要分析的设备和应用进程。 如果您通过 USB 连接了某个设备但该设备未在设备列表中列出,请确保您已启用 USB 调试。
点击 **MEMORY **时间线中的任意位置可打开 Memory Profiler。

或者,您可以在命令行中使用 dumpsys 检查您的应用内存,同时查看 logcat 中的 GC Event。

https://developer.android.com/studio/profile/memory-profiler

图片.png

Systrace

Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等。

它能展示API的执行时序、耗时及各线程状态,出现卡顿时可分析API调用逻辑是否合理及是否出现主线程阻塞。

图片.png

https://github.com/catapult-project/catapult/tree/master/systrace

AndroidJUnitRunner

AndroidJUnitRunner类是JUnit测试运行器,可以让你在Android设备上执行JUnit3或JUnit4中风格的测试类,兼容Espresso和UI Automator测试框架。测试运行器加载测试包和应用,运行测试并报告测试结果。该类取代 InstrumentationTestRunner类(仅支持JUnit 3)。

这个运行器的主要特点:

  • JUnit支持

  • 获得Instrumentation信息

  • 测试筛选

  • 测试分片

要求的Android2.2(API 8)或更高。

AndroidJunitRunner通过InstrumentationRegistry提供了访问instrumentation的API。

  • InstrumentationRegistry.getInstrumentation()返回当前正在运行的Instrumentation

  • InstrumentationRegistry.getContext()返回此Instrumentation软件包的上下文。

  • InstrumentationRegistry.getTargetContext()返回目标应用的应用上下文。

  • InstrumentationRegistry.getArguments()返回传递给此Instrumentation的参数Bundle。当你要访问命令行参数时非常有用。

测试运行器兼容JUnit3和JUnit4的(最高JUnit4.10)测试。在同一个包混淆JUnit 3和和JUnit4测试代码可能会导致不可预测的结果。instrumented JUnit 4测试类在设备或仿真器上运行,必须在前面加上@RunWith(AndroidJUnit4.class)注释。

比如测试CalculatorActivity类中的加操作:

import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2;

@RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
        extends ActivityInstrumentationTestCase2<CalculatorActivity> {
        
    @Before
    public void setUp() throws Exception {
        super.setUp();
        
        // Injecting the Instrumentation instance is required
        // for your test to run with AndroidJUnitRunner.
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }
    
    @Test
    public void typeOperandsAndPerformAddOperation() {
        // Call the CalculatorActivity add() method and pass in some operand values, then
        // check that the expected value is returned.
    }
    
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }
}

InstrumentationRegistry类可以访问测试运行的信息。该类包括Instrumentation对象,目标应用上下文对象,测试应用上下文对象及传递到测试的命令行参数。

JUnit 4.x的测试可以使用annotation来配置测试运行,并支持Androidannotation:

@RequiresDevice:物理设备上运行。

@SdkSupress:限定最低SDK版本。例如@SDKSupress(minSdkVersion=18)
@SmallTest,@MediumTest和@LargeTest:测试分级。

单个test suite可以分片,同一Instrumentation的同一分片可以作为一个组。每个片都有索引号。当运行测试,使用-e numShards选项指定片数和-e shardIndex选项来指定要运行的片。

例如分成10个碎片,仅执行第二片测试,请使用以下命令:

adb shell am instrument -w -e numShards 10 -e shardIndex 2

Espresso

Espresso提供了一组API来构建UI测试来测试用户流程。这些API让你写简洁和可靠运行的自动化UI测试。Espresso非常适合白盒自动测试,测试代码利用了被测应用的代码细节。

Espresso的主要特性:

  • 视图匹配(View matching): 灵活的API用于查看和适配目标应用。

  • Action API:一套扩展的action API自动化UI交互。

  • UI线程同步(UI thread synchronization)以提高测试的可靠性。

要求Android2.2(API 8)或更高。

Espresso.onView()方法可以访问目标应用程序的UI组件并与之交互。该方法接受一个Matcher参数,搜索视图层来定位视图实例。定位方法可以基于类名、内容描述、R.id、显示的文本。比如

onView(withId(R.id.my_button));

如果搜索成功,onView()方法返回对应view的引用,可执行用户操作和断言。

AdapterView由子view动态生成。如果目标视图在AdapterView(ListView或GridView)中,onView()方法可能不起作用,因为可能只加载了一部分,Espresso.onData()则可以。

ViewActions可以执行视图点击(View clicks),滑动(Swipes),按键或者按钮(Key and button press)、文本输入(Typing text)、打开链接(Opening a link)。

// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
    .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());

由于时间问题,在Android设备上测试随机失败。之前一般通过sleep和超时处理解决。Espresso测试框架处理Instrumentation和UI线程之间的同步,很好地解决了这些问题。

API参考:developer.android.com/reference/android/support/test/package-summary.html
测试参考:http://developer.android.com/training/testing/ui-testing/espresso-testing.html

robotium

Android用户场景测试,在Espresso出来直接比较流行,现在有弱化的趋势。

https://github.com/RobotiumTech/robotium

Genymotion

高效的安卓模拟器 http://www.genymotion.net/

图片.png

Robolectric

开源。使用shadow objects运行测试于普通的工作站/服务器JVM,它并不依赖于Android提供的测试功能,无须模拟器、设备,效率高。无须dexing(编译成Dalvik VM使用的格式),打包,部署和运行的过程。

是安卓单元测试的首选工具。

网址:pivotal.github.com/robolectric

Monkey

Monkey是Android中的命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

https://developer.android.com/studio/test/monkey

Android Lint

Android Studio 提供一个名为 Lint 的代码扫描工具,可帮助您发现并纠正代码结构质量的问题,而无需实际执行该应用,也不必编写测试用例。该工具会报告其检测到的每个问题并提供该问题的描述消息和严重级别,以便您可以快速确定需要优先进行哪些关键改进。此外,您可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题。

Lint 工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。在使用 Android Studio 时,配置的 Lint 和 IDE 检查会在您每次构建应用时运行。不过,您可以手动运行检查或从命令行运行 Lint。

图片.png

https://developer.android.com/studio/write/lint?hl=zh-cn#commandline

兼容性测试套件 (CTS)

兼容性测试套件 (CTS) 是一个免费的商业级测试套件CTS 代表兼容性的“机制”。

CTS 在桌面设备上运行,并直接在连接的设备或模拟器上执行测试用例。CTS 是一套单元测试,旨在集成到工程师构建设备的日常工作流程(例如通过连续构建系统)中。其目的是尽早发现不兼容性,并确保软件在整个开发过程中保持兼容性。

CTS 是一个自动化测试工具,其中包括两个主要软件组件:

CTS tradefed 自动化测试框架会在桌面设备上运行,并管理测试执行情况。

单独的测试用例会在被测设备 (DUT) 上执行。测试用例采用 Java 语言编写为 JUnit 测试,并打包为 Android .apk 文件,以在实际目标设备上运行。

兼容性测试套件验证程序(CTS 验证程序)是对 CTS(可在此处下载)的补充。CTS 验证程序为无法在没有手动输入(例如音频质量、加速度计等)的固定设备上进行测试的 API 和功能提供测试。

CTS 验证程序是一款手动测试工具,包含以下软件组件:

在 DUT 上执行并收集结果的 CTS 验证程序应用。

在桌面设备上执行,以便为 CTS 验证程序应用中的某些测试用例提供数据或额外控制的可执行文件或脚本。

图片.png

monkey runner

monkeyrunner工具提供了API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

下面是简单的monkeyrunner程序,它连接到设备,创建MonkeyDevice对象。 程序使用MonkeyDevice对象安装Android应用程序包,运行activity,并将关键事件发送到activity。 然后程序截取结果的屏幕截图,创建MonkeyImage对象。 从该对象,程序输出包含屏幕截图的.png文件。

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# Runs the component
device.startActivity(component=runComponent)

# Presses the Menu button
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot
result = device.takeSnapshot()

# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')

DDMS

DDMS 的全称是DalvikDebug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。

https://developer.android.com/studio/profile/monitor

参考资料

相关文章
|
23天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
69 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
19天前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
18天前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
40 2
|
18天前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
29天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
35 1
|
1月前
|
测试技术
软件测试的艺术:从新手到专家的转变
在数字化时代,软件已成为我们生活和工作中不可或缺的一部分。因此,确保软件的质量和性能至关重要。本文将探讨软件测试的重要性,以及如何从一名初学者成长为一名软件测试领域的专家。我们将通过分析软件测试的基本概念、关键技能和最佳实践,来揭示这一过程的内涵和意义。
|
1月前
|
测试技术 UED 开发者
软件测试的艺术:从新手到专家的旅程
在数字化时代,软件测试不仅是确保产品质量的关键步骤,也是提升用户体验的重要手段。本文将探索软件测试的基本概念、重要性以及如何从一名新手成长为测试领域的专家。我们将通过具体案例分析,揭示软件测试过程中的常见问题和解决策略,帮助读者理解并掌握软件测试的核心技能。
|
2月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
44 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
1月前
|
测试技术 持续交付 UED
软件测试的艺术:从新手到专家的旅程
在软件开发的世界中,测试不仅是一项技术活动,更是一种艺术。本文将带领读者探索软件测试的奥秘,从基础概念到高级策略,揭示如何通过细致的测试流程提升软件质量。我们将一起了解测试的重要性,学习不同的测试类型,掌握编写有效测试用例的技巧,并探讨自动化测试和持续集成的实践。无论你是刚入行的新手还是希望深化知识的专家,这篇文章都将为你提供宝贵的见解和实用的建议。
|
2月前
|
架构师 算法 测试技术
软件测试的艺术:从初学者到专家的转变
本文将深入探讨软件测试的重要性,以及如何从一名初学者成长为一名专业的软件测试工程师。我们将从基础概念开始,逐步深入到高级测试策略和工具,帮助读者建立扎实的理论基础和实践技能。此外,我们还将讨论当前市场上的一些主流测试工具和技术,以及如何在职业生涯中不断进步和发展。