UIAutomator2.0がリリースされていた

3月13日、以下の通りAndroidのUIAutomator 2.0がリリースされていたのですね。 https://plus.google.com/+AndroidDevelopers/posts/WCWANrPkRxg uiautomatorは、AndroidのAccessibility機能やその拡張を介して、インストールされた様々なapkを操作するフレームワークでした。そのため、例えばリリース用apkに対してシナリオテストを自動化するときなんかに使います。例えば、AppiumはAndroidに対してはこのuiautomator1.0を利用してテストを実施することをしています。 uiautomatorあらため、UI Automator 2.0の新しいところは、Instruments経由でUiElementsなどを使えるようになったことらしいです。これにより、./gradlew connectedCheck なんかのコマンドでUI Automatorによるテストを実施できるようになったとか。 まだASOPには公開されていませんが、Appiumのメンバらも公開されたら良さそうなら統合とかするでしょうし、DroidDriverとももしかすると競合するところがあるのかもしれません。 2014年12月のEspresso2.0のリリースとそれに伴うJUnit4の提供、UI Automatorの更新と、比較的テストツールの充実が図られていて良い感じですね。 Testing Support Libraryが提供する大きな機能 AndroidJUnitRunner: JUnit 4-compatible test runner for Android Espresso: UI testing framework; suitable for functional UI testing within an app UI Automator: UI testing framework; suitable for cross-app functional UI testing across system and installed apps AndroidJUnitRunner Require Android2.2(API Level8)…More

JaSST15 TokyoのBolton氏の資料が公開されたので振り返ってみた

JaSST15 Tokyoに参加、パネリストとして前に立ってきたでも書いたように、基調講演を行ったBolton氏の資料が公開されたので備忘録程度に少しまとめてみる。 JaSST 15 TokyoのBolton氏の資料が公開されていました。 資料はこちら => ★ 以前はった、Twitter Bolton氏は、Testingは学びと適合、と表現していました。また、良いテスターとは、何か見つけるとそれは問題か?このままで良いのか?という問いかけや気づきを提供できるもの、といっていました。 主な役割は以下。 Bug any problem that threatens the value of the product Issue any problem that threatens the value of the testing, or the project, or the business Coverage how much of the product you have tested based on some model Oracle something that helps you…More

今月のobjc.ioはiOS at Scaleだった

今月のobjc.ioでは、iOS at Scaleということで、iOS開発においてスケールに対する話が中心でした。 http://www.objc.io/issue-22/ モバイルアプリでサービスを提供する企業も、サービスの拡大に伴ってアプリも肥大化してきて、ある程度プロセスの整備も必要になってきたような。読んでみると、だいたいは抱えている問題は同じ感じ。その解決方法も似たようなもの。だけれど、ここに書いているように抽象化したところを除けばその組織ごとの事情によって色々最適化されているのでしょうね。 Square Registerに関する話 http://www.objc.io/issue-22/square.html The Art of Code Review: A Dropbox Story http://www.objc.io/issue-22/dropbox.html 理想と現実のギャップを埋めるために問題を解決していくエンジニアリングを繰り返して、より無理のない安定した開発を目指したいところですね。More

「アンティキテラ 古代ギリシアのコンピュータ」を読んだ

アンティキテラ 古代ギリシアのコンピュータを読みました。 私はこのアンティキテラの計算機の存在を大学時代に教授から聞いて知りました。 確か、アリストテレスの話の時に合わせて聞いた気がします。というのも、品質(Quality)に関する概念は、古代ギリシア哲学 アリストテレスにより考えられ始めたことが歴史上初、とされています。その話に合わせてこのアンティキテラの計算機の話も少し聞きました。共に古代ギリシャが共通ですしね。 のち、教授の退官時にもこの計算機の話が出てきて、頭に残っていたのでいつか読もうと積読していました。ちょっと、技術書から離れた小説を読みたくなって、ふと積読から掘り起こしたのでさっと読んでしまいました。 アンティキテラのコンピュータは、現在知られている中で最古のコンピュータです。2006年のNatureに正式に発表されたことで、その”最古”というものは確実なものになりました。そのアンティキテラのコンピュータに関する史実を、1901年にギリシャのアンティキテラの海底から引き上げられたところを契機に調査する人、歴史的な背景など含めて追っている本です。この本の原書が出版されたのが2008年くらいなので、そこからさらにこの計算機に関する調査が進んでいるかもしれませんが、2008年までの流れで止まります。 最終的にはこの歯車仕掛けのコンピュータが、いつ、何のために、誰によって作られたのかを、実際の調査結果をもとに結論付けていくという本筋なのですが、まだ解明されていない箇所もあるのですべての答えがあるわけではありません。一方、単なる史実の追いかけではなく、その結論の根拠になる数学的な説明や調査を行う上ででてくる技術に関しても大まかに触れているので、推理小説を読んでいるようにも感じます。 なお、この書籍におけるコンピュータとは、ドロン・スウェード氏の定義に従い、数字で答えが示される計測器を指しているそうです。 知識は巨大なジグソーパズルに似ている。誰かがピースを1個どこかに置くと、自分が置くべき場所もわかってくる。 デレグ・デ・ソーラ・プライス 紀元前の頃のギリシャには、後のルネサンス以降のような歯車仕掛けの機械を作る技術がすでに存在していた。争いでそれらが失われたが、それが暦としてレバノンへわたり、イスラムなどの中東で生きた。そして近代になるにつれてようやっと技術的にも復活してきた。そんな史実をみると、コンピュータに関わるものとしては純粋に面白さがありました。 アンティキテラの機械から、その次に知られる最古の歯車付き器具まで、一千年以上時代の開きがある 太陽と月の関係。太陽を入力に、天球にある月の位置を示す。コンピュータープログラム。 パーキンソンの法則、プライスの法則 放射線炭素年代測定法による調査 30個以上の歯車により作られた機械 ライト、フリースによる機械系としては忠実に再現されてきた模型 アルキメデスの影 SFや推理小説好きの人にはオススメな一冊です。あと、こういう書籍は直接技術には関係しませんが、こういう方面の人と会話する上では良い雑談のネタになるし、考えの視野が広がって面白いですね。More

「実践テスト駆動開発」の積読をようやっと読んだ

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てるを読んだ 有名どころの良書なのですが、積読で放置してしまっていたものをようやっと読みました。 事実が変わったときは、私は自分の考え方を変えます。あなたはどうしますか? ジョン・メイケード・ケインズ TDDにより設計や実装が洗練されてくる話を丁寧に書いています。また、テストコード自体の役割、良いテストコードに関する言及もあります。時刻や外部システムをモックしたり、それらの責務をどのように切り離すか、という話も書いています。 依存性を切り離すこと、テストコードに意味を持たせること、テストコードからテスト対象の関係性を想像できるようにするなど、複数人で開発する上で正しく開発するためのテストに関して言及しています。 テストコードを少なからず書く人は必読な位置付けですね。早い段階で読んだ方が良い感じです。今の段階で読んで、テストコードに意図や実装コードの説明を載せていくとか、そこまで考えることが重要だと改めて感じました。 例えば、処理の順序が大事でないなら、@Afterやexpectationには順序を与えずに独立させて複数メソッドを書き、実行させるとか。setUp()を1つですべての初期化を書くのではなく。 可読性の高いテストコード 何をテストしているのかを理解しやすいタイトル、内容 テストコードの合理化 何を確認しているか(どうやって、よりも、何を) 少ないテストケースで密度の濃いテストが実施できているか 複数のFeatureを1つのテストに含めすぎるのではなく、1つのFeatureのテストを少ないテスト数に凝縮していく、という感じ とかとか。最後のあたりでは、テストをよりよくするためにDBが絡むテストや、非同期、揺らぎのあるテストの話なんかがありました。 依存性注入(dependency injection)をぼんやりとしかわかっていないので、次はそこを学ぼうかな。 そういえば、テストの話でよく テスト自動化を促進するなら、どこから実施しますか? と聞かれることがあります。その時、テスト自動化のしやすさとか、そういう話はありますが私はずっと 境界となる箇所から始める と答えています。これは、テスト対象の境界が壊れたら、その対象に関係する全てが壊れる可能性があるからです。 昨今、Microservicesと叫ばれたり、Webhooks、Web APIを使って複数サービスを1つの大きなサービスに見立てるという風潮があります。その場合は特に、その境界となる動作が壊れるとすぐさまシステムは壊れることは想像しやすいと思います。そのため、私は境界となるところのテスト自動化から手をつける、と伝えてます。 その考えがこの本でも早い段階で書かれていて、とても共感できました。 ちなみに、GUIを持つアプリだと、人との境目でまずは用意する方がよいかなという立場です。過度な量は無いことは前提です。10分かからないくらい範囲でとか。そのあと、高速なUnit test、Integration test、としていく、という感じでしょうか。SOAやMicroservices的な組織構造を持つチームであれば、Integration testの持つ責任が大きくなるでしょうので、そこは大変だけれど誰かが増やさないといけないですね。Androidだとespressoとかがその位置付けになれると感じています。 iOSはどうだろうか。More

iOSのplistを黒魔術で操作しているところで文字化けしてた(Appiumの使っているライブラリの話)

現在のAppium(Appium1.3.6)は、Non-ASCII文字列をタイトルに持つアプリケーションは文字化けして表示されます。通常、iOSアプリはplist内のデータを読み込んで、そのメタ情報をアプリ名などとしてシミュレータ/実機上で表示します。なのですが、Non-ASCIIをファイル名に持つアプリで、Appiumを使ってインストールしたアプリではアプリ名が文字化けするという現象にでくわしていました。 原因を把握するためにAppiumのコードを読んでみましょう。 iOSアプリ起動の下準備 Appiumのコードを追っていると、以下でiOSデバイスに対する下準備を行っていると分かります。 appium/lib/devices/ios/ios.js この中で、以下箇所で何やらplistを生成している模様。plistはbinaryとxmlがあるのですが、今回問題になっている文字化けはbinaryのplist。なので、bplistCreated(obj)が怪しそう。 このpblistCreatedはどのライブラリで処理されているのか?というと、以下の模様。 bplistCreator.js from: https://github.com/joeferner/node-bplist-creator/ この中で、Stringを書き込んでいる箇所が。 ここを覗いて、writeIntHeaderに渡している0x6と0x5が何かにおいます。 http://opensource.apple.com/source/CF/CF-855.17/ForFoundationOnly.h によると、 らしい。なるほど。UTF-16として処理されなければいけない所を、ASCIIとして処理するようにしてしまっていたので、再現していたのですね。 この問題に対する修正は過去に既にマージさえていていたのだけれど、nodeに公開されていなかった模様。同僚が公開してくれると嬉しいな〜ってコメントしたら、昨日のうちに0.0.5を公開された。めでたい。 無事、0.0.5が公開されたので、このPRがマージされれば次回公開版からは修正されるでしょう。 https://github.com/appium/appium/pull/4714 binaryファイルを葬る黒魔術に出会ったわけでした。 蛇足 以下を見てみると、find_element(:accessibility_id ‘なにか’)とかで渡す要素が、何を受けつけられるのか見えますね。 今はxpath、id、name、class nameの他、ネイティブアプリに対してはuiautomationやuiautomator、accessibilityを、Webアプリに対してはlink text、css selector、tag name、partial link textが与えることができる模様。 appium/lib/devices/common.js なるほど。More

Appiumを使った文字入力とcontext switch

Appiumに関して、以下の2点に関してメモがてら。 文字入力 WebView(Hybrid view) 以下、Appium1.3.4の時の話です。 文字入力 iOSでは、Appium(というか、Selenium)が提供するキー入力にsendKeysが存在します。また、UIAutomationでは、setValueが提供されています。 iOSでは、マルチバイト文字入力含め、setValueによる文字入力のほうが安定しています。ですが、全てのテキストフィールドにそれを使うことができるわけではありません。SecureTextFieldに関しては、sendKeysを使わなければ正常に文字入力ができませんでした。 そのため、安定したテストを書くためには、TextFieldにはsetValueを、SecureTextFieldのみはsendKeysを使いましょう。 Rubyのライブラリの話をすると、appium_libのこの行を参考にすると、以下の通り type で定義されているメソッドに内包されています。 また、同様にソースを見ると、このメソッドはAndroidではsend_keysとして扱われています。 そのため、以下のようなルールを設けて実施すると良いでしょう。 SecureTextFieldを対象にしている場合はsend_key ↑以外の場合はsetValue こんな感じで内包することになるでしょうか。 WebView Hybridアプリの場合、contextを変更することでネイティブ、WebViewのそれぞれを操作対象として変更することができます。 なのですが、iOSアプリの一部WebViewで操作する必要のある画面をiOS Simulatorで実行していた時の話です。contextでWebViewに設定しても期待通りに動作しませんでした。むしろ、正常に要素すら取得できていなかったです。逆に、Nativeで実施すると正しく動作した。 AndroidやiOS real deviceの話までは詳しく追ってはないのですが、context switchはいらないのか…??More

システムテスト自動化 標準ガイドを読んだ

この土日は積読の消化をしようと、システムテスト自動化 標準ガイドともう1冊読みました。ここではシステムテスト自動化の本を残します。 このTweetの通り、内容は システムテスト に限りませんでした。個人的には システム は入れなくても良かったのでは・・・と思いました。 実際に自動化に取り組んでいたり、代表的なテストの書籍を読んでいるとそうだよな、という感じで納得できる内容が丁寧にまとまっている感じでしょうか。特に、キャプチャ&リプレイの話だったり、保守しやすい形、自動比較の話なんか。 今、第4章の自動比較、検証が個人的に今悩んでいます。特に、モバイルアプリではViewに対する評価を、単なる表示される要素の確認以上しようとすると画像比較以外できません。その画像比較は最終的には人の目に頼らざるおえないので、時折漏れが発生します。そのため、人目で見ることを前提に、気づきを得られるような施策を打つことはしますがそれ以上どこまでできるか考えます。 これ読んでて思ったのですが、なんだかんだで私はデータ駆動、キーワード駆動のテストまで実装していたのですね。More

Stethoを使ってAndroidアプリのデバッグを容易にする

Android、iOSのようなクライアントアプリの開発では、特にDB関連や通信環境が絡むデバッグが面倒です。実際にデバッグを行うとき、例えば、Proxyサーバを立てて通信を覗いたり、SQLiteのファイルを直接覗いたりしますね。はたまた、Logの出力を仕込んで、そのログを追うという方法をとることが多いです。 また、単純な通信量であればAndroid Device Monitorなどが使えますが、通信の中身までは見れません。 それらの壁を低くするツールとして、SquareのGitHubから得られるPony Debuggerが有名です。これは、Chrome Developer Tools を使い、通信の内容を簡単に観察したりできるツールです。また、Android/iOSのChromeブラウザであれば、同様にChrome Developer Tools を使い端末上で動作するブラウザの情報を得ることができます。 そして最近、Facebookが出したAndroid向けのStethoを見つけました。リポジトリを見てみると、最初のコミットが2015年1月30日と非常に若いです。これを組み込んだapkではChrome Developer Tools を介し、SQLiteやNetworkの中身を観察することができます。特別なProxyを用意したり、SQLiteのファイルを直接操作する必要もありません。 まだ若いので、使い方とか諸々変わりそうなのでリンクだけ貼っておきます。 http://facebook.github.io/stetho/ https://github.com/facebook/stetho 基本的には、Applicationを継承したクラスをonCreateするときに、合わせて初期化メソッドを追加するだけ。 ネットワークをChromeで見るには少し手間かけますが、Squareのokhttpを通信向けパッケージとして使っている場合、OkHttpClientを初期化するときにデバッグ設定を追加するだけという手軽さ。 これらの機能を、例えばBuildConfig.DEBUGのときだけ有効にするとかしておけば、社内で配布するapkは誰もがChromeさえあれば通信内容を確認するという環境が作れてすごく良さそう。 なお、logcatに以下のようなsocketに接続できたという出力が得られたらネットワークの通信もChrome上で見ることができる状態になります。 Chromeを経由してネットワークの中身を見るとこんな感じ。More

Appium1.3.6released

https://github.com/appium/appium/releases/tag/v1.3.6 AndroidのXPath、ChromeDriver向けの修正のようですね。 確かに、私の実施するXPath指定のテストも正常に動作しなくなってましたので、これで直るかも。 ただ、XPathではなく、UiSelectorを使う形に修正したのであまり関係しなさそう? …. ちょっと確認してみた感じでは、修正されたわけではなさそう。。。More