Selenium/Appium Advent Calendar 2018、7日目の記事です。 Selenium/Appiumを使っている皆さんはWebDriverの W3C仕様 を見聞きしたことがあるかと思います。このW3C仕様に沿ったクライアントライブラリを使用することで、この仕様をサポートするサーバに対して同じ操作を発行、実行させることができます。そのため、必要であれば自分たちの開発言語を用い、必要な仕様だけ満足するカスタムクライアントを実装する、といったことも容易になります。 モバイルには限らないのですが、テスト自動化などの文脈でテストツールを選ぶ際、この どの言語のWebDriverクライアントを使うか はよく議題に上がると思います。実際に開発に用いている言語を使うとメンテできる人も増えるし、選べるなら選びたいところですね。 ただ、公式にメンテされている言語、されていない言語と様々ありますね。 モバイル・Appiumの文脈において Appiumを使って自動化を行う際、JavaScript/Java/Python/Ruby/.NETのクライアントがちょくちょく使われるようです。 JavaScriptはAppium自体がNodeJSを基盤として開発であることや、ReactNativeを使ったことのある人にとって馴染みやすいようです。エンタープライズ向けの利用も含めてJavaも多いですね。ちらほらとPython、Rubyも見ます。iOSだと、FastlaneなどのツールもRuby実装なのでRubyをプロジェクトに入れることに対して比較的抵抗は低いみたいです。Pythonは機械学習を絡めたりする場合は特に、とても使い勝手が良いみたいです。.NET を使ってる人は、Xamarinとかなのかな、と推測します。 JavaとSwift Androidの主な開発言語は(Android)JavaとKotlinです。Appium projectがJavaクライアントをメンテしていることもあり、Androidに対してJavaクライアントを選ぶことは普通な選択肢の1つのようです。Javaは周辺のテストツールの既存資産も多いので、テスト集計やSeleniumを使ったWeb側との連携もある程度既存の道を走ることができる点も良いですね。 iOSはSwiftですが、これ向けの主なメンテされているライブラリはありません。一応 selenium-swift はありますが、これは4年間継続してメンテされてはいないようです。元のObjective-C版のSwiftラッパーという位置付けです。このライブラリコードをのぞいてみましたが、大体は class で定義(状態をそもそも持たないのでstructで書いたりできる箇所も含めて)していたりと、書き方など含めてよくできるかなーという感じのものでした。 そのため、W3C仕様の把握も含めて実験的にSwiftをベースにクライアントを書いてみました。まだ構造として変えたいところもあるので、本当に実験的なものです。その時の、どういう感じでWebDriverクライアントを作ることができるか、という感覚を今回は共有しようと思います。 以下は AppiumSwiftClient#8182d8f4時点のものをベースに話をしています。セッションを確立し、その要素に対してタップするなどの操作を実現するためのコードは以下な感じです。(AppiumFuncTests) WebDriverにおけるクライアント/サーバ間のやり取りはJSON形式です。そのため、SwiftではCodableを中心に使っています。これは色々と説明しているWebサイトも多いので、Codableを使ってJSONのマッピングに関しては特に言及しません。エラー処理も良くしては行きたいですね。 実装 以下ではSwiftのコードを書いていきます。どんな感じでクライアントライブラリを書いていったのかを載せていこうと思います。 外部ライブラリに対しては特別な依存関係は持たせていません。テストコードで利用しているものはありますが、ライブラリの中ではありません。似た簡単な処理が続くので、簡易的な処理だけであれば多分使う必要は無いかな、という感覚ではいます。 https://github.com/KazuCocoa/AppiumSwiftClient Create Session まずは入り口 Spec https://www.w3.org/TR/webdriver1/#new-session command HTTP method POST URI /session Request body クライアントがサーバに対して送るJSONは以下なフォーマットです。実際はalwaysMatchesもあるのですが、それは空でも問題は無い(現状のSeleniumクライアントライブラリのいくつかはそもそも送ってない)のでここでも省略します。 Response body それに対して、例えば以下のような結果が得られます。 この応答はW3Cのスペックに沿ったものです。 Implementation code:CreateSession.swift エラー処理は除いています。ここで session id を得られたら、通常はサーバとのセッションが確立しています。いったんの目的は達成。…More
Category Archives: development
[Python]import syntax
Recently, I’ve committed Python project repositories. Then, I faced an issue which happened by import syntax. Below article helped me to understand the import further in Python 2 and 3. https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html When a module is imported, Python runs all of the code in the module file. When a package is imported, Python runs all of the…More
[JavaScript] Learned “You Don’t Know JS”
I read all of https://github.com/getify/You-Dont-Know-JS to learn JS fundamental knowledge. Appium is NodeJS powered project. I’m working as a member of the project. I recently maintain Ruby, Python, Appium servers(including any drivers) mainly. Sometimes I step into .NET or another world. To increase my commitment to the project, I must learn JS further since I’m…More
[Android]Androidテスト全書は是非手にとって読んでほしい1冊
Androidテスト全書が発売されましたね! とてもめでたい。 私はアーリーアクセスの段階で野次馬のようにいくつかコメントさせていただいたりしました。また、推薦コメントとしてトップにも記載していただいて、大変ありがとうございます。 個人的には、このような書籍が私の学び始めの頃にあればとても知の高速道路を走れたのでは感が満載のものだと感じます。”テスト”という一言で丸っと全体を包むのではなく、いくつかレイヤーも分けつつ分解しているのもとても良いですよね。様々なレイヤーで目的に合わせながらテストの実行環境が整っていく(であろう)これからの市場ですが、それらを利用するにあたり基礎となるものだと感じています。 なおここでいう”テスト”は、一律、開発者テストやテストエンジニアによりテストコードを書いていくという範囲での話に焦点を当てます。 2, 3章 多くは実装やアーキテクチャに依存することも多い話ですね。この書籍では、巷でみる(最近)よく使われるライブラリを使ったテストの書き方のほか、テストタブルの考え方まで踏み込んだ箇所があります。そのため、単なるツールの使い方ではなく、その必要性や用途などまで学ぶことができるのではないでしょうか。それらはAndroidというものに限らないところも多いので、iOSやそのほかのWeb系の話に流れたとしても、転用のきく知識となるかと思います。 ここはコードも多く出るので、読みながら写経しながら進めることが一番良いと感じています。 4, 5, 6章 UIテストのEspresso, Appiumを使った話。 これら、結構比較構造で紹介される場面も見ますね。同じ”UIテスト”という言葉として。ただ、多少はカバーする分野がかぶってますが、私は全く対立するものではないと思っています。(Appium自体、Espresso/uiautomator2を経由して色々とした操作を実現していますし。) そこらへんも説明されたり、具体的な実装の話まで踏み込まれています。 最近だと AppiumのAIによる要素セレクタを試してみたら、自動テストの未来を感じた でも取り上げられましたが、Appiumをモバイルアプリ操作のフレームワークとしてツール群の間に挟むことで、それよりも上のレイヤで様々な取り組みを実施できるなどもあります。これもEspressoだけを中心とした形式で、test.ai のような企業が独立して取り組むには難しい面もありますね。 Espressoの方がとても良い場面も多くあります。そのため、私は Test automation design for Cookpad’s global Android app というブログを、クックパッドの海外事業部のページに投稿しました。そこでは、EspressoもAppiumも(後者は将来的に、ですが)使う流れを載せています。 適材適所で使おう、という話ですね。個人的な日本・世界での活動をベースにすると、両方を行き来できる人は非常に限られていて、そういう人がいる組織は方針の選択など含めてとても強いのだと感じました。私が見た世界の中では、純粋なAndroid開発者だけしかいない(開発者人数も限られている)ところは大体はEspressoですが、Test/QAエンジニアをもつところは大体はAppiumを利用しているようです。その両方を行き来できる人は選択しているぽいです。ただ、Agodaのように色々と判断を倒しているようなところもいくつかあるようですね。 いずれも、Espressoを使うところは単機能(or 1つのView)における実装の確実さを担保していきたいというモチベーションが大きいように思えます。私たちもそんな感じでした。ユーザのシナリオや、実環境に近しいところを対象にしようとしたらAppiumの比率が高くなるという感じでしょう。HeadSpinのように、物理的にもよりユーザに近しいところのテストを世界各国で実施できる環境では、Appiumの方が多数のようです。 7章 JUnit5の話ですね!私もいくつか触ったことがありますが、まだJUnit5を少なくとも10人以上でガシガシ開発しているような組織にはほいそれと導入はできなかったですが。。(JUnit4 のRuleを使ったものもそれなりに持っているプロジェクトですし) JUnit5のいくつかのアノテーションなどは個人的にも導入して行きたいと思っていたものです。なので、JUnit5が成熟して、Androidの標準ライブラリ周辺でも特に壁なく利用できるところまでいくと良いなと思います。 Jetpackとして丸っとした開発ツールの公式化が進みましたし、その中にJUnit5が入り始めるとガッと世界は進みそうだと感じます。 8章 CI/CD環境はモバイルの場合は特に、最近も頭を抱えますね…CircleCIは鉄板だと思います。OSSでしか触れてはないのですが、最近だと性能改善もだいぶ見られるようですね。 私は、1000件程度のnon-UIテスト、40件行かないくらいのEspressoによるUIテストを実装していたプロジェクトにおいて、lint, 全テストをPush毎に、10分以内で全てを終わらせるためにx3 Speed Up Android CI at Cookpadという構成を取っていました。その結果、多くの場合は6分~7分程度で、テストなど含めて開発のフィードバックサイクルを回せるようにしていました。この書籍でいう、”コミットステージ”でEspressoによるUIテストも含めて完了させていた、という感じです。ただ、その環境はAWS上で動作するJenkin環境でした。 それとは別に、将来的には定期的にUIテストの、ユーザ受け入れレベルのものを実施したいとも思っていました。(が、そこらへんは環境の成熟など含めてまだ手軽ではないですね。。。)これにより、手動テストステージの多くは省ける + パフォーマンス系のあたいもここで取得できる状態には持っていけると思います。 先にも書きましたが、これからは用途に応じたテスト実行環境が成熟していく時期だと思うので、読者の皆様は待っておいてもらえると良さそう。(私はそういうところで少しの間、時間を使うことにしました。) 余談 いくつか私も情報の整理のためにAndroid向けの砂場repository とか、iOS向けの砂場repository…More
[iOS][tips]notifyutil to handle notification system
Apple provides notifyutil to handle a notification system. According to their man command, we can see below description there. notifyutil is a command-line utility for interacting with the notify(3) notification system and the notifyd(8) server. It may be used to post notifications, detect and report notifications, and to examine and set the state values associated…More
[Android] AndroidX for tests and Robolectric4
A couple of days ago, androidx.test libraries were published, finally. https://developer.android.com/training/testing/release-notes Then, Robolectric4 was also published. https://github.com/robolectric/robolectric/releases/tag/robolectric-4.0 The benefit of Robolectric was making android test fast with some mocking Android APIs. Meanwhile, the mocking leaded wrong test results, sometimes. I faced many times such case. According to the release note, Robolectric has also a bunch…More
[Android]adb shell dumpsys package ‘package name’
note for meMore
[iOS]try out Azure pipeline for Xcode build including XCTest/XCUITest
A week ago, Microsoft announced https://azure.microsoft.com/en-us/blog/announcing-azure-pipelines-with-unlimited-ci-cd-minutes-for-open-source/ . The pipline has Xcode build as well. Thus, I tried to do it since if the build works well, we can shoose build pipelines for iOS from TravisCI/Bitrise/Azure for OSS products. Finally, I succeeded to build and run tests include XCUITest on it. It took about 4 minutes…More
“プロフェッショナル IPv6″を読んだ
Read Professional IPv6 を読んだ。 少し読みかじってただけなのですが、主には出張中の飛行機の中で読みました。 内容は、IPv6をベースとした、原理に近い話。大学の頃だとv4の知識がメインで、その後、私はv6は聞きかじる程度でした。なので、この書籍のように全体を把握し、必要な時に詳細を見ることができる書籍はありがたいものでした。 内容としては、大学でちゃんと学ぶような感じのものから、序盤は誰でもとっつきやすいようにわかりやすい言葉を使ったりしていましたね。 パケットの中身まで正確には把握していなかったのですが、そこらへんまで詳しく書かれていたことに驚きました。ただ、パケットを解析する何かとか作らない限り、このレベルのものが100%必要になる、という類のものでもないですね。 そういえば、恥ずかしながらエニーキャストという言葉を知らなかった。ブロード/ユニ/マルチはよく聞くし、大学ででも学んでいたよくあるものなのですが。ただ、読んでるとなるほどという感じ。DNSサーバ間とか。 あと、トンネルの話とか、最後の巻末付録ではNTTさんの実際の話があったりと、良い感じでした。面白かったです。 全体を読んで、これはざっと知ったあとは、必要な時に参照する辞書/参考書に近いものになる良い本棚と思いました。More
Read “INSPIRED”
Read INSPIRED: How to Create Tech Products Customers Love. A product owner heavily talked roles based on this book. Thus, I also read this book to understand him and make easy to communicate with high context. My impression of the book is excellent to learn definitions of each role to develop products. Of course, we…More