APP 测试框架二次开发:Python, Appium & BeatifulReport
一、需求:
需要对APP功能进行测试,重新封装 Python,Appium & BeatifulReport
二、结构:
- 项目
- 配置文件:conf
- 核心模块:core
- 业务逻辑:logic
- 脚本:scripts
- 软件包:apk
- 截图:img
- 报告:report
- 入口:run_script.py
三、入口:run_script.py
相关问题:查看 App自动化: 安装/卸载问题 & App自动化2: 安装/卸载问题
# coding=utf-8
import argparse
import os
import threading
import unittest
import requests
from BeautifulReport import BeautifulReport
from core.AdbShell import AdbShell
from core.utils import change_report_format
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("-apk", "--apk-version", default="", help="apk version")
args = parser.parse_args()
return args
if __name__ == '__main__':
apk_dir = os.getenv('APK_DIR')
args = parse_args()
apk_version = args.apk_version
if apk_version:
res = requests.post(apk_version).content
apk_version = apk_version.split('/')[-1]
print("apk_version", apk_version)
os.environ['APK_VERSION'] = apk_version
print(apk_version)
apk = os.path.join(apk_dir, apk_version)
with open(apk, 'wb') as f:
f.write(res)
else:
apk = os.path.join(apk_dir, os.environ['APK_VERSION'])
adb_shell = AdbShell()
device = adb_shell.get_device_name()
adb_shell.set_device_name(device)
# 安装App
package_name = adb_shell.get_target_package()
if package_name:
adb_shell.adb_uninstall_package(package_name)
threads = []
install = threading.Thread(target=adb_shell.adb_install_package, args=(device, apk))
protect = threading.Thread(target=adb_shell.adb_tap_until_install_success, args=(2, ))
threads.append(install)
threads.append(protect)
for t in threads:
t.setDaemon(True)
t.start()
t.join()
os.environ['U_APP_PACKAGE_NAME'] = adb_shell.get_target_package()
test_suite = unittest.defaultTestLoader.discover('./scripts', pattern='test*.py')
result = BeautifulReport(test_suite)
result.report(filename='report', description='UI自动化测试报告', report_dir='report')
report_file = os.path.join(os.getenv('U_APPMBT_ROOT'), 'report', 'report.html')
change_report_format(report_file)
四、配置文件:conf
1.config.py:全局参数设置目录、手机和软件包等
# encoding = utf-8
import os
from datetime import datetime
# Project Start Time
os.environ['U_PRJ_START_TIME'] = datetime.now().strftime(' %Y-%m-%d %H:%M:%S')
# Appium Info
# platform name
os.environ['U_APPIUM_PLATFORM_NAME'] = 'Android'
# platform version
os.environ['U_APPIUM_PLATFORM_VERSION'] = ''
# device name
os.environ['U_APPIUM_DEVICE_NAME'] = 'xxx'
# App server platform
os.environ['U_APP_SERVER_PLATFORM'] = 'Appium'
# app package
os.environ['U_APP_PACKAGE_NAME'] = 'com.xxx.xxx'
os.environ['U_APP_MAIN_ACTIVITY'] = 'com.xxx.xxx.activity.MainActivity'
# apk version
os.environ['APK_VERSION'] = 'xxx.apk'
# server ip
os.environ['U_APPIUM_SERVER_IP'] = 'localhost'
# server port
os.environ['U_APPIUM_SERVER_PORT'] = '4723'
# testLogs
os.environ['U_APPMBT_ROOT'] = str(os.getcwd())
# apk directory
os.environ['APK_DIR'] = os.path.join(os.getenv('U_APPMBT_ROOT'), 'apk')
os.environ['U_CURRENT_LOG'] = ''
- element_json: 存储APP中各元素
{
"RC":
{
"authorization_request_id": "com.android.packageinstaller:id/permission_allow_button",
"confirm_id": "com.xxx.rocket:id/confirm",
"notice_id": "android:id/checkbox",
"ignore_id": "com.xxx.rocket:id/tv_ignore",
"mine_id": "com.xxx.rocket:id/frame_container_mine",
"switch_channel_id": "com.xxx.rocket:id/switch_open_double",
"language_setting_id": "com.xxx.rocket:id/tv_go2_language_setting",
"home_page_id": "com.xxx.rocket:id/frame_go2_app_intro",
"user_avatar_id": "com.xxx.rocket:id/iv_user_avatar",
"taptap_toolbar_id": "com.xxx.rocket:id/toolbar",
"login_confirm_position_percent": {
"x": "50",
"y": "85"
},
"login_tips_id": "com.xxx.rocket:id/iv_login_tips",
"email_name_id":"com.xxx.rocket:id/email_name",
"witch_mode_id":"com.xxx.rocket:id/switch_mode",
"email_login_id":"com.xxx.rocket:id/login_register_btn",
"item_edittext_id":"com.xxx.rocket:id/item_edittext",
"setting_id": "com.xxx.rocket:id/tv_setting",
"logout_id": "com.xxx.rocket:id/tv_log_out",
"logout_confirm_id": "android:id/button1",
"support_id": "com.xxx.rocket:id/tv_feedback_parent",
"support_title_id": "com.xxx.rocket:id/tv_title",
"support_xpath": "//*[@resource-id='app']//android.widget.EditText[1]",
"support_back_id": "com.xxx.rocket:id/iv_back",
"discover_id": "com.xxx.rocket:id/frame_container_discover"