为啥要 Debug 源码工程

我也不想,开源项目你懂的,欲说无泪。并不是你想的那么完美,开箱即用。有时候,不得不必须去调试和 Debug,查看源码执行逻辑,查看一些变量和值的引用传递来捕获为何出错。
与其在各个群里乱问一通,还是联系提 issue 或是直接 Q 微 钉 作者,那都是相当的慢,正所谓求人不如求己,没有枪没有炮那就得逼自己提升个人技能。

其实 我也不懂什么 scala 什么 sbt 都是搜一点 看一点 想一想 试一试。错了就再搜一点 看一点 想一想 试一试,如此往复。

之前没 build 通该源码项目前,我是先直接用的 appcrawler-2.1.3.jar 跑过一遍自家 app 遍历配置,通过生成的遍历日志文件 去源码里找的 也能大致了解源码执行逻辑。如图:


最后还是没看到我想知道的只能继续 build 通源码工程

IDEA debug scala sbt project 参考

https://www.jetbrains.com/help/idea/run-debug-and-test-scala.html

https://github.com/CSUG/real_world_scala/blob/master/02_sbt.markdown
请先自行配置部署 IDEA 及其 scala 和 sbt 插件环境

git clone 得到源码工程

cmd@TR:~/workspace/git$ git clone https://github.com/seveniruby/AppCrawler.git
正克隆到 'AppCrawler'...
remote: Counting objects: 3128, done.
remote: Total 3128 (delta 0), reused 0 (delta 0), pack-reused 3128
接收对象中: 100% (3128/3128), 35.76 MiB | 1.10 MiB/s, 完成.
处理 delta 中: 100% (1500/1500), 完成.
检查连接... 完成。

import sbt 工程

IDEA import 选中 AppCrawler 下的 build.sbt 导入 scala sbt 构建的项目 AppCrawler,然后 IDEA 工具会自动构建 build

Run AppCrawler.scala

右键 Run 运行 AppCrawler.scala 报错找不到 macaca.client.MacacaClient 引用包下的 swipe 方法

排查解决

经过排查和不断折腾 2 天有余后, 学习 scala sbt 构建 build.sbt
应该是引用的 macaca.client.MacacaClient 确实无 swipe 方法,实际上就是 wd.java 该开源项目已经在 2.0.7 去掉了该方法故找不到,查 wd.java 最新版本为 2.0.20
最后更改 build.sbt macacaclient 实际既是 wd.java 版本由 2.0.7 为 2.0.20 再自动 import 后 成功执行

接下来 你便可以打断点和 debug 了 了解源码执行逻辑调用关系。

以及参考https://github.com/seveniruby/AppCrawler/blob/master/doc/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%BB%93%E5%90%88.md
中的 该小节 ” 第一个自动化测试用例 “去在源码中写些测试代码.

你先可以找到 TestXueQiu 来参考作者写的和引用的配置 xueqiu_private.yml 来跑一遍先。

看了下 TestXueQiu 和 xueqiu_private.yml 需要改几处地方即可跑起了
注释掉 TestXueQiu 下的该段

/*  test("appcrawler base example"){
    AppCrawler.main(Array("-c", "src/test/scala/com/testerhome/appcrawler/it/xueqiu_base.yml",
      "-o", s"/tmp/xueqiu/${System.currentTimeMillis()}", "--verbose"
    )
    )
  }*/

因为源码工程里没有 xueqiu_base.yml

这段 test 其实也可以注释掉,不注释掉的话会先执行该段 test 去启动一次 xueqiu,你注释掉了,就是只跑后边引用 xueqiu_private.yml 的 test("appcrawler") 该段 test 了。

/*  test("all app "){
    capability.setCapability("app", "")
    capability.setCapability("appPackage", "com.xueqiu.android")
    capability.setCapability("appActivity", ".view.WelcomeActivityAlias")
    val driver=new AndroidDriver[AndroidElement](new URL("http://127.0.0.1:4723/wd/hub"), capability)

  }*/

再修改下 xueqiu_private.yml

androidCapability:
  deviceName: "192.168.58.101:5555"    

改为你启动的安卓虚拟器或真机 udid 要提前安装好 xueqiu.apk 或 yml 里用 app:" " 处指定安装路径

automationName: appium  

改为用 appium 做测试驱动 不用它写的 uiautomator

然后启动个 appium server 默认端口与源码一致 4723

cmd@TR:~$ appium --session-override
[Appium] Welcome to Appium v1.7.2
[Appium] Non-default server args:
[Appium]   sessionOverride: true
[Appium] Appium REST http interface listener started on 0.0.0.0:4723

右键 run TestXueQiu 即可了。

其他的可以参考我以前的分享:
Appcrawler 参数实验经验


↙↙↙阅读原文可查看相关链接,并与作者交流