VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

2013年03月

iOSの究極テストツール:Calabash-iOSを使いこなすぞ!(2)

前の記事の続きですが、相変わらず、genesixのTonnyです。


Simulatorでのテスト

Simulatorの場合は必ず同じMacにあるので、次のコマンドを叩くと大丈夫:

$ calabash-ios console
Running irb...
irb(main):001:0> 

Deviceでのテスト

Deviceでテストを行うとき、**必ず** DeviceとMacを同じWiFi環境に入れてください。しかもこの環境でお互いにアクセス制限をかけていないのが前提条件です。

例えば、iPhoneのWiFi IP アドレスは192.168.0.10、次のコマンドを叩く:

$ NO_LAUNCH=1 DEVICE=iphone OS=ios5 DEVICE_ENDPOINT=http://192.168.0.10:37265 calabash-ios console 
Running irb...
irb(main):001:0> 

Record/Playback

irbのインタラクションでrecord_beginを叩くと、Eventのレコーディングが始まるよ〜〜

Record Start

irb(main):001:0> record_begin
""
irb(main):001:0> 

SimulatorもしくはDevice上動作をしてくださいね。

Record End

irb(main):003:0> record_end "login_facebook"
Fetch version http://localhost:37265/version...
"login_facebook_ios6_iphone.base64"

playback

irb(main):003:0> playback "login_facebook"

BOOOOOM! なんと、すべての動作が自動的に動いている!これはすごくない?これはすごくない?

Assertionがあれば、もっとテストケースぽいよね

実はそんなにきにしなくてもいいよ。Assertionは本当にほんの一部のStepなので、他のStepももっともっと試してみてね。


これを見たら、試してみたいよね!?やりましょうよ!

Calabash-iOSをインストール

$ gem install calabash-cucumber

gemとRubyがまだインストールしていない?

何?それじゃGoogle先生に聞いてね〜〜

〜完了〜

iOSの究極テストツール:Calabash-iOSを使いこなすぞ!(1)

こんにちは、genesixで働いているiOSのエンジニアTonnyです。

Calabash-iOSって何?

まず、このツールを聞いたことが無い方に簡単に紹介します。Googleでcalabash-iosを検索すると一番のリンクをクリックすると、Calabash-iOSのHPに飛んでいきます。

原文を使って、簡単に説明すると

Calabash is an automated testing technology for Android and iOS native and hybrid applications

重要なポイントは全部太字にしました。よく見たら、すごいと思わないですね。このようなツールは世の中にすでにいっぱいありますよ。

既存のテストライブラリ・ツール

  1. KIF ( Keep It Functional ) by Square
    • UI Test用
    • accessibility labelを利用している
  2. Kiwi by Allending
    • BDD test用
    • Cedarと似てる
  3. Cedar by Pivotal
    • BDD test用
    • よくできている、OCUnitの代替品になる
    • Deviceのサポートがない
  4. GHUnit by Gabriel
    • OCUnitの代替品
  5. GTM Unit test by Google
    • OCUnitの代替品
  6. OCUnit by Sen:te, supported by Apple
    • Unit Testの一番良いツール
  7. UIAutomation by Apple
    • 大変使い辛い
    • 勿体無いなぁ!
  8. Zucchini by Playup
  9. FoneMonkey -> MonkeyTalk by Gorilla Logic
  10. Frank by Moredip
    • Deviceでの実行はサポートしているとはいえ、なかなか使いづらい
  11. Calabash-iOS by lessPainful
    • 今日の本題 一番良い
    • BDD用
    • SimulatorとDevice両方使える
    • Record/Playbackをサポート

先に結論からいうと:Calabash-iOSが一番良いツール

なぜかというと、

  1. Cucumber式のテストコード書き方。頑張れば、 全部日本語で テストコードを書ける。
  2. Record/Playback機能は非エンジニアのテスターを開放。これは素晴らしい。
  3. SimulatorとDeviceでのテストを同時にサポート。これは実になかなか難しいことだ。他のUIテストのフレームワークはSimulatorとDeviceを同時にサポートできていない。
    • UIAutomationは本当にダメな奴だ。

他の原因もあります。この記事では説明しませんが、興味があれば、Googleしてね。

その他の原因

  • CIシステムと統合しやすい
  • テストケースの中に画面キャプチャーを取れる

Cucumber式のテストコード

CucumberはBDDの世界で非常に有名なツールです。Gherkinを使っていますが、実はあまり気にしなくてもいいです。基本的に、そのテストコードが 自然言語(英語)と似ていて、読みやすい のが特徴です。

Calabashがデフォルトに入れてくれたテストケース

$ calabash-ios gen     # generate the basic test cases

これを実行すると、次のようなコードが生成される

$ cat features/my_first.feature 
Feature: Running a test
  As an iOS developer
  I want to have a sample feature file
  So I can begin testing quickly

Scenario: Example steps
  Given I am on the Welcome Screen
  Then I swipe left
  And I wait until I don't see "Please swipe left"
  And take picture

ちなみに、GFM(github flavored Markdown)で`cucumberを書くと上記のようなSyntax Highlightができる。これは読みやすいぞ!

Cucumberの詳細はまた同じぐらい長さのBlog Postが必要なので、ここでは割愛します。

Calabashがすでにいろいろな Steps を定義してくれたので、基本的な操作とテストは全部カーバー出来ました。その詳細はCalabash-iOSのWikiページを見れば、すぐに書けます。ここで敢えて一部の抜粋を説明します。

Calabash-iOSの Predefined Steps の抜粋

  1. Screenshots
  2. Playback of touch events
  3. Assertions

Record/Playback機能は大変助かる

チームのエンジニアが忙しくて、テストをサボっている。非エンジニアの方はチームにいって、どうしても助けてあげたい!ただ、テストコードを書けず、人力テストしかできない。2週間やったら、非エンジニアの方が疲れて、テストがうまく進めていけない〜〜。

このようなシーンは多々あると思いますね。このタイミングに、ちょっと力になるのはCalabash-iOSの自動テストですね。

一言の仕組み

Calabashは実際に**Private API**を使って、Eventをレコーディングして、後にそのレコーディングしたEventを完璧に再生できる。

Sample

まず、既存のアプリの.xcodeprojが所在のフォルダで、次のコマンドを叩く:

$ calabash-ios setup
$ xcodebuild -list

終わったら、自動的にテスト専用の**target**が生成される。例えば CoreDataBooksと言うサンプルコードを使うと、CoreDataBooks-calというターゲットが追加されます。

そのTargetを選択して、SimulatorもしくはDeviceに入れて、アプリを起動すると、Xcodeのコンソールに

2013-03-22 17:48:37.022 CoreDataBooks[11445:c07] Creating the server: <LPHTTPServer: 0x7574510>
2013-03-22 17:48:37.025 CoreDataBooks[11445:c07] simroot: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk
2013-03-22 17:48:37.027 CoreDataBooks[11445:c07] Started LPHTTP server on port 37265
2013-03-22 17:48:37.735 CoreDataBooks[11445:2103] Bonjour Service Published: domain(local.) type(_http._tcp.) name(Calabash Server)

このようなログが出力されます。

次は一番重要だ

ただ、長さの制限があるので(なぜかわからないよね! Livedoorさん!)次の記事を御覧ください。
 

データクレンジング重要!~VGエンジニアブログで共起語ネットワークグラフを作る~

こんにちは、VOYAGE GROUP システム本部のゆうです。

去年の6月に配属してから統計を勉強し始めて、現在はECナビリサーチパネルに関する予測分析などをしています。

今回作成する共起語ネットワークグラフとはテキストマイニングの手法のひとつです。単語をグラフの点、単語間のつながりをグラフの辺で表し、点が大きいとその単語の出現頻度が多い(よく使われる単語)だったり、辺が短いと文書中の近いところで出現(単語間の関連が強い)しているなどが表現できます。

実務でもサービスのアンケートのようなテキストからポジティブ・ネガティブワード分析などで利用しています。これを使えばこのVGエンジニアブログ全体の特徴を表現できそうです。

まずはwget でエンジニアブログの記事をダウンロード
$ wget -l 3 -w 3 -Ahtml,htm -r http://tech.voyagegroup.com
オプションの意味は
-r 同一ドメイン
-l 指定URLからの深さ
-w 待ち時間(秒)
-A ダウンロードするフォーマット。カンマ区切りで複数指定。(Accept) ちなみに -R でダウンロードしたくないフォーマット(Reject)も指定できます。

ダウンロードしたファイルを確認すると、archievesフォルダ以下にcat_XXX.html(カテゴリ別にまとまったページ)と20XX_XX.html(年月別)、XXXX.html(1記事づつ。ちょうど全記事数分のファイルだったので記事IDなのでしょうか?)というページが取得できました。今回は記事ずつのファイルだと扱いやすいのでそれ以外は別フォルダに移動しました

記事の本文のみを抽出
ダウンロードしたいくつかのHTMLファイルを開いてみて、本文に対応する箇所は article-body-inner というタグが現れ、その後2行目に本文全てが1行で書かれていることがわかりました。grepします。
$ grep -A 3 article-body-inner *html > grep.result
-A で 該当する行の後三行目まで出力するオプションです。余計な行はviのマクロを使って削除しました。ひとまずこれで1行1記事のテキストができあがりました。

htmlタグを取り除く
ruby で動くsanitizeというライブラリがあったのでそれを利用します。コマンドラインから利用したら便利かなと思いコマンドライン引数を受け取るように書いてみました。
# sanitize_text.rb
require "rubygems"

require "sanitize"
puts Sanitize.clean(open("#{ARGV[0]}","r").read)
------------------------- 
# コマンドライン上
$ ruby sanitize_text.rb grep.result >output.txt
KHcoderで共起ネットワーク図を作成 
テキストを渡すと文字コード変換や形態素解析などの前処理に加えて、クラスタリングや対応分析をしてくれる便利なフリーツール。プログラミング不要です。

さきほどrubyでサニタイズしましたが前処理の結果を見ると、htmlやcssの属性に該当する単語が含まれていたのでこれらを分析で抽出する単語から除外します(※1)。 
頻度の高いものを調べ除外したい単語があれば記述しておきます。
KHCoderでは除外したい単語を改行区切りで登録できる。

KHCoderの画面です。グラフに出す必要の無い単語を無視するように設定します。

結果
 

エンジニアブログの共起語ネットワークグラフ

プログラミング言語ではRuby、Perlという単語を含む記事が多そうです。
共起している単語からなんとなく記事の内容が予想できそうです。(※2)

やってみて
※1 でPerlという単語で記事検索してみると、弊社一番の人気記事への紹介リンクや「 Perlで書いてるけど今回は…」という記事があったのでPerlに関する投稿では無いものもありました。ブログ記事にはRに関する記事も多くあるのですが、もしかしたら形態素解析したときにRは単語として認識されてなかったのかもしれないです。
(KHCoderで除外するのと同様に強制的に単語として抽出する設定もできます。)

さらに※2 でhtmlやcssと関係する単語を除外しましたが、もしHTML5/CSS3に関する記事あってもこのグラフに現れないです。データの準備段階から改善する必要がありそうです。

今回、グラフの出力以前の準備の作業(前処理とかクレンジングとか言ったりします)がほとんどの作業を占めてました。実は上のグラフも一発で出したものではなく、何度かデータを整形しなおしています。

僕自身の実際の業務でも分析以前にデータをかき集めたり、有効なデータがそもそもあるのかどうか、分析できるだけの効果があるものなのか調査することが、作業全体のほとんどを占めていたりします。ARPUやLTVなどの指標を計算するまでいくつもステップがあったりで計算ミスなどあったりしたら影響範囲がとても広いです。そのため結果が出るまでもどかしかったり、不安なときもあります。精神的にツライときも。。しかし何よりもうまくいったときの達成感は大きいです。


これから

定期的に記事を投稿したいです。そのためにも常に学んで文章をおこす癖を身につけていきます。
そしてもちろん面白い記事書きたいですね。

参考にした記事 
wget http://ja.wikipedia.org/wiki/GNU_Wget
今回のオプション以外にも使えるものがありそうです。詳しくはコンソールで man wgetと叩いてみましょう。

ruby sanitize https://github.com/rgrove/sanitize
ruby on railsなどで使われているライブラリだそうです。gem で管理できるので今回使う時に便利でした。一緒にnokogiriだったりlibxml2などが必要なので詳しいインストール方法はnokogiriのインストール手順を見ると良いと思います。

KHCode
http://khc.sourceforge.net/index.html
今回の共起ネットワークグラフの他にクラスタリングや対応分析などのテキストマイニングができるフリーソフトウェア です。ソフトのインストール後に詳細なマニュアルが付属していたり、グラフの出力結果をRのコードとして出力できるのでさらに細かい分析もできそうです。

テキストマイニングの基礎 http://homepage2.nifty.com/nandemoarchive/toukei_hosoku/TextAnalysis.htm 
今回のグラフ作成に関連する共起語分析やテキストマイニングについて参考にさせていただきました。統計の知識全般についてはこのページのトップである「統計学の補足」もわかりやすいまとめになっています。


 

新卒が "走って" 気付いた、エンジニアにとって大切だと思う3つのこと 「キッカケ」「小さな目標」「仮説と検証」

こんにちは。VOYAGEGROUPにて新卒エンジニアをしているつちといいます。
日々、好きなプログラミングと戯れ、わからないことに悪戦苦闘しつつも
仕事を楽しくやらせていただいております。

最近ハマっていることは「ランニング」です。
「そこはエンジニアっぽい内容言うべきでしょ!」との声もちらほら聞こえてきそうですが、
素晴らしいですよ!ランニング!(ゴリ押し)

VOYAGEGROUPにはサークル活動というものがありまして、
バスケ、テニス、ゲーム、アロマ、ボルダリング、登山、などなどなど!
条件さえ満たせば自由にサークルを立ちあげて活動できます。
この活動は、事業部間の社内の方との良い交流の場となっています。
もちろんランニングサークルもあり、現在私も所属しています。

そして、ついこの間、やっとフルマラソンを走り切ることができました!
よく「人生はマラソン」と例えられますが、とても学ぶ事が多いです。
そして、これらの学んだことは、エンジニアにも通ずるんじゃないか?と思いました。
ですので、この場をお借りして、学んだことを書かせていただきます。


■ キッカケが大事

ランニングと言えば、「なかなか時間がない」「モチベーションが続かない」
といった経験をお持ちの方もいらっしゃるのではないでしょうか。
ですが、社内の方との「ダイエット勝負」がキッカケで私は習慣化できました。

社会人になると、「なかなか勉強する時間が取れない」ということがあると思います。
一人で勉強することが続かないという方も多いはずです。
それに対し、VOYAGE GROUPでは「勉強会」というものが頻繁に開催されています。
様々な規模、様々な内容、様々な人によって日々開催されています。
みんな集まっての勉強会。議論が白熱するときもしばしば。
このような勉強会に参加してみて、新しい分野を学び始めてみるのも良いのではないでしょうか。

【VOYAGE GROUP - 勉強会】


■ 限界を知った上での「小さな目標」を設定する

ランニングを続けるコツは「少し先の目標」を設定し、クリアし続けることです。
我らがCTOも言っています。「小さな成功体験を積み重ねることが大切」と。
そして、目標を設定するには、自分の限界を知らなければなりません。

エンジニアでも、今の自分のスキルはどの程度なのかを見極めることは大切です。
そこがわかっていなければ、どこから勉強して良いかわかりませんよね。
そして、目標もまずは小さな事から。「Hello World!!」と表示する、最初はこれでOK。
自分の思い通りにプログラムが動いたときのあの快感を忘れないでください。
できるだけ細かく刻んで、その快感を堪能しつつ進んでいきましょう。楽しい!ヽ(´∀`)ノ


■ 仮説と検証を繰り返す

ランニングを続けることでだんだんわかってくることがあります。
毎回自分は25kmでエネルギーが切れる → 20kmあたりでエネルギー補給? →
それでも25kmでガス欠 → もうちょっと早くか。ふ〜ん、なるほど。
というように、仮説と検証を繰り返すことで、ベストなエネルギー補給のタイミングがわかってきます。

エンジニアリングも仮説と検証の繰り返しです。
仮説→実装→検証を繰り返し、プロダクトの質を高めていかなければなりません。
仮説が無いと「次にどうするか」が生まれてこないんですね。
それがあれば「今回は◯◯だから、次は△△」というように、次の行動に繋がってきます。
現状維持は鈍化と同じ。日々の成長は仮説と検証を続けるからこそなのです。



このように、ランニングとエンジニアリングは共通点が多いと思いますし、
考えてみると大切なことばかりだと思います。
まだまだ活かしきれていないのが現状ですが。。。
でも、それを「知識」として知ったのではなく、「経験」として気付けたのはとても大きいでしょう。

「知ってるだけじゃダメ!経験マジ大切!」

これ、大事だと思います。ちょっと「ズキッ」ときた人もいるのではないでしょうか。
この精神は将来も忘れちゃいけないなと、そう思います。

あとは、

「分野を越えて、達成経験を次の武器にする」 

これも大切ではないかと思います。
何かうまくいかないことがあったとき、自分の成功体験と結びつけるのは結構良い手段だと思います。
違う言語で応用が効く場面は多々あるはずですから

ということで、明日からも、平日は手、休日は脚、を動かしまくって、
VGのエンジニアは走れる!」 という(変な)ブランディングを目指して頑張ろうと思います。
記事検索
QRコード
QRコード