近期负责部分客户端程序的测试任务。包括桌面客户端和手机客户端。遂想到如何通过自动化测试,先整体扫一遍。
自动化测试方案及优缺点
UI自动化测试
优点
- 可以模拟用户与应用程序的交互,验证应用程序的外观和行为是否正确。
- 可以覆盖整个应用程序的功能,并检查用户界面的正确性。
- 可以在不同的平台和设备上运行,如Web、移动应用程序等。
缺点
- 对于图形界面变化较频繁的应用程序,维护测试脚本可能会变得复杂和脆弱。
- 在不同的设备和分辨率上运行测试需要额外的配置和工作。
- 可能需要较长的执行时间,特别是对于大型应用程序或复杂的测试用例。
API/接口自动化测试
优点
- 可以独立于应用程序的界面进行测试,并验证应用程序的功能和数据交换是否正确。
- 执行速度较快,因为不需要加载和操作用户界面。
- 可以集成到持续集成/持续交付(CI/CD)流程中,以便在每次构建或部署时自动运行。
缺点
- 需要对应用程序的API或接口进行深入了解,以编写正确的测试脚本。
- 对于某些应用程序,可能需要模拟或设置测试环境以及测试数据。
- 无法验证应用程序的外观和用户界面。
单元测试
优点
- 可以快速执行,并且测试用例通常比较容易编写。
- 可以在开发过程中频繁运行,以及检测和修复代码中的问题。
- 可以帮助开发人员实现更好的代码组织和可测试性。
缺点
- 只能验证单个单元的功能,无法测试整个应用程序的集成。
- 对于依赖于外部资源或复杂交互的代码,编写和维护单元测试可能会更加困难。
- 单元测试无法检测到系统级或用户界面级的问题。
性能测试
优点
- 可以评估应用程序在不同负载条件下的性能和稳定性。
- 可以帮助发现和解决性能瓶颈,优化应用程序的性能。
- 可以模拟真实用户的行为模式和使用情况。
缺点
- 需要特定的工具和技术来模拟并生成负载。
- 对于复杂的应用程序,设置和配置性能测试环境可能需要大量的工作。
- 需要专业知识和经验来解释和分析性能测试结果。
- 每个自动化测试方案都有其适用的场景和限制。根据项目需求和资源限制,可以选择合适的方案或结合多种方案来实现全面的自动化测试覆盖。
Appium自动化方案
符合我目前任务场景的是 UI 自动化测试 那么多自动化app的工具为什么选则appium?
- 开源免费
- 支持多个平台(android、IOS)
- 支持多种类型自动化:支持苹果安卓原生界面的自动化,支持应用内嵌WebView的自动化支持手机浏览器中的web网站自动化支持flutter应用的自动化
- 支持多种编程语言
Appium是最近比较热门的框架,社区也很活跃。
这个框架应该是是功能最强大的,它的优点:
- 开源;
- 支持Native App、Hybird App、Web App;
- 支持Android、iOS、Firefox OS;Server也是跨平台的,你可以使用Mac OS X、Windows或者Linux;
它的哲理是:
- 用Appium自动化测试不需要重新编译App;
- 支持很多语言来编写测试脚本,Java、Javascript、PHP、Python、C#、Ruby等主流语言;
- 不需要为了自动化测试来重造轮子,因为扩展了WebDriver。(WebDriver是测试WebApps的一种简单、快速的自动化测试框架,所以有Web自动化测试经验的测试人员可以直接上手);
- 移动端自动化测试应该是开源的;
Appium 的使用
环境准备
安装
- appium-desktop 建议appImage
- appium-inspector 建议appImage
- 极简使用
- android-sdk
- SDK 直接通过 Android Studio 安装比较省事,默认安装在 ~/Android/SDK
sudo apt install android-sdk
sudo apt install android-sdk-platform-tools-common
sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# [gst-launch-1&gst-inspect-1](https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c)
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
# opencv
# https://docs.opencv.org/4.x/d2/de6/tutorial_py_setup_in_ubuntu.html
sudo apt install libopencv-dev python3-opencv
sudo apt-get install libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev # oppencv 的可选依赖
验证 opencv 安装好了没
❯ python3
Python 3.11.4 (main, Jun 9 2023, 07:59:55) [GCC 12.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print(cv.__version__)
4.6.0
>>> exit()
unset OPENCV4NODEJS_DISABLE_AUTOBUILD
sudo apt install libprotobuf-dev
npm install --global opencv-build
cd .npm-global/opencv-build/ && node install.js
mkdir ~/opencv/build -p
mkdir ~/opencv/sources -p
cd ~/opencv/sources
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd ~/opencv/build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/opencv ~/opencv/sources/opencv/
make -j7
make install # 安装到了 $HOME/opencv 目录
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/opencv opencv_contrib
# 安装失败
export OPENCV_LIB_DIR=/usr/local/lib && export OPENCV4NODEJS_DISABLE_AUTOBUILD=1 && npm install -g opencv4nodejs
Android Studio 安装选项
环境变量设置
# java bin PATH
if [ -d "$HOME/Java/jdk-11.0.2/bin" ] ; then
export JAVA_HOME="$HOME/Java/jdk-11.0.2"
PATH="$HOME/Java/jdk-11.0.2/bin:$PATH"
fi
# ANDROID_HOME
if [ -d "$HOME/Android/Sdk/" ] ; then
export ANDROID_SDK_ROOT="$HOME/Android/Sdk/"
export ANDROID_HOME="$HOME/Android/Sdk/"
PATH="$PATH:$ANDROID_HOME/bundle-tool" # use bundletool.jar from github.com/google/bundletool/releases
fi
npm install -g appium
npm install -g appium-doctor
npm install -g opencv4nodejs
npm install -g mjpeg-consumer
# 从 https://github.com/google/bundletool/releases 下载 bundletool.jar
安装完成后用 appium-doctor 检测一下,应该可以看到如下结果
❯ appium-doctor
WARN AppiumDoctor [Deprecated] Please use appium-doctor installed with "npm install @appium/doctor --location=global"
info AppiumDoctor Appium Doctor v.1.16.2
info AppiumDoctor ### Diagnostic for necessary dependencies starting ###
info AppiumDoctor ✔ The Node.js binary was found at: /home/lee/.local/bin/node
info AppiumDoctor ✔ Node version is 16.18.0
info AppiumDoctor ✔ ANDROID_HOME is set to: /home/lee/Android/Sdk/
info AppiumDoctor ✔ JAVA_HOME is set to: /home/lee/Java/jdk-11.0.2
info AppiumDoctor Checking adb, android, emulator, apkanalyzer
info AppiumDoctor 'adb' is in /home/lee/Android/Sdk/platform-tools/adb
info AppiumDoctor 'android' is in /home/lee/Android/Sdk/tools/android
info AppiumDoctor 'emulator' is in /home/lee/Android/Sdk/emulator/emulator
info AppiumDoctor 'apkanalyzer' is in /home/lee/Android/Sdk/cmdline-tools/latest/bin/apkanalyzer
info AppiumDoctor ✔ adb, android, emulator, apkanalyzer exist: /home/lee/Android/Sdk/
info AppiumDoctor ✔ 'bin' subfolder exists under '/home/lee/Java/jdk-11.0.2'
info AppiumDoctor ### Diagnostic for necessary dependencies completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor ### Diagnostic for optional dependencies starting ###
info AppiumDoctor ✔ opencv4nodejs is installed at: /home/lee/.cache/.npm-global/lib. Installed version is: undefined
info AppiumDoctor ✔ ffmpeg is installed at: /usr/bin/ffmpeg. ffmpeg version 5.1.2-3ubuntu1 Copyright (c) 2000-2022 the FFmpeg developers
info AppiumDoctor ✔ mjpeg-consumer is installed at: /home/lee/.cache/.npm-global/lib. Installed version is: 2.0.0
info AppiumDoctor ✔ bundletool.jar is installed at: /home/lee/Android/Sdk/bundle-tool/bundletool.jar
info AppiumDoctor ✔ gst-launch-1.0 and gst-inspect-1.0 are installed at: /usr/bin/gst-launch-1.0 and /usr/bin/gst-inspect-1.0
info AppiumDoctor ### Diagnostic for optional dependencies completed, no fix possible. ###
info AppiumDoctor
info AppiumDoctor Everything looks good, bye!
info AppiumDoctor
# 查看可选驱动
appium driver list
# 安装我需要的驱动:适用于Android的 Native, Hybrid, Web 应用测试
appium driver install uiautomator2
❯ appium plugin list
✔ Listing available plugins
- images [not installed]
- execute-driver [not installed]
- relaxed-caps [not installed]
- universal-xml [not installed]
❯ appium plugin install images
✔ Installing 'images' using NPM install spec '@appium/images-plugin'
ℹ Plugin images@2.1.4 successfully installed
❯ appium plugin install execute-driver
✔ Installing 'execute-driver' using NPM install spec '@appium/execute-driver-plugin'
ℹ Plugin execute-driver@3.0.17 successfully installed
❯ appium plugin install relaxed-caps
✔ Installing 'relaxed-caps' using NPM install spec '@appium/relaxed-caps-plugin'
ℹ Plugin relaxed-caps@1.0.5 successfully installed
❯ appium plugin install universal-xml
✔ Installing 'universal-xml' using NPM install spec '@appium/universal-xml-plugin'
ℹ Plugin universal-xml@1.0.12 successfully installed
❯ appium plugin install universal-xml
✔ Installing 'universal-xml' using NPM install spec '@appium/universal-xml-plugin'
❯ appium plugin list
✔ Listing available plugins
- images@2.1.4 [installed (npm)]
- execute-driver@3.0.17 [installed (npm)]
- relaxed-caps@1.0.5 [installed (npm)]
- universal-xml@1.0.12 [installed (npm)]
环境检测
# 检查 appium 环境及依赖问题工具
npm install -g appium-doctor
# 开始检查
appium-doctor
极简使用
docker run --privileged -d -p 4723:4723 -v /dev/bus/usb:/dev/bus/usb --name appium-container appium/appium
docker run -d --privileged -v /dev/bus/usb:dev/bus/usb -v $ANDROID_HOME:/android -p 4723:4723 muicoder/appium
docker exec -it appium-container adb devices
docker run -d -p 4724:4723 --device /dev/bus/usb/XXX/ZZZ:/dev/bus/usb/XXX/ZZZ -v ~/.android:/root/.android --name device2 appium/appium
docker run -d -p 4723:4723 -e REMOTE_ADB=true -e ANDROID_DEVICES=192.168.0.5:5555,192.168.0.6:5555 -e REMOTE_ADB_POLLING_SEC=60
docker run --privileged -d -p 4723:4723 -e CONNECT_TO_GRID=true -e APPIUM_HOST="127.0.0.1" -e APPIUM_PORT=4723 -e SELENIUM_HOST="172.17.0.1" -e SELENIUM_PORT=4444 -v /dev/bus/usb:/dev/bus/usb --name appium-container appium/appium
浏览器访问 http://127.0.0.1:4723
出现 The URL ‘/’ did not map to a valid resource
就是 appium 环境配置好了。
docker exec -it -u 0 appium-container adb devices # 检查设备连接,宿主机能识别就能识别
docker exec -it -u 0 appium-container node --version # 检查测试脚本运行脚本
编写测试脚本 https://github.com/appium/appium/tree/1.x/sample-code https://appium.io/docs/en/2.1/quickstart/test-js/ https://testerhome.com/topics/16605
const { remote } = require('webdriverio');
const opts = {
hostname: 'localhost', // 连接到哪里,脚本在宿主机上跑
port: 4723,
path: '/wd/hub', // 不用改
capabilities: {
platformName: 'Android',
platformVersion: 'your_android_version', // 平台OS版本号
deviceName: 'MI10Lite', // 设备的名称–值可以随便写
app: 'cloud.lazycat.client',
// appActivity: '', // 确保自动化之后不重置app
// 添加其他所需的配置
// - platformName: 平台名称设置为Android
// - platformVersion:填写当前连接的Android设备的系统版本,必须正确
// - deviceName: 填写Android设备名称,不需要正确
// - app: 路径,从本地选择要测试应用的apk路径
// - appPackage: 测试app的package
// - appActivity: 测试app的StartActivity
// - unicodeKeyboard: 布尔值 true则禁用手机键盘
// - noReset: 布尔值true 则不重新安装apk,false则重新安装apk
// - newCommandTimeout: 6000
}
};
(async () => {
const client = await remote(opts);
// 启动应用程序
await client.launchApp();
// 执行操作,例如点击按钮
await client.$('xpath=//button').click();
// 断言结果
const text = await client.$('xpath=//div').getText();
console.log('Text:', text);
// 关闭应用程序
await client.closeApp();
})();
继续编写脚本,通过 Appium-Inspector-linux-2023.8.4.appimage
通信,拿到元素
然后继续编写脚本,但是在实际使用过程中,比如要列举出所有按钮元素,尝试点击元素,都会失败。
app页面切换导航了,刷新Appium-Inspector-linux-2023视图,却没有反应。
所以放弃这个方案了。