什么是 Calabash?

Calabash 是一个自动化测试框架,它可以测试 Android 和 iOS 原生应用和混合应用。

它有:

  • calabash-android

  • calabash-ios

主页:http://calabash.sh

Calabash-android介绍

Calabash-android 是支持 android 的 UI 自动化测试框架,PC 端使用了 cucumber 框架,通过 http 和 json 与模拟器和真机上安装的测试 apk 通信,测试 apk 调用Robotium的方法来进行 UI 自动化测试,支持 webview 操作。

Calabash-android 架构图

Calabash Android 简介_第1张图片

  • Features —— 这里的 feature 就是 cucumber 的 feature,用来描述user stories

  • Step Definitions —— Calabash Android 事先已经定义了一些通用的step。你可以根据自己的需求,定义更加复杂的步骤。

  • Your app —— 测试之前,你不必对你的应用修改。(这里其实是有问题,后面我们会说到。)

  • Instrumentation Test Server —— 这是一个应用,在运行测试的时候会被安装到设备中去。 这个应用是基于 Android SDK 里的ActivityInstrumentationTestCase2。它是 Calabash Android 框架的一部分。Robotium 就集成在这个应用里。

Calabash-android 环境搭建

ruby 环境

  • rvm

  • rbenv

  • RubyInstaller.orgfor windows

Android 开发环境

  • JAVA

  • Android SDK

  • Ant

指定 JAVA 环境变量, Android SDK 环境变量(ANDROID_HOME), Ant 加入到 PATH 中去。

安装 Calabash-android

geminstallcalabash-androidsudogeminstallcalabash-android#如果权限不够用这个。

如有疑问,请参考:https://github.com/calabash/calabash-android/blob/master/documentation/installation.md

创建 calabash-android 的骨架

calabash-androidgen

会生成如下的目录结构:

➜calabashtree.features|_support||_app_installation_hooks.rb||_app_life_cycle_hooks.rb||_env.rb|_step_definitions||_calabash_steps.rb|_my_first.feature

写测试用例

像一般的 cucumber 测试一样,我们只要在 feature 文件里添加测试用例即可。比如我们测试 ContactManager.apk (android sdk sample 里面的, Appium 也用这个 apk)。

Calabash Android 简介_第2张图片

Calabash Android 简介_第3张图片

我们想实现,

  • 打开这个应用

  • 点击 Add Contact 按钮

  • 添加 Contact Name 为 hello

  • 添加 Contact Phone 为 13817861875

  • 添加 Contact Email 为 hengwen@hotmail.com

  • 保存

所以我们的 feature 应该是这样的:

Feature:LoginfeatureScenario:AsavaliduserIcanlogintomyappWhenIpress"AddContact"ThenIsee"TargetAccount"ThenIenter"hello"intoinputfieldnumber1ThenIenter"13817861875"intoinputfieldnumber2ThenIenter"hengwen@hotmail.com"intoinputfieldnumber3WhenIpress"Save"ThenIwaitfor1secondThenItogglecheckboxnumber1ThenIsee"hello"

这里 input field number 就针对了 ContactAdder Activity 中输入框。我现在这样写其实不太友好,比较好的方式是进行再次封装,对 DSL 撰写者透明。比如:

WhenIenter"hello"as"ContactName"

step_definition

When(/^Ienter"([^\"]*)"as"([^\"]*)"$/)do|text,target|index=casetargetwhen"ContactName":1...endsteps%{ThenIenter#{text}intoinputfieldnumber#{index}}end

这样 feature 可读性会强一点。

运行 feature

在运行之前,我们对 apk 还是得处理下,否则会遇到一些问题。

  • App did not start (RuntimeError)

因为calabash-android的client和test server需要通信,所以要在 AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.INTERNET" />

  • ContacterManager 代码本身的问题

由于 ContacerManager 运行时候,需要你一定要有一个账户,如果没有账户 Save 的时候会出错。为了便于运行,我们要修改下。

源代码地址在$ANDROID_HOME/samples/android-19/legacy/ContactManager,大家自己去找。

需要修改com.example.android.contactmanager.ContactAdder类里面的createContactEntry方法,我们需要对 mSelectedAccount 进行判断, 修改地方如下:

//Preparecontactcreationrequest////Note:WeuseRawContactsbecausethisdatamustbeassociatedwithaparticularaccount.//Thesystemwillaggregatethiswithanyotherdataforthiscontactandcreatea//corespondingentryintheContactsContract.Contactsproviderforus.ArrayList<ContentProviderOperation>ops=newArrayList<ContentProviderOperation>();if(mSelectedAccount!=null){ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,mSelectedAccount.getType()).withValue(ContactsContract.RawContacts.ACCOUNT_NAME,mSelectedAccount.getName()).build());}else{ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME,null).build());}....if(mSelectedAccount!=null){//AsktheContactprovidertocreateanewcontactLog.i(TAG,"Selectedaccount:"+mSelectedAccount.getName()+"("+mSelectedAccount.getType()+")");}else{Log.i(TAG,"Noselectedaccount");}

代码修改好之后,导出 apk 文件。

运行很简单:

calabash-androidrun<apk>

如果遇到签名问题,请用:calabash-android resign apk

可以看看我运行的情况:

➜calabashcalabash-androidrunContactManager.apkFeature:LoginfeatureScenario:AsavaliduserIcanlogintomyapp#features/my_first.feature:33135KB/s(556639bytesin0.173s)3315KB/s(26234bytesin0.007s)WhenIpress"AddContact"#calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17ThenIsee"TargetAccount"#calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:5ThenIenter"hello"intoinputfieldnumber1#calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5ThenIenter"13817861875"intoinputfieldnumber2#calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5ThenIenter"hengwen@hotmail.com"intoinputfieldnumber3#calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5WhenIpress"Save"#calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17ThenIwaitfor1second#calabash-android-0.4.21/lib/calabash-android/steps/progress_steps.rb:18ThenItogglecheckboxnumber1#calabash-android-0.4.21/lib/calabash-android/steps/check_box_steps.rb:1ThenIsee"hello"#calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:51scenario(1passed)9steps(9passed)0m28.304s

All pass!

Calabash Android 简介_第4张图片

大家看到 gif 是 failed,是因为在模拟器上运行的。而上面全部通过的是我在海信手机上运行的。环境不一样,略有差异。

总结

本文是对 calabash-android 的一个简单介绍,做的是抛砖引玉的活。移动测试框架并非 Appium 一家,TesterHome 希望其他框架的话题也能热火起来。watch and learn!

本帖已被设为精华贴!


更多相关文章

  1. android开源框架源码分析:Okhttp
  2. Android 数据业务框架分析
  3. Android Jetpack架构组件Navigation管理Fragment框架
  4. android SDK 环境变量配置+ADT安装
  5. Github 上Top1的Android 异步网络请求框架
  6. Android 热修复框架: Sophix基本使用

随机推荐

  1. mysql存储过程用法实例分析
  2. MySQL数据库常用操作技巧总结
  3. mysql常用命令汇总介绍
  4. mysql5.7.18安装时mysql服务启动失败的解
  5. MySQL主从原理及配置详解
  6. 关于MySQL的存储函数(自定义函数)的定义
  7. 30个mysql千万级大数据SQL查询优化技巧详
  8. Mac MySQL重置Root密码的教程
  9. 利用phpmyadmin设置mysql的权限方法
  10. windows系统mysql5.7.18安装图文教程