腾讯出品小程序自动化测试框架【Minium】系列(二)项目配置及测试套件使用说明

一、写在前面

真的人这一散漫惯了,收心就很难了,上午把小程序开发环境启动后,在QQ游戏里,杀了三把象棋,5把2D桌球,一上午没了,还是没法心静下来去学点东西。

那就老样子,逼着自己开始,找到 “肌肉记忆” 自然也就可以静下心去思考问题了。

二、搞定配置项

1、配置文件部分

示例如下:

{
  "project_path": "D:\\pyworkspace\\miniprogram-demo",
  "dev_tool_path": "E:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat",
  "debug_mode": "warn"
}

这里很多参数没写,即走默认的配置项,关于详细的测试配置说明,请参看官方文档说明

2、命令行工具

测试用例既可以用unittest的方式执行,也可以用minitest来加载用例执行,相关的参数说明如下:

minitest 命令

  • -h, --help: 使用帮助。
  • -v, --version: 查看 minium 的版本。
  • -p PATH/--path PATH: 用例所在的文件夹,默认当前路径。
  • -m MODULE_PATH, --module MODULE_PATH: 用例的包名或者文件名
  • --case CASE_NAME: test_开头的用例名
  • -s SUITE, --suite SUITE:就是suite.json文件,文件的格式如下:
{
  "pkg_list": [
    {
      "case_list": [
        "test_*"
      ],
      "pkg": "test_case.*_test"
    }
  ]
}

说明:

  • pkg_list字段说明要执行用例的内容和顺序,是一个数组,每个数组元素是一个匹配规则,会根据pkg去匹配包名,找到测试类,然后
  • 根据case_list里面的规则去查找测试类的测试用例。可以根据需要编写匹配的粒度。注意匹配规则不是正则表达式,而是通配符。

三、入门栗子

1、目录结构

2、编写第一个case

# -*- coding: utf-8 -*-
"""
# @Time    : 2023/01/25 12:49
# @Author  : longrong.lang
# @FileName: sysinfo_test.py
# @Software: PyCharm
# @Blog    :http://style4.7lz.top/www/cnblogs/longronglang/
# @Motto:ABC(Always Be Coding)
"""
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)

3、运行单个case

执行如下命令:

minitest -m test_case.sysinfo_test -c config.json -g

重点:

测试用例的命名,一定要casename_test,否则不好使,不信你可以写成test_casename,命令行执行体验报错的感觉!

运行结果如下:

4、批量执行测试

执行如下命令:

minitest -s suite.json -c config.json -g

运行结果如下:

测试套件的意义在于可以批量执行用例,也是我们做自动化测试首选的方式。

部分参数说明:

  • -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

更多命令行参数请参考命令行工具

5、生成测试报告

本地报告

执行如下命令:
python -m http.server 12345 -d outputs

打开浏览器,访问http://localhost:12345即可查看报告。

利用nginx的配置报告

 server {
   listen 80;
   server_name  your.domain.com;

   location / {
     alias /path/to/dir/of/report;
     index index.html;
   }
 }

四、写在最后

可能有同学看到这会觉得,与上一篇文章好像一样,有那么一丢丢不一样,加入了实际案例及运行参数举例讲解,状态算是找回来了吧!

我是六哥,关于小程序自动化测试框架的学习,我会持续更新,感觉对您有帮助,请继续关注我,帮忙星标并转发即可!

优秀不够,你是否无可替代

软件测试交流QQ群:721256703,期待你的加入!!

欢迎关注我的微信公众号:软件测试君


本文转载于网络 如有侵权请联系删除

相关文章

  • SQL 行转列,列转行

    行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换行转列假如我们有下表: SELECT* FROMstudent PIVOT( SUM(score)FORsubjectIN(语文,数学,英语) )复制通过上面SQL语句即可得到下面的结果PIVOT后跟一个聚合函数来拿到结果,FOR后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。IN后面跟的就是具体的科目值。当然我们也可以用CASEWHEN得到同样的结果,就是写起来麻烦一点。SELECTname, MAX( CASE WHENsubject='语文' THENscore ELSE0 END)AS"语文", MAX( CASE WHENsubject='数学' THENscore ELSE0 END)AS"数学", MAX( CASE WHENsubject='英语' THENscore ELSE0 END)AS"英语" FR

  • 小程序 · 一周报

    01微信调整“小程序跳转小程序”功能目前,通过绑定至同一个公众号,两个小程序就能便捷地互相访问,方便用户使用更多服务。随着小程序间连接规模的不断增长,产生了很多优秀的合作场景,但是也陆续暴露出一些问题。如很多中长尾的小程序缺少合作沟通渠道,而寻求公众号绑定的门槛较高;部分开发者利用“小程序跳转小程序”的便捷性,在打开页面时就自动跳转其他小程序,给用户的正常使用带来困扰;个别开发者利用该功能进行流量互导,影响小程序生态的健康。为此,微信将尽快弥补该功能设计上的缺陷,调整相关规则。具体措施如下:1、需要用户触发跳转即日起,若用户未点击小程序页面任意位置,则开发者将无法调用wx.navigateToMiniProgram接口自动跳转至其他小程序。2、需要用户确认跳转在跳转至其他小程序前,将统一增加弹窗,询问是否跳转,用户确认后才可以跳转其他小程序。该功能预计10月中旬发布。3、源小程序与目标小程序不再需要绑定至同一个公众号小程序可以跳转至任意其他小程序,无需任何关联或绑定。4、每个小程序可跳转的其他小程序数量限制为不超过10个指定日期后,开发者提交新版小程序代码时,如使用了跳转其他小程序功能

  • iOS的MVC框架之控制层的构建(下)

    在我的iOS的MVC框架之控制层的构建(上)一文中介绍了一些控制层的构建方法,而这篇文章则继续对一些方法进行展开讨论。MVC被众多开发者所诟病的C层的膨胀,究其原因不外乎有如下几点:所有视图的构建和布局代码都在控制器中完成。有很多同学不喜欢系统提供的Storyboard和XIB来构建视图,而是喜欢通过代码的形式来完成视图界面布局,并且通常这部分代码都集中在loadView或者viewDidLoad或者通过懒加载的形式分散在各处。通过代码来构建和布局视图的代码量有可能会超过您视图控制器总代码量的50%。对服务端的请求,往往就是包装了一层非常薄的请求层,通常称之为APIService。这部分代码只是简单封装了对服务端URL的请求,同时通过一些报文转数据模型的第三方框架直接将报文转化为数据模型并通过异步回调的形式回吐给控制器或者视图。APIService的简单实现却增加了控制器的负荷,导致控制器除了要构建视图并且请求网络服务外还要担负非常多的一部分业务逻辑的实现。对于一些复杂展示逻辑的功能界面没有进行合理拆解和有效设计导致所有代码都在一个视图控制器内完成,从而导致控制器膨胀臃肿。在应用中最多

  • 瑞吉外卖实战项目全攻略——第一天

    瑞吉外卖实战项目全攻略——第一天该系列将记录一份完整的实战项目的完成过程,该篇属于第一天案例来自B站黑马程序员Java项目实战《瑞吉外卖》,请结合课程资料阅读以下内容该篇我们将完成以下内容:软件开发整体介绍瑞吉外卖项目介绍开发环境搭建后台登录系统功能开发后台退出系统功能开发软件开发整体介绍这个项目属于我的第一个完整项目,所以我们将从软件开发的概念来开始介绍软件开发流程软件开发主要分为五个阶段,每个阶段带有不同的需求:需求分析需求分析需要设计产品原型,产生需求规格说明书设计设计主要负责产品文档,UI界面设计,概要设计,详细设计,数据库设计等设计信息编码编码主要负责项目代码以及单元测试,也就是我们着重介绍的部分测试测试主要负责准备测试用例,书写测试报告上线运维上线运维主要包括软件环境安装,配置等角色分工我们的公司中通常具有不同的岗位,这些岗位被称为角色每个角色都具有不同的项目作用:项目经理对整个项目负责,任务分配,把控进度产品经理进行需求调研,输出需求调研文档,产品原型等UI设计师根据产品原型输出界面效果图架构师项目整体架构设计,技术选型等开发工程师代码实现测试工程师编写测试用例,输出测试

  • 一篇文章带你搞懂InnoDB的索引|结合样例

    关注公众号【程序员白泽】,带你走进一个不一样的程序员/学生党 前言 前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况。所以今天这篇文章给大家讲讲索引,结合一些案例分析一下一个SQL查询走索引时涉及到的最左前缀原则。 在讲解最左前缀原则之前,先复习一下MySQL索引的重要基础知识(下面都将基于InnoDB存储引擎下的索引规则) 索引类型 主键索引 InnoDB存储引擎使用B+树建立索引,主键索引的非叶子结点存放主键字段的值,通过主键中的字段构建B+树,叶子结点存放对应主键的整一条记录的信息(因此主键索引也称为聚集索引),每张表只能建立一个主键索引(聚集索引)。 辅助索引 辅助索引(SecondaryIndex),也叫做二级索引,也是通过B+树建立,与主键索引的唯一不同之处在于,叶子结点存放的是对应行的主键值,而不是行数据(因此也叫做非聚集索引,获取主键值之后,需要再次去主键索引表中查询该主键对应的记录,获取其叶子结点存储的记录内容,相当于要搜索两张索引表) 举个例子 这里给出一张表,id字段为主键索引,age字段为普通索引,然后插

  • 谈一谈我在阿里的成长

    前几天受阿里通信的同事邀请,分享了一个关于成长的话题。其实我不太热衷于分享此类话题,作为一个技术人,分享那些没有技术干货的内容总感觉有些怪怪的。但最后还是拟下了这个话题——《谈一谈我在阿里的成长》,所以本文主要是对分享的PPT做简述。 可以回首一下,毕业工作后的这段时间里,你做过哪些事情让自己感觉有了很大的成长? 我简单枚举了一下,主要是这几个方面: 涉足一个未知的领域,走进去,那就是成长;能够坚持不懈的完成一件事情,优化一个项目,那也是成长;能够沉淀方案,推广自己的想法,让更多的人收益,那也是成长;能够带领多个人去完成一个项目,那更是很不错的成长。 成长总是伴随着痛苦,因为你需要解决一个以前从未解决过的问题。你可以参考别人的处理方法,也可以自己摸索,但不管怎样,都需要硬着头破走过去,破茧成蝶,那才能成长。 工作之后,能够支配的时间越来越少了,尤其是在互联网行业,或许你每天就是在加班加点中度过,每每回到家,就只想苟延残喘一下,好好躺着,闭上眼睛迎接苦逼的第二天,就不用说什么利用闲暇时间搞搞研究,提升下自己了。所以会时常把成长这件事情放在公司,希望在工作中提升自己。下面我来聊一聊,我是

  • zabbix的图形处获取不到数据。

    在zabbix-server-------->zabbix-proxy-------->zabbix-agent环境中。   配置是正确的。重启了zabbix-agent.但是在zabbix的web界面上没有获取到数据,或者是数据无法更新。则也需重启zabbix-porxy才行。 比如:今天出现一个问题。我原先只是重启过zabbix-agent。在检测--->最新数据已经获取到数据。但是在Zabbix的web界面的图形这,图形是没有数据的。或者只是部分几台VM的图形能够有数据,其他的几台都没数据。 此时,重启下zabbix-proxy,解决相应问题。

  • 《典范英语》Good English简介

    《典范英语》(GoodEnglish)是英国牛津大学出版社出版的一套家喻户晓的英语母语学习材料,闻名英国,享誉世界。英国有80%的学校用它教学生学习母语,全球有133个国家用它作为外语学习教材。 《典范英语》共分十级,其中《典范英语》(1-6)针对小学生,《典范英语》(7-10)针对中学生。《典范英语》(1-6)在国内问世以来,深受广大英语教师、学生和家长的喜爱。《典范英语》(7-10)在此基础上,又从原版中精选出64部适合我国中学生使用的作品,由权威英语教育专家精心编辑而成。   《典范英语》原版引进,语言鲜活生动,纯正地道,内容丰富有趣,引人入胜,图文并茂,贴近学生生活,由浅入深,循序渐进,配有详尽注释和原声录音,融故事性、趣味性、知识性、科学性、权威性于一体,是我国中小学生不可多得的一套英语经典学习材料。   《典范英语》采用全新的教育理念,倡导“在故事中轻松、快乐、自然习得英语”,强调激发兴趣、培养语感、开阔视野、启迪心智、陶冶情操、奠定基础,符合语言教育规律。本套教材为全国教育科学“十一五”规划教育部重点课题——《中国基础英语素质教育的途径与方法》课题实验教材,得到我国英语

  • SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    目录1.1LTW与不同的切面织入时机1.2JDK实现LTW的原理1.3如何在Spring中实现LTW2.Springboot中使用LTW实现AOP的例子3.参考资料 1.1LTW与不同的切面织入时机 AOP——面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强。按切面被织如到目标类中的时间划分,主要有以下几种: 1.运行期织入 这是最常见的,比如在运行期通过为目标类生成动态代理的方式实现AOP就属于运行期织入,这也是SpringAOP中的默认实现,并且提供了两种创建动态代理的方式:JDK自带的针对接口的动态代理和使用CGLib动态创建子类的方式创建动态代理。 2.编译期织入 使用特殊的编译器在编译期将切面织入目标类,这种比较少见,因为需要特殊的编译器的支持。 3.类加载期织入 通过字节码编辑技术在类加载期将切面织入目标类中,这是本篇介绍的重点。它的核心思想是:在目标类的class文件被JVM加载前,通过自定义类加载器或者类文件转换器将横切逻辑织入到目标类的class文件中,然后将修改后class文件交给JVM加载。这种织入方式可以简称为LTW(LoadTime

  • Win10系列:C#应用控件进阶7

    PathGeometry 前面介绍了Path的使用方法,接下来介绍PathGeometry类。PathGeometry提供了描绘由弧线、曲线和直线组成的多个复杂图形的方法。PathGeometry的核心是PathFigure对象集合,PathFigure自身由一个或多个PathSegment子类对象组成,每个子类对象均描绘几何图形的一个片段。下面列出了PathFigure对象集合中常用的线段类型。 LineSegment,在两个点之间创建一条直线。 BezierSegment,在两个点之间创建一条三次方贝塞尔曲线,由起点(前一条线段的终点)、终点以及两个控制点构成。 ArcSegment,在两个点之间创建一条椭圆弧线,通过设置Size属性确定X轴半径和Y轴半径的大小,定义Point属性可以设置椭圆弧的终点。只有Size和Point属性并不能完全确定弧线的形状,ArcSegment还有SweepDirection和IsLargeArc两个属性,分别设置以顺时针或逆时针方向绘制弧线和弧线的弧度是否应大于180度。 PolyLineSegment,通过设置Poi

  • Vue事件绑定

    Vue事件绑定 Vue对事件的基本操作: 页面标签中使用v-on:xxx或者简写@xxx绑定事件,xxx指事件属性名 事件的回调函数配置在data对象的methods属性对象中,最终绑定在vm上 methods中的函数不要使用箭头函数(function()=>{})形式,否则函数中的this将不会是vm对象 methods中配置的函数,都是被Vue所管理的函数,this指向vm或者组件实例对象 绑定的函数默认(不传递自定义参数时)带一个参数event,表示当前事件对象;当有向函数中传递自定义参数时,可以使用$event关键字来传递事件对象。如@click="demo(arg1,$event,arg2)" <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>event</title> <scripttype="text/javascript"src="../js/vue.js"></script>

  • 【代码笔记】Web-CSS-CSS Table(表格)

    一,效果图。 二,代码。   <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title>CSSTable表格</title> <style> table{ border-collapse:collapse; width:100%; } table, th, td{ border:1pxsolidgreen; } th{ height:50px; background-color:green; color:white; } td{ text-align:right; height:50px; vertical-align:bottom; padding:15px; } </style> </head> <body> <table> <tr> <th>Firstname</th> <th>Lastname</th> &

  • MD5

      importjava.io.UnsupportedEncodingException; importjava.math.BigInteger; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException;   publicclassMD5{      publicstaticStringhex2asc(Stringstr){        String[]s=str.trim().split("\\\\x");        //System.out.println(s.length);        StringBuffersb=newStringBuffer();    &nb

  • 实例化、销毁游戏物体

    1.实例化游戏物体 1.游戏中的案例介绍 在很多MMORPG类的游戏中都有类似于“金钱副本”的副本关卡。在这类副本中通常都是限定一个时间,在这个时间内玩家可以尽情的破坏,然后收集金钱。 分析游戏截图讲解场景元素: ①场景中所有的坛子,模型都是一样的,坛子是预制体。 ②坛子是从“天上”掉下来的,所以坛子模型身上有刚体组件。 ③如果玩家在一段时间内没有打碎坛子,这些坛子会消失。 2.案例场景制作 ①创建地面模型; ②创建“坛子”模型,并制作成预制体; 3.实例化生成1个坛子 GameObject.Instantiate(Object,Vector3,Quaternion); 参数说明: Object:用于实例化的预制体; Vector3:实例化后生成的物体所在的位置; Quaternion[四元数]:实例化后生成的物体的旋转状态; Quaternion.identity:无旋转; 4.构造随机位置 位置是用Vector3类型进行表示的。 X,Y,Z三个值确定了物体在三维世界中的位置。 Random.Range(min,max):生成随机数。 在min和max直接随机生成一个随机数。 演示:

  • 学习笔记TF046:TensoFlow开发环境,Mac、Ubuntu/Linux、Windows,CPU版本、GPU版本

    下载TensorFlowhttps://github.com/tensorflow/tensorflow/tree/v1.1.0。Tags选择版本,下载解压。 pip安装。pip,Python包管理工具,PyPI(PythonPacketIndex)https://pypi.python.org/pypi。 Mac环境。安装virtualenv。virtualenv,Python沙箱工具,创建独立Python环境。pipinstallvirtralenv--upgrade安装virtualenv。virtualenv--system-site-packages~/tensorflow创建tensorflow文件夹。cd~/tensorflow进入目录。sourcebin/activate激活沙箱。pipinstalltensorflow==1.1.0安装TensorFlow。 Ubuntu/Linux环境。先安装virtualenv沙盒环境,再用pip安装TensorFlow。CPU版pipinstalltensorflow==1.1.0。GPU版pipinstalltensorflo

  • JAVA作业

    1.简述Scanner类及Random类的功能和使用方式? Scanner:功能:Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据。使用方式:1、导包:importjava.util.Scanner;2、创建对象实例:Scannersc=newScanner(System.in);3、调用方法:inti=sc.nextInt();Random:功能:这个Random类,它可以产生多种数据类型的随机数。使用方式:1、导包:所属包java.util.Random2、创建实例格式:Random变量名=newRandom();3、调用方法:inti=r.nextInt(100); 2.if语句的格式有几种?注意事项是什么?分别在什么时候使用? if(判断条件){执行语句};在什么时候使用:如果满足某种条件,就进行某种处理。注意事项:判断条件是一个布尔值,当判断条件为true时,{}中的执行语句才会执行。if(判断条件){执行语句1}else{执行语句2};在什么时候使用:如果满足某种条件,就进行某种处理,否则就进行另一种处理。注意事项:判断条件是一个布

  • 事件循环

    https://blog.csdn.net/z591102/article/details/107541133      

  • 读书共享 Primer Plus C-part 5

    第五章运算符、表达式和语句 关于+-的一元运算符和二元运算符的区别 a++:a先创建自身的一个副本,然后a自增1,最后返回副本的值a+=1:事实上相当于++a a=a+1:虽然有点雷同于a+=1,但不同的是此时右值的a和1做相加操作,形成一个副本然后赋值给a,所以有额外操作 ++a:将a自增1并返回a 鉴于a++和++a的差别,C++Primer建议用++a作为for循环的递增量复制     2.关于除法四舍五入      #include<stdio.h> #include<string.h> intmain() { inta=3; intb=4; intc=(int)(a/1.0/b+0.5); printf("%d\n",c); return0; }复制   /1.0在保持值不动的情况下。使得结果是浮点数,同时进行+0.5保持四舍五入效果。  3.关于运算优先级    关于运算符的结合从右到左(暂时不清

  • containerd镜像拉取配置

    背景:   公司要求部署最一套新版的k8s系统来部署生产应用,说实话很头疼。因为k8s自1.23版本之后就用不docker作为容器的默认运行时了,而是采用的containerd,这就带来了一系列的问题。没有经验的问题,百度文档少的问题。。。 实际配置   contained的配置文件在/etc/containerd/config.toml ... [plugins."io.containerd.grpc.v1.cri".registry] config_path="" [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.headers] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".re

  • Vue3的mixin

    小编在之前的项目中还没有接触过minxin(数据混入),直到一次面试的时候,面试官问我,我才注意到,原来还有这样的一个东西,今天小编就和大家一起看看这个神奇的mixin。个人感觉mixin和组件的注册和使用很类似,我们要注册一个局部的mixin的时候,可以这样 //组件data和methods优先级高于mixin中的data优先级,组件和mixin数据同时存在的时候,使用组件中的data数据,如果组件内部没有data,使用mixin中的数据 //声明周期函数,先执行mixin里面的,再执行组件里面的生命周期函数 constmyMinxin={ data(){ return{ num:2 } }, created(){ console.log('mixincreated') }, methods:{ handleClick(){ console.log('mixinhandleClick') } } } constapp=Vue.createApp({ data(){ return{ num:1 } }, mixins:[myMinxin], methods:{ handleCli

  • java生成4个不同的随机数

    packagelianxi; importjava.util.Random; publicclasssuijishu{ publicstaticvoidmain(String[]args){ Randomrandom=newRandom(); int[]arr=newint[4]; arr[0]=random.nextInt(9); inti=1; //外循环定义四个数 while(i<=3){ intx=random.nextInt(9); /*内循环:新生成随机数和已生成的比较, *相同则跳出内循环,再生成一个随机数进行比较 *和前几个生成的都不同则这个就是新的随机数 */ for(intj=0;j<=i-1;j++){ //相同则跳出内循环,再生成一个随机数进行比较 if(arr[j]==x){ break; } //执行完循环和前几个生成的都不同则这个就是新的随机数 if(j+1==i){ arr[i]=x; i++; } } } //打印出来生成的随机数 for(intaaa:arr){ System.out.print(aaa); } } }复制 &nbs

相关推荐

推荐阅读