史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(三)

时间:2024-10-26 08:02:52

测试覆盖率是对测试完成程度的度量。它通常依据某种覆盖准则来对测试用例执行情况进行衡量,以判断测试执行得是否充分

——出自《
计算机科学技术名词 》第三版
今天文章中我们给大家介绍覆盖率统计及覆盖率分析。在10月13日20:00,资深测试开发架构师思寒将光临直播间手把手教大家如何搞定精准化测试!

本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。
基础 1 (环境搭建和简介)
基础 2 (元素定位和元素常用方法)
基础 3 (手势操作和 uiautomator 查找元素)
基础 4 (显式等待)
基础 5 (toast 和参数化)
基础 6 (webview)
7.Appium_ 企业微信练习 (非 PO,增加和删除联系人)
8.Appium_ 企业微信练习 ( PO–增加联系人)

本文为第三篇,主要讲解 Appium Toast、参数化、WebView(附实例代码)。

  • 为了给当前视图显示一个浮动的显示块,与 dialog 不同它永远不会获得焦点;
    • 显示时间有限,根据用户设置的显示时间后自动消失;
    • 本身是个系统级别的控件,它归属系统 settings,当一个 App 发送消息的时候,不是自己造出来的这个弹框,它是发给系统,由系统统一进行弹框,这类的控件不在 App 内、需要特殊的控件识别方法;
    • Appium 使用 UIAutomator 底层的机制来分析抓取 toast,并且把 toast 放到控件树里面,但本身并不属于控件
    • AutoMationName:UIAutomator2 这个是 Appium 本身的设置就自带的,不需要额外添加,默认就是UIAutomator2;
    • getPageSource 是无法找到 Toast 的;
    • 必须使用 Xpath 去查找:
    • //*[@class=“”]
    • //*[contains(@text,“xxxxx”)]
    • adb shell dumpsys window | findstr mCurrent
    • 这个命令可以找到当前的 activity,不知道 Android 高版本是不是还 ok,由于 API Demo 权限高,可直接跳到这个 activity 运行,其他 App 就不 ok 了;
    • driver.page_source 可以打印当前的页面,可以找到 Toast 的伪控件;
    • 打印 toast 的 text 出来;
    • 参数化要解决的是一个用例可以复用的问题,比如一个用例重复使用不同的数据,就可以使用参数化,比如同一个用例,有搜索股价,比较股价,都是同一个方法,只是数据不太一样;
    • @(‘searchkey,type,price’,[
  • (‘alibaba’,‘BABA’,180),
  • (‘xiaomi’,‘01810’,10)
    • 用上面的方法去使用参数化;
    • def test_search(self,searchkey,type,price) 函数的参数要和参数化的参数的数量一样,字符串也要一样;
    • 一个用例,有2组参数化,就会运行两次 setup 和 teardown 的方法;
    • 使用 .find_element(,“:id/search_input_text”).send_keys(f"{searchkey}“),使用f”{searchkey}"是一个好东西,可以搭配参数化使用;
    • 手机端
    • 被测浏览器:(不可以是第三方浏览器)safari for ios and chrome,chromium,or browser for Android
    • PC 端
    • 安装 chrome 浏览器或者 chromium
    • 下载对应手机浏览器对应的 driver
    • 客户端代码:
    • “browserName”:“Browser” 或者 “browserName”:“Chrome” 这个是指定的浏览器
    • “chromedriverExecutable”:r"c:\chrome\" 这个是指定的chromedriver的路径
    • 如何查找app的版本:adb shell pm dump | findstr version
    • desire_cap
    • 步骤:
    • 不通过包来打开浏览器
    • 访问百度
    • 输入 tongtong,并点击搜索
    • 注意:
    • 第一次运行 Appium,看后台的路径可以找到浏览器的 chromedriver 的版本,还可以找到 chromedriver 的路径
    • /huilan_same/article/details/51896672
    • 这个网站的 chromedriver 和 chrome 版本的关系更加全
    • 断网查看,如果断网显示网页加载不了就是 WebView
    • 看加载条,有加载条通常是 WebView
    • 看顶部是否有关闭按钮
    • 下拉刷新,页面有刷新就是 WebView
    • 下拉刷新的时候是否有网页提供者
    • 用工具查看,如果元素显示 WebView,则是 WebView
    • 是 Android 系统提供能显示页面的系统控件(特殊的 view)
    • < android4.4 WebView 底层实现 webkit 内部
    • =android4.4 采用 chromium 作为 WebView 底层支持,支持 HTML5、CSS3、JS

    • WebAudio:图形化的界面收听音频
    • WebGL:页面 3d 效果的渲染
    • WebRTC:直播等等,美颜
    • PC:
    • 能够访问 Google
    • 下载对应版本的 chromedriver
    • 手机端:应用代码需要打开WebView的开关
    • 代码中要添加 chromedriverExecutable
    • 有一些 WebView 可以被 UIAutomatorview 查找到,但都不推荐,可能会出现兼容性的问题,比如 text 的显示字符串会不一样
    • 如何查找当前 WebView 的网页
    • adb shell
    • logcat | grep http
    • 就能找到访问的 HTTP 了
    • 打开 API demo 的 WebView
    • 向输入框输入文本
    • 点击 i am link
    • 退出应用
    • 打开应用
    • 点击交易
    • 点击 A 股开户
    • 输入用户名和密码
    • 点击立即开户
    • 退出应用
    • 注:打开新的页面其实就是一个新的窗口了,要切换窗口句柄了
    • 设备
    • Android 模拟器 6.0 默认支持 WebView,mumu 直接打开了,不用设置;
    • 起码模拟器和物理机需要打开 App 内开关(WebView 调试开关);
    • PC 浏览器定位元素
    • Chrome 浏览器-62版本才可以更好的看见 webview 的内部,其他的版本都有一些 bug;
    • 换成 chromium 浏览器可以避免很多坑,展示效果和速度要比 chrome 要快;
    • 代码
    • 有的设备可以使用 find_element_acessibility_id(), 不同的设备渲染的页面不同,兼容性不适合;
    • switch_to.context() 切换不同的 context,一个页面来说;
    • switch.to_window() 切换不同的窗口句柄,对不同的页面来说;
  • 更多内容,我们在后续文章分享。
    原文链接

获取更多技术文章分享
温馨提示:你以为代码覆盖率与精准化测试知识与黑盒测试无缘?不,你只是没遇到思寒讲的这节课。

常见覆盖率统计工具

  • emma
    • cobertura
    • jacoco
      emma 与 cobertura 是为单元测试而设计的覆盖率统计,jacoco 与 emma 同属于一家公司,但是是为了更广泛的覆盖率统计而设计的工具。

Jacoco

jacoco 的文档中有个 mission 章节,里面对 jacoco 的定位描述的很好。原文的大意是说其他的工具没有得到积极有效的维护,而且其他的工具都是为了单一任务而设计,他们不是为了 “集成” 而生。从这一点上我们就可以看出 jacoco 的设计理念。

得益于 jacoco 的设计理念,以及良好的 api 设计,它可以轻松的与已有的工具集成,甚至进行平台化。它也可以同时用于单元测试与集成测试,所以是一款非常优秀的覆盖率统计工具,很多公司的精准化测试,就是重度依赖了 jacoco。

覆盖率分析原理

要了解代码覆盖率的统计原理,我们就需要去深入了解 jvm 的机制。这方面的知识是 java 领域的高端进阶知识,限于篇幅,我们只讲解下大概的原理,完整内容请参考 VM 虚拟机系列的书籍,以及 newrelic 早年发布的若干代码插桩的资料。

简单说下原理,java 源代码会被 javac 编译为 class 文件,class 文件保存了 class 的基本信息与 jvm 的指令集。java 的底层 runtime,也就是 jvm 在解析 class 的时候,会把文件格式的 class 读取到内存并运行。android 也是借鉴了这一整套的设计理念,android 上的 runtime 其实是 dalvik 与 art。

当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析。通常是在读取类的时候,在关键的指令块的出口与入口增加标记。当指令块被执行后,就会命中探针并完成记录。

要修改最底层的 jvm 字节码往往是比较麻烦的,需要精通 jvm 的各种指令以及 java class 结构。这方面的处理目前已有有非常成熟的开源项目可以做大了,如下就是一些知名的字节码修改工具。

  • ASM
    • JavaAssist
    • ByteBuddy、BTrace、JVM-Sandbox
  • 其中 ASM 是所有字节码操作的底层基础,是最底层的字节码修改工具。其他工具是它之上的一些高级封装。借助于这些工具与 JVM 自身的一些调试特性,我们就可以对 jvm 代码或者进程进行便捷的操纵了。
  • 插桩方式

  • 插桩方式有很多种,常见的方式如下
    • 源代码插桩:offline 插桩,支持 android
    • 字节码插桩:offline 插桩,支持 android
    • javaagent 模式:脱离代码在运行时插桩,on the fly 模式
  • jacoco 支持字节码插桩与 javaagent 这两种插桩方式。也就是就算没有源代码也可以统计到覆盖率数据,但是最后分析的时候,还是要结合源代码才能获得更多的覆盖率细节数据。毕竟覆盖率的统计,并不是只是简单的覆盖率数据本身的指标高低。
  • jacoco的工作方式

jacoco 支持四种工作模式

  • file:进程结束的时候在本地生成文件
    • tcpserver:开启端口等待客户端获取覆盖率
    • tcpclient:主动把覆盖率数据发送出去
    • none:不生成覆盖率
  • 很多人都会使用 file 模式,但是 tcp server 模式才是最易用的。因为不需要申请服务器的文件访问权限就可控制覆盖率数据。你可以根据自己公司的部署情况选择合适的工作模式。

on the fly 插桩模式是使用最多的。首先需要在你的被测 java 程序启动的时候,加入 jvm 的一些 javaagent 参数。

-javaagent:[yourpath/]=[option1]=[value1],[option2]=[value2]
destfile
output:file、tcpserver、tcpclient、none
address
port

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

你可以自己设置适合的工作模式。
离线插桩模式,适合 android 的覆盖率统计,需要借助于 maven、gradle 等构建工具的 instrument 指令。

jacoco-cli 是 jacoco 的一个组件,可以在不依赖 maven、gradle 构建工具的情况下完成对代码的分析。主要用于 tcpserver 工作模式下。
用法如下

java -jar  dump [--address <address>] --destfile <path> [--help] \
[--port <port>] [--quiet] [--reset] [--retry <count>]

  • 1
  • 2
  • 3

这是学院里的一个动手演练的小场景,统计 jmeter 工具的启动覆盖率

project_root=/Users/seveniruby/temp/java_2/jacoco/apache-jmeter-5.2.1
jacoco_cli_jar=-0.8.6-20200329.

java -javaagent:-0.8.6-20200329. \
  -jar $project_root/bin/
#退出jmeter

#生成覆盖率报告
java -jar $jacoco_cli_jar report  \
--classfiles "$project_root/bin/" \
--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \
--html jmeter_coverage/

#生成带有源代码的覆盖率报告
 java -jar $jacoco_cli_jar report    \
  --classfiles "$project_root/bin/" \
   --classfiles $project_root/lib/ext/ApacheJMeter_http.jar \
    --html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/
#生成xml报告
java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec  \
--classfiles "$project_root/bin/" \
--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \
--xml  jmeter_coverage_tcpserver2/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

完整代码请参考学员论坛中的课程帖中的源代码。

sonarqube 可以分析 jacoco 的 exec 文件与 xml 文件,并自动导入覆盖率。exec 文件的分析后续会放弃支持,主支持 xml 文件的分析。

 sonar-scanner   \
   -=:9000   \
     -=$SONARQUBE_TOKEN   \
       -=jmeter   \
         -=1.0  \
           -=$PWD/jmeter_coverage_tcpserver2/ \
             -=/Users/seveniruby/projects/jmeter/ \
               -=/Users/seveniruby/projects/jmeter/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

导入覆盖率


可以通过如下参数限定要分析代码的范围,通常是指明要覆盖的 package 范围

导入覆盖率

sonarqube 可以智能分析新老版本之间的新增代码的覆盖率,这点非常不错,以前一些分析代码 diff 的工作就节省了。他的代码分析也比较智能,简单的换行并不会干扰代码 diff 的分析范围。

通过覆盖率数据

sonarqube 支持两种通用的测试数据导入

  • 通用覆盖率数据:
    • 通用测试执行数据:
  • 这样方便与各种框架进行集成,也方便测试工程师二次定制。
  • 通用测试数据模板。

通用覆盖率数据模板


在 sonarqube 的 scanner 分析中,加入对应的配置参数即可导入通用测试数据。
通用测试数据导入的常见用途

  • 将各种测试工具的测试报告转换为 sonarqube 支持的格式从而导入平台
    • 将各种覆盖率工具的覆盖率报告转换为标准格式导入平台
    • 根据需求对差异 diff 覆盖率进行定制,比如除了对新增代码做覆盖,还要对使用了新增代码的依赖代码也做分析
      代码的 diff 分析是一个比较大的话题,diff 只是对代码的最简单的一个分析策略,要想深入的理解代码,我们还需要更进一步的分析代码的调用链。我们先看最简单的代码 diff 分析工具。
      代码 diff 分析工具
  • JGit:git 分析工具
    • JavaParser:语法分析
    • ASM:读取字节码
    • javap:jdk 自带字节码分析工具
      精准化测试一直是 BAT 名企大厂必用技能。但黑盒测试苦于代码功底薄弱,无法消化理解并掌握。黑盒测试如何才能学会代码覆盖率及精准化测试知识呢?

10月13日晚20:00 - 21:00 资深测试架构师、开源项目作者亲授 BAT 大厂前沿技术,精准化测试之测试用例与代码关联。带你一站式 hold 住精准化测试。

获取更多技术文章分享