一、工具原理类

  1. unittest(python自带单元测试框架)
    1. 工作原理:最核心的4部分是TestCase(一个testcase的实例就是一个测试用例)、TestSuite(测试用例集)、TestRunner(运行测试用例的驱动类)、TestFixture(准备及清理工作),整个流程是首先写好TestCase,然后由TestLoader加载TestCase到TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中
    2. 优点:可扩展性强、插件少二次开发方便、提供了丰富的断言方法、python自带直接导入即可使用
    3. 缺点:无失败重跑功能
    4. 实现:自定一个类获取输入的参数,比如环境的ip端口、cookie等,TestSuite中调用不同的TestCase运行
      1. 使用的模块:configparser读取配置文件configparser.ConfigParser().get、pymsql查询数据库数据、time获取当前时间、HTMLTestRunner、unittest、sys、os、parameterized(parameterized.expand(input=datas))参数化、json(json.loads将json转为python数据结构、json.dumps()将python结构转为json;json.load()编码json数据,json.dump()解码json数据)、requests
      2. requests:
        1. get请求,以key & value形式在params中传参,requests.post(url,headers)
        2. post请求,传参格式分为data、json,requests.get(url,body,headers),区别如下:
          1. 使用json参数,不管报文是dict还是str类型,如果没指定headers中的content-type类型,默认的是application/json
          2. 使用data参数,报文是dict类型,如果未指定content-type类型,默认的是application/x-www.form.urlencoded,相当于普通form提交表单格式,会将表单内的数据换成键值对,request.body的内容格式是a=1&b=2
          3. 使用data参数,报文是str类型,如果不指定content-type类型,默认的是application/json,request.body的内容格式是{a:1,b:2}
      3. os和sys中常用的模块:
        1. sys.append()添加模块路径到程序中、sys.argv()获取输入的参数
        2. os.chdir()切换到新路径、os.mkdir()创建文件夹、os.path.exists()判断目录是否存在、os.path.dirname()返回路径的父目录、os.path.abspath()获取当前绝对路径、os.system()运行shell命令
  2. airtest
    1. 工作原理:主要包含两个框架:airtest框架-基于图像识别,使用OpenCV的两个方法,模板匹配(校验图像输入、计算模板匹配的结果矩阵res、依次获取匹配结果、求取可信度、求取识别位置)和特征匹配(校验图片是否正常、获取特征点集并匹配出特征点对、根据匹配点对提取出来识别区域、根据识别区域求出结果可信度);poco框架-基于UI控件搜索,原理类似于appium支持多种游戏引擎,不包含的可以自行扩展SDK
    2. 优点:支持多终端同时运行、跨平台、可扩展性强、操作简单上手快、相较于appium更稳定
    3. 缺点:控件定位不够准确、wda生命周期需要自行定义、五花八门的弹窗、定制化的Webview无法定位、ios运行不稳定,容易卡死
    4. 稳定性优化:页面跳转类动作增加等待时间(超时判定为不通过)、测试数据提前进行清洗和准备、单个测试用例尽可能最小化
    5. 实现:connect_device、poco、time.sleep、touch
  3. gor
    1. 原理:使用GO语言编写,用了一系列相关工具,如操作pcap、kafka等。使用pcap的go接口,使用bpf设置指定端口有的过滤表达式,监听端口的tcp报文;截取到tcp报文之后,根据网络五元组(源ip、源端口、目标ip、目标端口、协议)作为key拼装message,因为HTTP基于TCP协议,根据TCP协议中的ACK以及SEQ识别一次调用包的完整性;最后把一次HTTP调用的一个或者多个TCP报文拼装后,如果识别到HTTP协议报文已经结束,则进入转发(把这些报文中的数据拼接后直接对命令行上指定的端口发送TCP报文)阶段,完成转发,是一款流量复制工具
    2. 优点:直接拷贝线上流量,回放用户操作行为,最大程度保证压测效果的真实性;易于二次开发,使用简单,易上手
    3. 缺点:压测本身无明显报告输出、不易于改变流量数据
    4. 脚本实现:
      1. 流量采集:安装gor工具、运行nohup ./gor --input-raw :$port --output-file $filename --output-file-append --http-set-param gateway_cmd=1 --http-allow-url $url_reg & 采集数据,采集到目标文件大小或者超时,停止采集,如果1min内没有采集到数据,任务停止
      2. 流量回放:nohup ./gor --input-file "$filename|$PRESS_PERCENT" --http-disallow-url "接口特性关键字" --output-http "$DOMAIN" --input-file-loop 2>&1 &
    5. 同类型工具:
      1. jmeter:建线程组-----设置随机函数------添加HTTP信息头管理器-------使用CSV Data Set Config导入csv文件,管理cookie-----添加HTTP请求-----添加HTTP cookie管理器----查看结果树-----聚合报告----压测
      2. ab:ab -n请求总数 -c 并发数 压测接口 -C cookie:cookie以键值对形式传入
  4. nginx
    1. 原理:nginx接收到HTTP请求时,会查找配置文件将此次请求映射到一个location block,而此location配置的各个指令会启动不同的模块去工作。通常一个location指令会涉及一个handler模块和多个filter模块(当然多个location可以复用同一个模块),handler模块处理完请求,完成响应内容的生成,filter模块对响应内容进行处理;除了上述的handler、filter模块,还有一类模块就是upstream,从本质上来说upstream模块属于handler,它主要是与后端的一些服务如FastCGI进行交互,实现服务代理和负载均衡(默认使用轮询方式,按照权重比例进行访问,如果服务down掉,可以自动剔除)等逻辑
    2. 配置:
      1. 全局块:配置影响nginx全局的指令,一般有运行nginx的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等
      2. events块:配置影响nginx与用户的网络连接,有每个进程的最大连接数,是否允许同接受多个网络连接multi_accept,开启多个网络序列化accept_mutex等
      3. http块:可以嵌套多个server,配置代理、缓存、日志定义等
      4. server块:模拟主机相关参数,一个http中可以有多个server
      5. location:配置请求的路由,及页面的处理情况
    3. 跨域:指的是跨源,现代浏览器里有个同源机制,同源是指两个url里的协议、端口、域名完全相同
    4. 优点:安全,避免服务器直直接受到恶意攻击;负载均衡,实现灾备
    5. 缺点:代理服务器本身可能会存在瓶颈
  5. mock工具:将接口返回的json串存储在某一路径下,python -m SimpleHTTPServer $port 搭建一个web服务器,nginx里的location里根据要mock的请求配置转发路径,转发到存储对应mock的请求返回的json串存储路径下,修改hosts文件,启动nginx
  6. 接口无diff工具:通过gor采集到接口数据存储到网盘,diff测试前拉取最新的gor数据,通过shell脚本控制获取一定长度的数据存储到接口入参的文件中,读取该数据,同时对线上和测试发起请求存到返回路径下的文件中,拿到返回后进行diff操作,如果存在diff,将request写入request文件中,将存有diff的线上测试文件挪到各自的diff目录下,然后对两个文件进行diff,最后将diff结果输出到diff文件中,定义一个类获取这些信息,进行总结等,最后输出测试报告
  7. 环境搭建:jenkins添加slave节点、安装git、git免密设置、依赖安装
    1. java:安装jdk1.8、maven
      1. mvn package:将项目打包,放到项目的target目录下;mvn install,将项目打包放到target下,并发布到本地仓库中,供其他项目或模块引用
      2. mvn clean package:运行清理和打包;mvn clean install:运行清理、打包、安装;mvn clean deploy:运行清理、打包、发布到本地和远程仓库
    2. 中间层:安装nodejs、安装npm,部分需要安装taro,node6+要求gcc5.x
    3. c++:安装git LFS、安装scons、安装gcc52
    4. jenkins:workerspace cleanup构建前清理空间、Git parameter构建参数、mailer邮件通知
  8. 监控:研发提供接口,业务指标:调用研发接口获取qps、请求总数、审核数、开团数、成团率、关注数、入驻商家数量、店铺增粉数、风控监控(触发风控数量)、调用上游接口的qps、性能指标:location耗时、调用上游接口的耗时、访问db的耗时、登录验证的耗时(区分环境);异常指标:总体异常、调用上游接口的异常、登录异常、db异常
  9. krunner:
    1. 原理:通过命令生成脚手架工程、提供基础库:录屏、安装卸载、元素识别、只能弹窗处理等;底层安卓依赖于uiautomator2、adb,ios底层依赖于WebDriverAgent、tidevice,ai识别底层依赖于YOLOV5(Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,用户提供数据集-导入预训练模型-一键训练生成模型产物-自动上线生成open api-krunner调用)进行模型训练
    2. 优点:
      1. 统一处理弹窗
        1. 安卓安装:使用安装助手,在手机端启一个Android instrument服务启动AndroidJUnitRunner,便利弹窗,另一个线程执行adb install,拉起app;
        2. 系统/APP弹窗:使用u2 watcher,主线程执行自动化脚本,开启另一个线程,监听弹窗;
        3. ios弹窗:使用ios watcher,所有的时间操作都进行监听,发现弹窗,优先点击,再执行时间)
      2. 定位问题速度提升:操作截图流、录屏
      3. 用例编写成本低(双端用例可复用)
      4. 不需要管理u2、wda生命周期
      5. 元素识别能力较高:拥有智能等待、重试、超时机制
      6. 支持JS注入方式定位:H5页面调试用的Chrome Devtools Protocol协议,手机端用的H5Driver协议-通过adb forward到pc端-用js代码注入到webview的线程池中-即可调用js代码里的方法,主要用于定制化的一些元素属性定位
      7. 驱动稳定:重试机制(元素定位重试、失败用例重跑机制、Driver异常重试如wdb挂掉、网络请求重试如网络异常抖动等)
        1. Android方面框架集成了uiautomator2,本身稳定性较佳,vivo、华为手机可能需要关闭电池优化等
        2. ios方面:驱动稳定性即wda(编译,手机上有wda,krunner启动,然后把端口forward到pc)稳定性,事件操作容易出现WDA_ERROR/WDA_TIMEOUT:
          1. 工具运行事件较长,wda耗资源,内存使用率到达一定峰值会被销毁;解决方案-优化控件查找,动态调整snapshopMaxDepth;krunner会对所有wda元素操作,app操作,截图操作全部监控,异常自动恢复
          2. 页面布局复杂、页面树大、如评论或相册Table嵌套了很多Cell页面,XCUITest查找元素短时间内会频繁创建对象,WDA很容易崩溃;解决方案-减少不必要的dump hierarchy(如获取屏幕宽高),节省性能开销;针对控件树很大的页面,采用OCR和图像识别定位和操作元素(不需要dump)
          3. WAD服务内部所有的事件处理都是同步的,当请求过于频繁,状态同步异常,导致接口超时;解决方案-部分事件(如tab)操作,去掉不必要的状态代码同步
          4. Usbmux、Usb线连接终端,导致WDA通信异常

你可能感兴趣的:(测试,APP测试,单元测试,python)