文档章节

Calabash Android 简介

LiSteven
 LiSteven
发布于 2014/05/11 01:59
字数 1194
阅读 6201
收藏 4

什么是 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 架构图

  • 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 环境

Android 开发环境

  • JAVA

  • Android SDK

  • Ant

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

安装 Calabash-android

gem install calabash-android
sudo gem install calabash-android # 如果权限不够用这个。

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

创建 calabash-android 的骨架

calabash-android gen

会生成如下的目录结构:

➜  calabash  tree
.
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)。

我们想实现,

  • 打开这个应用

  • 点击 Add Contact 按钮

  • 添加 Contact Name 为 hello

  • 添加 Contact Phone 为 13817861875

  • 添加 Contact Email 为 hengwen@hotmail.com

  • 保存

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

Feature: Login feature  Scenario: As a valid user I can log into my app    When I press "Add Contact"
    Then I see "Target Account"
    Then I enter "hello" into input field number 1    Then I enter "13817861875" into input field number 2    Then I enter "hengwen@hotmail.com" into input field number 3    When I press "Save"
    Then I wait for 1 second    Then I toggle checkbox number 1    Then I see "hello"

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

When I enter "hello" as "Contact Name"

step_definition

When (/^I enter "([^\"]*)" as "([^\"]*)"$/) do | text, target |
    index = case target
    when "Contact Name": 1
    ...
    end
    steps %{
        Then I enter #{text} into input field number #{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 进行判断, 修改地方如下:

   // Prepare contact creation request
        //
        // Note: We use RawContacts because this data must be associated with a particular account.
        //       The system will aggregate this with any other data for this contact and create a
        //       coresponding entry in the ContactsContract.Contacts provider for us.
        ArrayList<ContentProviderOperation> ops = new ArrayList<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) {
        // Ask the Contact provider to create a new contact
        Log.i(TAG,"Selected account: " + mSelectedAccount.getName() + " (" +
                mSelectedAccount.getType() + ")");
        } else {
            Log.i(TAG,"No selected account");        
        }

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

运行很简单:

calabash-android run <apk>

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

可以看看我运行的情况:

➜  calabash  calabash-android run ContactManager.apk
Feature: Login feature

  Scenario: As a valid user I can log into my app                # features/my_first.feature:33135 KB/s (556639 bytes in 0.173s)3315 KB/s (26234 bytes in 0.007s)
    When I press "Add Contact"                                   # calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17
    Then I see "Target Account"                                  # calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:5
    Then I enter "hello" into input field number 1               # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    Then I enter "13817861875" into input field number 2         # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    Then I enter "hengwen@hotmail.com" into input field number 3 # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    When I press "Save"                                          # calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17
    Then I wait for 1 second                                     # calabash-android-0.4.21/lib/calabash-android/steps/progress_steps.rb:18
    Then I toggle checkbox number 1                              # calabash-android-0.4.21/lib/calabash-android/steps/check_box_steps.rb:1
    Then I see "hello"                                           # calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:51 scenario (1 passed)9 steps (9 passed)0m28.304s

All pass!

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

总结

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

 本帖已被设为精华贴!


本文转载自:http://testerhome.com/topics/606

共有 人打赏支持
LiSteven

LiSteven

粉丝 38
博文 268
码字总数 11616
作品 0
深圳
程序员
移动应用测试框架—Calabash Android 简介

  什么是 Calabash?    Calabash 是一个自动化测试框架,它可以测试?android?和 iOS 原生应用和混合应用。    它有:    calabash-android    calabash-ios    主页:? http://...

糖糖豆豆
2014/12/22
0
0
中文Win7下成功安装calabash-android步骤

Calabash-android是支持android的UI自动化测试框架,网上看见很多同学说,安装calabash比较费劲,特别是Windows下安装,也没有一个详细的安装手册可供参考。正好,今天在Windows 7 上安装cal...

超爱fitnesse
2014/08/21
0
18
使用calabash测试开源中国Android客户端

Calabash-android是支持android的UI自动化测试框架,前面已经介绍过《中文Win7下成功安装calabash-android步骤》,这篇博文尝试测试一个真实应用:开源中国客户端。目的是和大家一起学习cal...

超爱fitnesse
2014/09/01
0
3
Calabash+Gearman实现多手机同步测试机制

摘要: Calabash-android是支持android的UI自动化测试框架,但不支持多手机同步测试。本文介绍如何利用任务分发系统Gearman的消息同步机制,配合Gearman实现多手机同步测试机制。 背景介绍 ...

超爱fitnesse
2015/01/09
0
0
Ubuntu 14.04 64位安装calabash-android问题汇总

初装Ubuntu 14.04 64位后,安装calabash-android步骤: 安装jdk+ant sudo apt-get update sudo apt-get install openjdk-7-jre-headless sudo apt-get install openjdk-7-jdk sudo apt-get i......

超爱fitnesse
2014/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker Compose 原理

Docker 的优势非常明显,尤其是对于开发者来说,它提供了一种全新的软件发布机制。也就是说使用 docker 镜像作为软件产品的载体,使用 docker 容器提供独立的软件运行上下文环境,使用 dock...

Java干货分享
22分钟前
0
0
解决过滤器中设置cookie无效的问题

解决过滤器中设置cookie无效的问题 代码现场 filterChain.doFilter(sessionSyncRequestWrapper, response);Cookie emailCook = WebServletUtil.getSelectedCookie(request.getCookies(), ......

黄威
32分钟前
0
0
Hbase Schema 设计注意事项及最佳实践总结

一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。这也是HBase被称为面向列族的存储(column-family-oriented store)的原因。 1、RowKe...

PeakFang-BOK
45分钟前
1
0
t-io给群组成员内置排序

1、实现比较器Comparator<ChannelContext> package xxx;import java.util.Comparator;import java.util.Objects;import java.util.Set;import java.util.TreeSet;import or......

talent-tan
48分钟前
2
0
px、em、rem 区别及作用

原文 起因: 一开始是为了解决页面放大时,字体不跟着放大的 bug。现在多用用于统一规范。 概念: 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em...

lemos
57分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部