针对抖音APP的自动化框架方案设计(超详细易理解)

哈喽,大家好,很多同学在学习自动化的时候苦于找不到一些练手的项目,那么今天的话就出一期如何设计自动化框架的教程,主要是提供思路和方案,具体代码暂时未公开(后续完善可能会上), 本方案适用于绝大多数移动端APP,大部分APP的UI布局都是类似,可采用此方案来设计,下次面试时面试官问起如何对一款APP设计自动化方案,再也不用担心没话可说了,如果本文对你有所帮助的话,感谢点赞,收藏

一.需求背景

抖音APP近期需要上线一个外卖点餐的新功能,那么对于一些已有的功能,如发布视频,点赞,转发,评论,切换Tab视角,下载视频背景音乐等功能需要进行回归,那么已有的测试用例可能如下:

测试模块

测试用例编号

测试用例标题

测试步骤

预期结果

实际结果

测试人员

测试时间

登录注册

TC - LR - 01

使用手机号验证码登录

1. 打开抖音APP;2. 点击登录按钮;3. 选择手机号登录方式,输入正确手机号;4. 点击获取验证码,输入正确验证码;5. 点击登录。

成功登录进入抖音主界面,展示个性化推荐内容。

登录注册

TC - LR - 02

使用第三方账号(微信)登录

1. 打开抖音APP;2. 点击登录按钮;3. 选择微信登录方式;4. 确认授权登录。

成功跳转到抖音主界面,页面显示与微信绑定的相关信息。

登录注册

TC - LR - 03

手机号格式错误登录

1. 打开抖音APP;2. 点击登录按钮;3. 选择手机号登录方式,输入错误格式手机号;4. 点击获取验证码。

弹出提示框,提示“手机号格式不正确”,无法获取验证码。

视频浏览

TC - VR - 04

上下滑动浏览视频

1. 成功登录抖音APP;2. 手指向上滑动屏幕。

视频向上滚动,切换到下一个视频;手指向下滑动屏幕,视频向下滚动,切换到上一个视频。

视频浏览

TC - VR - 05

点赞视频

1. 成功登录抖音APP,浏览视频;2. 点击视频下方的点赞按钮。

点赞按钮颜色改变,视频点赞数加1,显示点赞动画效果。

抖音要上线外卖功能,这些老的功能每次都需要去回归,业务测试同学苦不堪言,每次都要去反复执行,于是急于向组内测开的同事求救,设计自动化脚本来辅助完成这些用例的设计, 作为一名测开,当然是义不容辞替同事分忧,于是,我开始研究如何去设计自动化框架.

二.前置环境

要想对抖音APP设计自动化,当下主流的移动端自动化框架有Appium,那么本文就采用Appium来设计抖音APP的自动化方案.

1.搭建自动化环境

Pin:自动化环境搭建极其麻烦,所以前置环境大家需要自己去克服解决一下,我之前也是搞了半天才好,这一块还是要耐心一点.

1.python3.9(最好不要超过11)

2.pycharm(任意python编译器即可)

3.JDK1.8

4.SDK 24.4

5.Node.js 18.15

6.appium 1.22

详细配置教程看这里: https://blog.csdn.net/qq_45270849/article/details/132133577

2.项目架构

项目采用经典POM模式来设计, 什么是POM模式呢,简单来说就是把APP每个下方的Tab单独作为一个模块对象, 封装对应的方法,然后cases层来调用每个page的方法,以此来实现用例层和接口层的分离, 因为自动化跑起来之后会涉及到多个页面的交互,比如你在首页添加商品进入购物车页面,从购物车页面下单支付到支付页面, 从支付页面付款完成到订单完成页,设计到多个页面的UI变动,我们称之为联动,那么POM模式的设计就是为了减少不同页面接口方法的耦合(理解这个思想面试的时候不就可以跟面试官吹一下)

2.1新建一个项目叫做DouYinTest

python的话很多同学会使用虚拟环境, UP还是比较建议采用本地python IDE解释器较好,虚拟环境在执行自动化可能会有部分问题.

2.2观察一下抖音APP的各功能分布

我们发现抖音APP底部分为五个页面,有首页,朋友,发布入口,消息,我的这几个模块,那么对应到我们脚本里面就可以设计成如下:

home_page.py | friands_page.py | release_page.py | message_page.py | mine_page.py

OK,那么我们的初步设计方案已经有了,解释一下这里的包 elements 主要用来存放每个页面对应的UI控件元素.

2.3整体结构解读

cases: 用例层用来存放所有的APP用例,一些专项测试,我们写用例的目录都放在这个包下面.

config: 配置层,我们可以封装好手机的sn号, ui驱动配置,测试版本, APP包信息,测试结果推送钉钉/飞书群聊等.

src: driver驱动,封装APP每个page的接口,函数,底层的功能写在这里.

elements: 用来存放元素的控件名,需要用到哪个从接口page层直接获取,省去每次都要找控件的时间.

system_page.py: 封装手机本身系统的一些功能,如开关wifi,数据,蓝牙,音量等手机系统功能(辅助测试可能会用到)

tools: 脚本工具,allure|HTML报告, adb/tidevice 命令的封装.

workspace: 存放一些测试报告, allure_reports,一些日志文件log.txt, 一些素材/文件,方便导入到脚本使用等.

requirements.txt: 存放第三方库以及对应版本,方便别的同学拿到项目可以很快配置好环境.

pip install -r requirements.txt

2.4解决基础手机配置

输入以下命令查看抖音的包名:

adb shell pm list packages -f -3

我刚开始还不知道这个是抖音的包名哈哈, 还是问的豆包告诉我的,害我找了半天, 还得是AI好用.

有了包名之后,我们开始配置手机信息驱动driver,appium的机型配置如下(注本文使用Android手机,IOS用户暂时不支持)

from appium import webdriver

desired_caps = {
    "platformName": "iOS",
    "platformVersion": "你的系统版本",
    "deviceName": "你的设备名称",
    "bundleId": "应用 Bundle ID"
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 通过 iOS Predicate 定位元素
element = driver.find_element_by_ios_predicate('name == "元素名称"')

driver.quit()

其中bundleId就是我们刚才查找的包名, 其他几项大家根据自己手机来选择即可,这里不做过多赘述.

三. 实现自动化用例

解决完基础的环境配置之后,我们来完成一条功能用例转自动化用例的编写,脚本用例刚才有提到我们放在cases层里面

3.1需求文档

实现启动抖音APP,处理系统的弹窗授权,对首页的第一个视频点红心按钮点赞,评论,收藏,向下滑动,对第二个视频双击点赞,长按进入倍速播放,点击转发按钮,把视频分享给自己的一个好友.

3.2方案设计

那么我们开始写自动化用例的时候,需要注意低耦合,低耦合的意思就是我们尽量做好分层,分模块来写,那么就可以利用Python这里的包,文件,模块的概念来对用例进行分层管理, 比如我这里可以写成 demo_case | smoke_case | special_case 分别代表本地调试模块,冒烟用例模块,专项测试用例模块, 每个文件下面分别对应不同的用例类型,这样的好处就是可以根据需求来区分,也方便我们后续新加用例的填入. 注意模块的开头一定要以为 test_ 或者 _test 开头,这是 pytest 编写用例的规则.

需求文档提出要针对首页的视频做一系列的点赞,评论等操作,那么像这种单点的方法就不建议封装好一个单独的接口来实现,因为用例的变化组合条件是很多的,比如我可以先点赞,收藏,评论, 也可以先评论, 收藏, 点赞, 还可以 评论, 收藏, 点赞, 写过测试用例的同学都知道用例的组合变化是多种多样的, 所以要么就是限制好用例, 实现一个单独的接口在home_page.py里面, 要么就是按照步骤来写用例直接写在cases层里面.

这里为了方便展示,那么我们就直接写在cases层里面好了,方便大家观察,学习之前我们先认识一下appium的一些常见操作方法.

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.actions import interaction
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.pointer_input import PointerInput

# 配置 Appium 连接参数
desired_caps = {
    "platformName": "Android",
    "platformVersion": "你的系统版本",
    "deviceName": "你的设备名称",
    "appPackage": "com.ss.android.ugc.aweme",
    "appActivity": ".main.MainActivity",
    "noReset": True
}

# 连接 Appium 服务器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # 等待应用加载
    time.sleep(10)

    # 1. ID 定位
    try:
        element_by_id = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/your_id")
        print("通过 ID 定位成功")
    except Exception as e:
        print(f"通过 ID 定位失败: {e}")

    # 2. 类名定位
    try:
        elements_by_class = driver.find_elements(AppiumBy.CLASS_NAME, "android.widget.TextView")
        print(f"通过类名定位到 {len(elements_by_class)} 个元素")
    except Exception as e:
        print(f"通过类名定位失败: {e}")

    # 3. XPath 定位
    try:
        element_by_xpath = driver.find_element(AppiumBy.XPATH, '//android.widget.TextView[@text="你的文本"]')
        print("通过 XPath 定位成功")
    except Exception as e:
        print(f"通过 XPath 定位失败: {e}")

    # 4. Accessibility ID 定位
    try:
        element_by_accessibility_id = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "your_accessibility_id")
        print("通过 Accessibility ID 定位成功")
    except Exception as e:
        print(f"通过 Accessibility ID 定位失败: {e}")

    # 5. UIAutomator 定位(Android)
    try:
        element_by_uiautomator = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("你的文本")')
        print("通过 UIAutomator 定位成功")
    except Exception as e:
        print(f"通过 UIAutomator 定位失败: {e}")

    # 常见操作

    # 输入文本
    try:
        input_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/input_id")
        input_element.send_keys("这是输入的文本")
        print("输入文本成功")
    except Exception as e:
        print(f"输入文本失败: {e}")

    # 点击操作
    try:
        click_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/click_id")
        click_element.click()
        print("点击操作成功")
    except Exception as e:
        print(f"点击操作失败: {e}")

    # 双击操作(Android)
    try:
        double_click_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/double_click_id")
        actions = ActionChains(driver)
        actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))
        actions.w3c_actions.pointer_action.click(double_click_element)
        actions.w3c_actions.pointer_action.click(double_click_element)
        actions.perform()
        print("双击操作成功")
    except Exception as e:
        print(f"双击操作失败: {e}")

    # 长按操作
    try:
        long_press_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/long_press_id")
        action = TouchAction(driver)
        action.long_press(long_press_element).perform()
        print("长按操作成功")
    except Exception as e:
        print(f"长按操作失败: {e}")

    # 滑动操作
    try:
        start_x = 500
        start_y = 1500
        end_x = 500
        end_y = 500
        driver.swipe(start_x, start_y, end_x, end_y, duration=800)
        print("滑动操作成功")
    except Exception as e:
        print(f"滑动操作失败: {e}")

except Exception as e:
    print(f"发生异常: {e}")
finally:
    # 关闭应用
    driver.quit()    

那么,学会了以上的操作方法之后, 对于抖音APP的绝大部分功能我们都可以来做自动化了,比如我们实现点赞,收藏,评论的功能.

首先,我们借助元素定位工具来查看一下这些控件(APP上面的一些按钮简称):

我们发现,抖音APP的点赞,评论,收藏都是一些imageView,就是一些图片logo,通过id/Xpath的方式就可以定位到,那么就很简单了.

其实可以看到我这边用的都是通过ID的方式来定位的,因为ID比较快,使用Xpath的话需要逐层查找速度受限, 除非当前元素/控件没有ID/name, xpath的优先级是最后的, 不过有一点, Xpath定位的元素是最准确的.

# 连接 Appium 服务器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

def test_home_case1(self):
	with step("1.启动抖音APP"):
	  self.driver.launch_app("com.ss.android.ugc.aweme")

	with step("2.处理授权问题"):
	  pass

	with step("抓取APP日志"):
	  #这里我们可以封装一个adb方法,直接发送指令抓取APP日志
	  f'adb -s {self.sn} logcat -G 10M'

	with step("3.点赞,评论,收藏"):
	  logging.info("开始点赞")
	  element_by_id1 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/f1r")
	  element_by_id.click()
	  time.sleep(1)
	  logging.info("开始评论")
	  element_by_id2 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/d6x")
	  element_by_id2.send_keys("哈哈哈,这个视频好搞笑啊!!!")
	  time.sleep(1)
	  logging.info("点击收藏")
	  element_by_id3 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/dy0")
	  element_by_id3.click()

	  # 截图记录是否正确点击到对应按钮, 保存在workspace目录下
	  element_screenshot_path = os.path.join(GlobalVar.workspace(),  f"{case['用例标题']}_{formatted_time}.png")
	  element_by_id3.screenshot(element_screenshot_path)

	#这里可以通过图像识别的方式去检查对比是否正确点击到控件, 方法大家自己研究, 这里不过多赘述
	#同时可以增加一些断言操作如 assert False | True
	
	with step("测试结束,停止抓取日志,杀掉APP进程"):
	  self.driver.terminate_app("com.ss.android.ugc.aweme")

那么到这里,我们的一条自动化用例就写好了,当然,这里博客只做演示,具体到企业里面可能与我当前给到的方案有所差异,这是很正常的,因为市面上开源的教程都是这些,关于用例当中提到的一些技术栈,这里做一个简单的补充.

3.3技术栈补充

1.pytest测试框架

该框架会帮助我们更好的管理用例,可以想象一下用例一旦多了起来,如何批量执行,选择执行,单独执行等都是很头疼的一件事情,那么pytest是你需要学习掌握的内容.

2.paddlepaddle(飞桨)

pip install paddlepaddle

paddlepaddle 是百度自主研发的开源深度学习平台,也是中国首个自主研发、功能丰富、技术领先的产业级深度学习框架,在用例当中有提到如何验证我们的脚本每一步操作是有效的,那么可以借助该库当中的一些方法来做辅助判断.

3.adb|tidevice

adb|tidevice分别对应操作Android和IOS手机的一些命令,adb需要SDK+JDK+Node.js环境, IOS通过pip命令来安装即可.

pip install tidevice

4.Python第三方库

掌握常见Python第三方库如os,datatime,PyTorch,BeautifulSoup,Requests,json,yaml,HTML等的基本使用.

Appium-Python-Client
ffmpeg-python
pytest-html
pytest-metadata
pytest-ordering
pytest-reportportal
pytest-dependency
pytest-rerunfailures
allure-pytest
allure-python-commons
celery 
urllib3

5.CI/CD

想要执行完这些用例并且看到可视化的报告如何做呢? 我们可以借助常见CI/CD工具jenkins来实现, 通过allure+jenkins的方式实现持续集成是绝大部分的方案,em... jenkins的环境搭建也较为麻烦,感兴趣的同学可以自己了解一下,这里简单提一下,不过多赘述.

四.完善和补充

4.1其他模块自动化设计

对于整个大的抖音APP来说,功能太多了,通过自动化来完成可以转化不少功能用例,这样也可以极大提高测试效率,但是同时抖音这种toC的业务APP,每天的各种消息,弹窗也是不断的,这样会影响到自动化脚本的执行. 不知道抖音内部的debug包是不是做了很多的处理,在debug包里面可以开关很多功能,比如毙掉某个模块的功能,抖音商城新功能的上线,造测试环境数据等,都是可以在debug的抖音包来设置处理的.

同时我们也可以发现,抖音顶部的几个模块功能,我是没有放在接口层处理的,因为这几个Tab是在首页page下的,这样的话其实可以针对首页page进行二次封装处理,将这几个tab二次分层,那么又有新的问题来了,大家用抖音商城会发现,一个商城有这么多的功能,可以下单.浏览商品等,一个抖音商城的功能甚至可以抵得上一个购物APP如京东,淘宝,得物等, 那么是否可以针对抖音商城单独再创建一个新的项目来单独设计自动化用例呢?

4.2专项模块自动化测试

需求文档: 近期有用户反馈,针对抖音的长视频(一些影视解说,纪录片等),时长高达2h-5h不等, 对于长视频的播放部分用户反馈有卡顿,loading时间过长,播放画质|音质的问题同时手机发热严重,那么针对这一块内容,需要做针对性测试,我们称之为 "专项测试".

这些都是可以去尝试自动化做的内容,相信抖音内部的话专项测试会很多,可惜没有能力进去

由于本篇博客内容也已经较长了,后续的话会陆续更新一些新的测试方案设计,如果本文对你有所帮助,感谢您的点赞,转发.

更好的方案和想法可以提出,欢迎交流,探讨技术.

#Python##软件测试方案##测试开发##自动化测试##自动化测试方案设计#
测试开发之路 文章被收录于专栏

主要分享一些测试开发方向提效,提质内容:测开进阶,测试工具开发,测试平台开发,录制回放,测试报告,精准测试研究等.

全部评论

相关推荐

评论
4
5
分享

创作者周榜

更多
牛客网
牛客企业服务