Calabash for iOS 自动化测试基础篇
简介
Calabash 是一个自动化测试框架,它可以测试iOS
和 Android
,以及Hybrid App
,同时支持模拟器和真机测试。Calabash
支持Cucumber
。(Cucumber
是一个能够理解用普通语言描述的测试用例,支持BDD
(行为驱动开发)的自动化测试工具,用Ruby
编写,支持Java
和 .Net
等多种开发语言。)
它分为:
apple Calabash iOS android_robot Calabash Android为什么用它?
作为一个团队,我们都喜欢快速的发展,人工测试不能适应我们的快速开发和发布节奏
我们相信,在防止Bugs肯定好于而找到Bugs
减少些碎片化测试
Calasbash
与Appium
做个简单的对比
测试框架 | iOS | Android | Hybrid | 开源 | API | 环境搭建 |
---|---|---|---|---|---|---|
Calabash | Yes | Yes | Yes | Yes | 丰富 | 简单 |
Appium | Yes | Yes | Yes | Yes | 较少 | 太复杂 |
其它优势:
-
Calabash
是BDD
驱动开发 -
Calabash
是测试脚本与TC分离设计,在业务变化的情况下,只要功能存在基本只需要修改TC,在业务不变,功能变化的情况下,基本只需要修改脚本 -
Calabash
免费是支持扩展的,而且非常容易扩 -
Calabash
开源免费,由Xamarin公司支持 -
Calabash
运行速度快,真机
缺点:
-
测试案例无法断点调试
-
需要配置工程
Calabash-iOS 架构图
Calabash-iOS
是由Ruby
编写一个客户端库和用Objective -C
编写的一个服务框架calabash.framework
。Calabash-iOS
测试是由三部分组成:您的App,calabash.framework
,Calabash
客户端库和Step definitions
以及feature
文件。该架构如下图:
Calabash-iOS 环境搭建 For Mac
首先介绍一些基础知识 ,如果以前没有接触过Ruby
的人话看到下面这些东西有点晕
Ruby
这个就不用多说了
RVM
用于帮你安装Ruby
环境,帮你管理多个Ruby
环境,帮你管理你开发的每个Ruby
应用使用机器上哪个Ruby
环境。Ruby
环境不仅仅是Ruby
本身,还包括依赖的第三方Ruby
插件,都由RVM
管理。
RubyGems
RubyGems
是一个方便而强大的Ruby程序包管理器(package manager
),类似RedHat
的RPM
.它将一个Ruby
应用程序打包到一个gem
里,作为一个安装单元。无需安装,最新的Ruby
版本已经包含RubyGems
了。
Gem
Gem
是封装起来的Ruby
应用程序或代码库。
__ 注:在终端使用的gem
命令,是指通过RubyGems
管理Gem
包。__
Gemfile
定义你的应用依赖哪些第三方包,Bundle
根据该配置。去寻找这些包。在具体的项目中还可以看到Gemfile.lock
这个对应用Pod
管理二三方库的同学来说非常熟悉了.
Bundle
相当于多个RubyGems批处理运行。在配置文件gemfilel里说明你的应用依赖哪些第三方包,他自动帮你下载安装多个包,并且会下载这些包依赖的包。 和Pod 一样 有 Bundle install
, Bundle update
Bundler maintains a consistent environment for ruby applications. It tracks an application’s code and the rubygems it needs to run, so that an application will always have the exact gems (and versions) that it needs to run.
了解上面的知识之后我们就正式开始安装环境。
1.安装HomeBrew
__ Homebrew
使 OS X 更完美,使用 gem 来安装 gems、用 brew 来搞定那些依赖包。__
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)”
闲的X疼,下面看一个好玩的东西:
brew install fortune
gem install cowsay
gem install lolcat
fortune
: 随机输出一句话
cowsay
: 随机生成一个图像
lolcat
: 随机彩色输出
附图片:
brew_instasing2.安装RVM
\curl -sSL https://get.rvm.io | bash -s stable
PS: RVM 是个好东西,做的很智能,(大部分)操作失败后会告诉你原因,然后告诉你需要安装哪些Lib等等,非常适合新手老手使用,简直是业界良心。
3.安装ruby
rvm install 2.3.0
这个过程有点久,最终结果:
...
...
...
...
ruby-2.3.0 - #importing gemsetfile /Users/justinjing/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.3.0 - #generating default wrappers........
ruby-2.3.0 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-2.3.0 - #complete
Ruby was built without documentation, to build it run: rvm docs generate-ri
4.安装calabash
gem install calabash-cucumber
需要 sudo
, 这个过程有点久,最终结果:
...
...
...
...
Parsing documentation for calabash-cucumber-0.19.1
Installing ri documentation for calabash-cucumber-0.19.1
Done installing documentation for gherkin, cucumber-core, builder, diff-lcs, multi_json, multi_test, cucumber-wire, cucumber, edn, slowhandcuke, geocoder, httpclient, bundler, clipboard, awesome_print, CFPropertyList, thor, command_runner_ng, run_loop, calabash-cucumber after 18 seconds
WARNING: Unable to pull data from 'http://ruby.taobao.org/': bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
20 gems installed
5.配置iOS工程
分为三种:
第一种:命令行配置
gem install bundler
# 安装需要的gems
$ bundle update
# 确定可以build app
$ make app
#下载最新的calabash.framework
$ bundle exec calabash-ios download
打开 Xcode ,设置 Debug 模式下的 Other Linker Flags
-ObjC -force_load "$(SOURCE_ROOT)/calabash.framework/calabash" -framework CFNetwork
然后运行iOS Simulator 在控制台可以看到
DEBUG CalabashServer:222 | Creating the server: <LPHTTPServer: 0x7fe97a507ef0>
DEBUG CalabashServer:223 | Calabash iOS server version: CALABASH VERSION: 0.16.4
第二种:手动配置工程
这种方法不建议使用,任何一步操作遗漏都可能有问题。
| 配置项 | 描述 |
| ------------ | ------------- | ------------ |
| Debug Config | 用Debug模式加载calabash.framework |
| Calabash Config |创建一个新的Calabash Build Configuration |
|-cal Target| 添加一个新的Target到工程 |
第三种:最简单的方法,在工程根目录下运行:
gem install bundler
calabash-ios setup
然后
calabash-ios gen
然后在工程目录下就可以看到文件夹结构如下图:
folder现在你可以打开你的工程选择XXXX-cal 的target运行,不出意外的话在控制台可以看到下面的log:
app_lunch注:选择测试Target控制台输入”Started LPHTTP server on port 37265”说明安装成功。
到此,恭喜你前期准备工作基本都做完了。
路漫漫其修远兮
编写测试用例
首先看看目录结构,先简单看看,下一章节细讲
features
|_support
| |_app_installation_hooks.rb
| |_app_life_cycle_hooks.rb
| |_env.rb
|_step_definitions
| |_calabash_steps.rb
| |_sample_steps.rb
|_sample.feature
feature
为主件夹
step_definitions
内是你封装的脚本
sample_steps.rb
写我们的具体操作步骤
sample.feature
文件就是你的TC逻辑
再看一下其中的内容:
sample.feature
下面是亮点
下面是亮点
下面是亮点
# encoding: UTF-8
# language: zh-CN
功能: 设置
作为一名盒马的用户
我希望可以对一些功能进行设置
背景:
假如我已经登录盒马进入设置界面
场景: 兑换优惠券
打开盒马应用
假如我有未兑换的优惠券
那么我可以兑换我的优惠券
牛逼啊,居然是汉语的feature,这样测试可以直接将TC拿过来使用了。
sample_setps.rb文件:
# encoding: UTF-8
# language: zh-CN
Given(/^我已经登录盒马进入设置界面$/) do
wait_for do
!query("*").empty?
end
end
When(/^我有未兑换的优惠券$/) do
scroll_default_view "下"
scroll_default_view "下"
sleep(STEP_PAUSE)
touch("* marked:'我的'")
touch("* marked:'兑换优惠码'")
touch("* marked:'请输入兑换码'")
end
Then(/^我可以兑换我的优惠券$/) do
wait_for_keyboard()
keyboard_enter_text("1212731273721")
touch("* marked:'兑换'")
end
写完上面之后 一个简单的TC 就完成了 ,下面我们运行这个TC :
bundle exec cucumber 或者 cucumber
报错图:
error如果遇到错误的话,别慌,看错误日志然后修改就好。
看到下面情况图:
run_over就拿盒马鲜生
app(欢迎下载)作为例子,运行看看成功的效果吧:
常见问题
Q:报错:-bash: rvm: command not found
A: source ~/.rvm/scripts/rvm
type rvm | head -n 1
Q:报错:/Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- mach (LoadError)
A:sudo chown -R $(whoami):admin /usr/local
cd /usr/local && git fetch && git reset --hard origin/master
Q: 报错:- bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
A: 原因是淘宝停止基于 HTTP 协议的镜像服务 需要改用https的协议
gem sources -a https://ruby.taobao.org/
gem sources -l(查看)
Q:提示 Make sure that `gem intsall xxxx -v 'x.x.x'` succeeds before bundling
A:按照提示继 gem intsall xxxx -v 'x.x.x' 就好了
Q: Recursively searched these directories to depth 5:
/Users/justinjing/Library/Developer/Xcode/DerivedData/FastFood-ccctcwcvschomjcwlxlfubhsrada
/Users/justinjing/Desktop/FastFood-Chinese
but could not find any .app for the simulator that links the Calabash iOS server.
Make sure you have built your app for a simulator target from Xcode.
If you are testing a stand-alone .app (you don't have an Xcode project), put
your .app in the same directory (or below) the directory you run `cucumber` from.
(RunLoop::NoSimulatorAppFoundError)
./features/support/01_launch.rb:27:in `Before'
A: 必须运行你的 -cal 的那个Target,这样才行