第十八:微信小程序-MiniTest自动化测试
【代码】第十八:微信小程序-MiniTest自动化测试。
·
一…根目录下新建config.json
1.在config.json文件中配置小程序的代码路径
1.1.(需要编译完成的,源码是使用uniapp开发的,所以需要打包成微信小程序后才能生效)
1.2.微信开发者工具的地址
import minium
mini = minium.Minium({
# 替换成你的【小程序项目目录地址】
"project_path": "E:\code\front\dist",
# 替换成你的【开发者工具cli地址】,macOS: <安装路径>/Contents/MacOS/cli, Windows: <安装路径>/cli.bat
"dev_tool_path": "D:\微信web开发者工具\cli.bat",
})
print(mini.get_system_info())Copy to clipboardErrorCopied
{
"project_path": "E:\code\front\dist",
"dev_tool_path": "D:\微信web开发者工具\cli.bat",
"debug_mode": "info", #日记级别 debug error
"auto_authorize": true, #自动处理授权弹窗
"test_port": 9420, #IDE端口
"platform": "ide", #运行平台ide, Android, IOS
"device_desire": {
"serial": "b777a722"
}
}

二.根目录新建suite.json
1.suite.json文件中写下文件的匹配规则
2.case_list是测试用例的匹配规则,需要匹配test开头的所有文件
3.pkg的匹配规则是指包的匹配规则
{
"pkg_list": [
{
"case_list": [
"test_*"
],
"pkg": "test_case.test_*"
}
]
}
4.suite.json的pkg_list字段说明要执行用例的内容和顺序
pkg_list是一个数组,每个数组元素是一个匹配规则,会根据pkg去匹配包名,找到测试类
然后再根据case_list里面的规则去查找测试类的测试用例
可以根据需要编写匹配的粒度
注意匹配规则不是正则表达式,而是通配符
5.pkg 测试文件执行规则

三.测试用例
import minium
class SysInfoTest(minium.MiniTest):
def test_sysinfo(self):
sys_info = self.mini.get_system_info()
print(sys_info)
self.assertIn("SDKVersion", sys_info)
1.执行测试单个用例
minitest -m test_case.sysinfo_test -c config.json -g
重点
测试用例的命名,一定要casename_test,否则不好使
不信可以写成test_casename,命令行执行体验报错的感觉!

1.1.批量执行用例
minitest -s suite.json -c config.json -g
部分参数说明:
-s 测试计划
-c CONFIG, --config CONFIG:配置文件名,配置项目参考配置文件
-g, --generate: 生成网页测试报告
--module_search_path [SYS_PATH_LIST [SYS_PATH_LIST ...]] : 添加 module 的搜索路径
-a, --accounts: 查看开发者工具当前登录的多账号, 需要通过 9420 端口,以自动化模式打开开发者工具
--mode RUN_MODE: 选择以parallel(并行, 每个账号从队列中取一个pkg运行, 完成后取下一个)或者fork(复刻, 每个帐号都跑全部的pkg)的方式运行用例
--task-limit-time: 任务超时时间,如果到期还没跑完测试,直接终止测试进程. 单位: s

2.测试结果:每条用例的测试结果会存放到一个目录里面,里面包含
2.1.包含用例执行信息的json文件
2.2.用例运行中的截图
2.3.用例运行中的日志
2.4.小程序运行中的日志
3.测试报告:根据用例的执行结果,提供简洁的测试报告
3.1.执行用例的时候加上-g参数针
3.2.对已经生成的用例结果目录
minireport input_path output_path
input_path:测试结果目录
output_path:测试报告存储目录
4.测试结果存储在outputs下,运行命令python3 -m http.server 12345 -d outputs
4.1.然后在浏览器上访问http://localhost:12345即可查看报告
5.或者直接通过命令minitest -s suite.json -c config.json -g也可以生产
5.1.通过右键-选择浏览器打开html报告

四.定时跑自动化项目
1.创建run.sh文件

2.项目里面创建run.py文件,设定时间定时跑项目
import os
import datetime
class CheckService(object):
def __init__(self):
pass
def timerFun(self, sched_Timer):
flag = 0
while True:
now = datetime.datetime.now()
if now == sched_Timer:
os.system('/Users/macbookair/Desktop/p8care/run/run.sh')
flag = 1
else:
if flag == 1:
# 把hours = 1,改成minutes = 1,就变成了每个小时定时任务,改成days = 1
# 就变成每天的定时任务
sched_Timer = sched_Timer + datetime.timedelta(days=1)
print('run the timer task at {0}'.format(sched_Timer))
flag = 0
if __name__ == "__main__":
cs = CheckService()
# 每天10点0分会执行任务
sched_Timer = datetime.datetime(2022, 8, 2, 13, 45)
print('run the timer task at {0}'.format(sched_Timer))
cs.timerFun(sched_Timer)

case/base/:页面公共方法以及页面路径
case/locators: 页面节点
case/pages/: 页面对象模型
outputs/: 测试报告
test_my/:测试脚本
config.josn: 配置文件
sutie.json:管理测试用例文件
五.Page Object模式
1.Page Object采用分层封装的设计思想,不同层关心不同的问题
2.页面对象层只关心元素定位问题,测试用例只关心测试的数据
3.通过对界面元素和功能模块的封装减少冗余代码,在后期维护中
3.1.若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码
3.1.1.显著提高测试用例的可维护性
六.断言
1.在测试用例中,执行完测试用例后,判断测试结果是PASS还是Fail

七.框架进阶
import minium
class FirstTest(minium.MiniTest):
@classmethod
def setUpClass(cls):
print('****所有用例执行前****')
@classmethod
def tearDownClass(cls):
print('****所有用例执行后****')
def setUp(self):
print('****每个用例执行前****')
def tearDown(self):
print('****每个用例执行后****')
def test_get_system_info1(self):
print("in the test_get_system_info1")
def test_get_system_info2(self):
print("in the test_get_system_info2")
八.数据驱动
import minium
data = [(1,2),(3,4)]
@minium.ddt_class
class FirstTest(minium.MiniTest):
@minium.ddt_case(*data)
@minium.ddt_unpack
def test_get_system_info(self,num1,num2):
print(num1,'*****',num2)
print(num1+num2)
九.截图
1.screen_shot()
import shutil
import minium
import os
class FirstTest(minium.MiniTest):
def test_get_system_info(self):
output_path = os.path.join(os.path.dirname(__file__), "outputs\\test_get_system_info.png")
if not os.path.isdir(os.path.dirname(output_path)):
os.mkdir(os.path.dirname(output_path))
if os.path.isfile(output_path):
os.remove(output_path)
self.app.screen_shot(output_path)
self.assertTrue(os.path.isfile(output_path))
if os.path.isdir(os.path.dirname(output_path)):
shutil.rmtree(os.path.dirname(output_path))
2.页面跳转
go_home() 跳转到小程序首页
navigate_to() 以导航的方式跳转到指定页面
redirect_to() 关闭当前页面,重定向到应用内的某个页面
switch_tab() 跳转到 tabBar 页面
import minium
import time
class FirstTest(minium.MiniTest):
@classmethod
def setUpClass(cls):
print('****setUpClass开始暂停等待获取token****')
time.sleep(5)
@classmethod
def tearDownClass(cls):
print('****关闭IDE****')
cls.mini.shutdown()
def test_get_system_info(self):
time.sleep(2)
self.app.redirect_to("/pages/ClassList/ClassList")
time.sleep(2)
self.app.go_home()
time.sleep(2)
self.app.navigate_to("/pages/AssignTaskList/AssignTaskList")
time.sleep(2)
self.app.go_home()
time.sleep(2)
self.app.switch_tab("/pages/UserCenter/UserCenter")
time.sleep(2)
十.元素定位

minium.Minium: 负责初始化框架,提供Driver启动接口,以及测试结束之后回收资源能力
minium.App: 提供小程序应用层面的各种操作,包括页面跳转,获取当前页面,页面栈等功能
minium.Page: 提供小程序页面内包括set data,获取控件,页面滚动等功能
minium.BaseElement:提供页面元素空间进行操作,以及在控件内查找子控件的能力
minium.Native: 提供针对小程序内涉及原生控件的操作封装
1.get_element():在当前页面查询控件, 如果匹配到多个结果, 则返回第一个匹配到的结果
2.get_elements():在当前页面查询控件, 并返回一个或者多个结果
import minium
import time
class FirstTest(minium.MiniTest):
@classmethod
def setUpClass(cls):
print('****setUpClass开始暂停等待获取token****')
time.sleep(5)
@classmethod
def tearDownClass(cls):
print('****关闭IDE****')
cls.mini.shutdown()
def test_get_system_info(self):
time.sleep(2)
self.app.switch_tab('/pages/TaskRecord/TaskRecord')
self.page.get_element("/page/view/view/view/view[3]/view/view[4]",max_timeout=5).tap()
time.sleep(2)
self.page.get_element("/page/view/view/view/view[4]/view/view[1]/view[1]/view[2]/view[3]/view", max_timeout=5).tap()
time.sleep(2)
self.page.get_element("/page/view/view/view/view[4]/view/view[2]/view[2]/view[2]/form/button",max_timeout=5).tap()
time.sleep(2)
十一.真机调试
1.Android
1.1.配置测试config.json
{
"project_path": "E:\code\front\dist",
"dev_tool_path": "D:\微信web开发者工具\cli.bat",
"debug_mode": "info",
"auto_authorize": true,
"platform": "Android",
"test_port": 9420,
"device_desire": {
"serial": "b777a722"
}
}
1.2.adb devices命令获取serial

1.3.获取微信测试APK安装命令
minitest --apk

1.4.安装微信测试APK
adb install -r D:\soft\Python\Python39\lib\site-packages\minium\native\lib\at\bin\AtServer.apk

1.5.执行测试用例
minitest -s suite.json -c config.json -g
2.IOS
2.1.安装 libmobiledevice
brew uninstall ideviceinstaller
brew uninstall libimobiledevice
brew install --HEAD libimobiledevice
brew link --overwrite libimobiledevice
brew install ideviceinstaller
brew link --overwrite ideviceinstaller
2.1.1.如果没有安装过直接brew install ideviceinstaller即可
2.1.2.当然也可以本地编译
git clone https://github.com/libimobiledevice/libimobiledevice.git
cd libimobiledevice
./autogen.sh --disable-openssl
make
sudo make install
2.2.配置WebDriverAgent
2.2.1.minium不包含WebDriverAgent工程,先执行以下命令clone工程
mkdir wda
cd wda
echo "{}" > package.json
npm i appium
echo `pwd`/node_modules/appium/node_modules/appium-webdriveragent
2.3.以上最后输出的路径为wda工程路径,可用xcode打开,也可写到device_desire配置中



2.4.配置完成后,可以用⌘+u快捷键运行unit test测试wda是否正常运行

2.5.配置测试config.json
{
"platform": "iOS",
"device_desire":{
"wda_project_path": "/Users/sherlock/wda/node_modules/appium/node_modules/appium-webdriveragent", //自定义 wda 的路径
"device_info": {
"udid": "aee531018e668ff1aadee0889f5ebe21a2292...", //手机的 udid
"model": "iPhone XR",
"version": "12.2.5",
"name": "sherlock's iPhone"
}
}
}
2.6.执行测试用例
minitest -s suite.json -c config.json -g
十二.其他
1.mock相关
mock_wx_method() #mock掉小程序API的调用
restore_wx_method() #去掉函数的mock
mock_request() #mock wx.request 方法,根据正则匹配结果返回特定构造的数据
mock_request_once() #mock wx.request 方法,根据正则匹配结果返回特定构造的数据,无需调用restore_request()
restore_request() #清除掉所有mock request的匹配规则
2.hook相关
hook_wx_method() #hook小程序API的调用
release_hook_wx_method() #释放hook小程序API的调用。
hook_current_page_method() #hook当前页面上的方法。
release_hook_current_page_method() #释放当前页面方法的监听函数。
3.性能相关
start_get_perf() #获取 CPU 内存 数据
stop_get_perf() #停止获取 CPU 内存 数据
更多推荐




所有评论(0)