一…根目录下新建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 内存 数据
Logo

一站式 AI 云服务平台

更多推荐