从事测试工作以来,熟悉目前主流的 JavaScript 系,Python 系,以及 Java 系的各类测试框架,在实际项目落地过程中发现只是语法不一样,提供的 API 的功能都大同小异,对于自定义的功能都有着同样的局限,需要扩展。随着现在产品功能迭代加快对测试的快速验证能力越来越高,从而需要有对测试框架有扩展功能和对整个持续交付,部署集成的能力。
正好我在公司负责落地不同维度的自动化实施,对比单元,接口而言 UI 的落地具有特殊性。因为我们的产品是基于 Electron 封装的跨平台应用,于是顺手研究 Electron 并做了 Demo 发现本质上也是基于 Chrome 的,那当然是可以采用业界主流 SE 加上各种不同的测试驱动框架来完成,于是把当前能做 Electron 测试的找了个遍,只发现 Macaca 有这样的功能,眼前一亮,一顿操作之后发现并不支持路劲参数,也就是调不起来应用,查阅了一下 Electron 官网在测试和调试找到了 Spectron,WebDriverJs,WebdriverIO 三种不同的做法,其中就有 SE 支持的驱动库 WebDriverJs,于是就开始做了....
技术栈与公司保持一致 (node),第一次尝试:采用了 Mocha +Selenium-webdriver,除了依赖的驱动版本需要手动指定以外其他正常使用,相信使用过 SE 的同学都有个心烦的事,就是下载的驱动版本与 Chrome 的版本对不上,然后要去手动找版本,如果你本地更新了又得找版本,Macaca 也有同样的问题,所以这是 1 个问题。虽然折腾 1 下也能用,但是发现用了测试框架那么多种,在实际落地之后会发现为了满足多端跨平台的需求导致了测试框架种类多,形态各异,一听就知道维护是个大问题,且对于新手来说学习成本较高,所以开始了第二次尝试采用 Macaca 实现。但是之前也说过 Macaca 对 electron 应用支持不彻底,要是彻底支持 ElectronApp 就完美的解决了 UI 的全平台支持了,而且随着 JavaScript 各个端的发展 Electron 成为桌面解决方案的主流,当遇到基于 ElectronApp 的应用时,相信会有更多的测试同学跟我面临一样得问题。
所以,如果希望 Macaca 全面的支持 Electron,需要解决如下问题:1.将现有的 selenium-webdriver 集成在 Macaca 的依赖中,像安装移动端,Web 端那样简单,不用再到处找解决方案,使得他们变成 1 个整体;2.解决自动下载对应的驱动版本,且支持不同平台。明白了要做什么之后剩下的就是解决问题,开始干!
以 macaca-chromedriver 项目举例:
先确认此项目还有人维护,不然浪费自己精力
检查已经存在的 issues 和 pull requests,确保不要做别人已经在做的事情
找到项目 macaca-chromedriver 点击 Fork,在你的 Github 主页也会存在此项目的拷贝,一定要先 Fork!我忽略了这一步,然后在坑里蹲了一会...
将 macaca-chromedriver Fork 的项目本地 Clone; 我的是git clone https://github.com/Super-Ps/macaca-chromedriver.git
进入刚才 Clone 的 Macaca-chromedriver 项目,建立本地仓库跟原始项目的的链接:git remote add upstream https://github.com/macacajs/macaca-chromedriver.git
这样可以随时从原始项目 pull 最新的内容
查看远程仓库列表此时应该有 2 个仓库,一个你 Frok 的项目,一个原始的项目,我的是这样的:
$ git remote -v
origin https://github.com/Super-Ps/macaca-chromedriver.git (fetch)
origin https://github.com/Super-Ps/macaca-chromedriver.git (push)
upstream https://github.com/macacajs/macaca-chromedriver.git (fetch)
upstream https://github.com/macacajs/macaca-chromedriver.git (push)
想好要修改文件之前,先创建一个分支,且切换在该分支上 git checkout -b BRANCH_NAME
现在可以修改项目了,要清楚现在是在你自己 Fork 的项目上操作的,跟原始的项目没暂时没关系,所以自己 push 到 Fork 项目之前,要从原始项目拉 1 次最新代码,比如我这里的远程 upstream 仓库 pull 最新的修改。
修改并提交完成之后,推送 git push origin BRANCH_NAME,这个分支名 是你 Fork 项目时创建的分支,现在是往 Forx 上 push,不是原始的仓库。
现在可以 pull request 了,打开你的 github Fork 的 macaca-chromedriver 项目 ,点击 new pull request ,可以查看原始项目和你 Fork 项目的不同分支,查看对比你修改的部分,如果你确定你的提交是没有问题的,点击确定,等待作者的反馈
收尾工作,如果贡献代码被采用合并了,或者被拒绝了,就可以删除本地分支了: git branch -D BRANCH_NAME ,删除 GitHub 上的分支: git push origin --delete BRANCH_NAME ,如果需要同步源项目代码到 Fork 项目 ,先把代码从源项目更新到最新 git pull upstream master
合并git merge upstream/master
再 push 到 Fork 项目上 git push origin master
在 PR 过程中频频被拒绝的几个问题以及反思:
代码逻辑混乱,有鸡肋,因为怕改动原有逻辑导致扩展写的复杂且重复; 反思:需要深刻梳理你所修改的功能的整体性,保持代码简洁,不能只顾实现而修修补补。
let const var 不规范使用; 反思:加深对 JavaScript 规范不断的熟悉。
本地测试一顿提交,长如葫芦串,还没实际意义;反思:需要提交时做到有意义的提交,一个功能一个提交,便于其他维护者查看。
当别人在看你写的代码并给你指出问题的时候,总有那么点不好意思或者很慌张,但是我们都知道这是一种成长,何况还是大神看你的代码,且先收起畏惧,并谦虚的接受并改正,勇敢的面对自己的不足。我跟很多人刚开始心态一样,我们就用用别人的东西就好了,开源项目还看要看源码好难,麻烦,没时间,没决心,其实当你勇敢的前进第一步可能会信心倍增!激增你的兴趣,学习了别人的思路,也提高了代码质量,拉开了与其他只会调 api 测试的距离,更重要的是帮助了更多的人。
目前只是完善了问题 2 的版本问题,还剩余对 LIUNX ,WIN 的支持,还需要将 macaca-chromedriver 作为依赖 做成 1 个支持 Electron 的驱动。
完成 Electron App 方案的开发,给开源社区贡献的同时能给有基于同样需求的同学收益,希望有更多有开源精神的同学加入!