难点二:流程控制
  Feature
  我们在上面的case中可以看到有 Feature 的标识,这是calabash的一个控制单元(我的理解),每运行一个Feature,apk都会卸载重装,保证每次都是全新无副作用的应用。
  Scenario
  这个标识是囊括在Feature中的,一个Feature可以有很多个Scenario,运行每个Scenario的时候应用只会退出再重进,不会卸载再重装。
  Hooks
  在feature/support包下,我们会看到这么几个ruby文件:
  · app_installation_hooks.rb
  · app_life_cycle_hooks.rb
  · env.rb
  · hooks.rb
  可以看到,基本上都是hook用的,我们看一个简单的 app_life_cycle_hooks.rb 理解理解:
require'calabash-android/management/adb'
require'calabash-android/operations'
Before do|scenario|
start_test_server_in_background
end
After do|scenario|
ifscenario.failed?
screenshot_embed
end
shutdown_test_server
end
  这是默认生成好的,从字面意思上看,是app生命周期的hook,这里可以看到,在主要用到了 Before 和 After 关键字进行操作,这个显然很容易看懂了,于是我自己写了一个在每个step执行之后都等待2秒的hook,下面的代码写在 hooks.rb 中(这个文件默认生成是空的):
  require'calabash-android/calabash_steps'
  AfterStep do|scenario|
  sleep 2
  end
  很容易对吧?关于这部分想多了解的可以看 cucumber wiki中的Hooks部分 。
  总结
  首先,calabash是我后选中的客户端自动化固有case的方案。这里说下原因:
  · 脚本维护成本很低,算固有case发生变化,也可以花很少的时间迅速更改脚本
  · 我们的业务固有case数量不大,操作主要涵盖的部分calabash都可以完成,编写脚本的成本低,无语言障碍
  · 可读性非常强,代码简单易懂,任何一位DEVER都可以零成本上手,有Mac的连装环境都差不多省了
  · 小范围组内使用成本低,坑有但是并不大,都可以解决,某些机型不兼容问题直接用genymotion跑行了,简单(主要还是固有case不复杂)
  · Android & iOS都可以使用
  · 玩起来很有意思,对于我这种懒人来说是福音
  估计还有一些高级的玩法我还不会,不过目前这些都够我写一些固有case了,目前我们组内将会对这个方案进行评估,没啥问题组内小范围用了,如果有感兴趣的朋友欢迎一起讨论!