Constomr-Driven Contract PatternのPactのexampleを実施して動きを観察してみました。 GitHub: https://github.com/realestate-com-au/pact 対象 zoo-app zoo-app配下で、以下のコマンドを入力します。 MockServerがService Providerの役割を担います。 Service Customerである ZooApp::AnimalServiceClient がテスト対象です。 ここのテストでは、CustomerがProviderに対して成立させたい機能のリクエストを送り、それに対してProviderが成功/失敗の応答を行うという振る舞いにたいしてexpectで結果を検証します。 Contractフェイズにおける、Customer => Providerへ使いたいサービスの契約を実施しようとするときのもののようです。 animal-service animal-service配下で以下のコマンドを入力します。 Service Providerに対するテストなので、ProviderにConsumerに対するテストデータを保存しておき、Providerに対するリクエストに対して正しく応答ができるか、をテストしています。 そのため、想定したHTTPリクエストが正しく行われているか、が主なテストの合否判定になりますね。 締め Customer-Driven Contracts Pattern自体、サービス間の関係性を確認するためのパターンです。そこに限ってテストを実施するのであれば関係性を確認するときのやりとりをテストすることに限定されそう。 Consumer-Driven Contractsを採用するのであれば、この関係性が破綻しないように正しくすることは必須要素なので、これのようなシンプルさがあったほうが良さそう。 なるほど。 以下のpactoも、振る舞いとしては同じことを確認しようとしてそうです。テストダブルとか、そこらへんの機能は必要性が増えたら見てみようと思います。 https://github.com/thoughtworks/pacto http://thoughtworks.github.io/pacto/patterns/cdc/More
Tag Archives: test
DockerでAndroidビルド・Roboletricとも戯れる
Dockerと、Androidのunit test frameworkであるRoboletricと戯れてみました。共に今更感ありますが、ご愛嬌で… Dockerfile 今回作成したDockerfilrと、imageは以下です。 GitHub: https://github.com/KazuCocoa/docker-appium Docker: https://registry.hub.docker.com/u/kazucocoa/docker_android_testpack/ Docker Hubにあげているので、以降は以下コマンドだけでbuildする必要はありません。(いつ消すかわかりませんが…) boot2dockerをMac OS Xにインストールして、環境を構築しました。Dockerfileに、GooglePlayServiceやら含めたAndroidアプリのビルドに必要になりそうなライブラリすべて入れてみました。 Dockerfile書いているとふと思うのですが、Circle CI、完全にymlがDockerfileですね。Travisにくらべても、まんまDockerだと感じました。ちょっと面白かった。 Androidのビルド環境をDockerで作ってどだったか 開発環境としては強いメリットはなさそう。 確かに、環境構築が楽でDockerfileを配布すればOKという開発環境に持っていけそうです。が、多くのAndroidアプリ開発はEclipseやAndroid StudioなどのIDEを使います。そうなると、Mac OS X やLinux、Windowsをそのまま使ったほうが楽そう。 一方、CIとしてDockerを使うとういうのはビルド環境の管理という観点では有用そうでした。ビルド完了後、必要な成果物をマウント先に保存したり、Deploygateなどに上げるとそれで終わり。TEみたいですね。 実機を接続してテスト速度を上げるときは、adbコマンドのtcp接続すればよさそう。(有線より不安定な可能性ありますが) Roboletric使ってみて Roboletric、以下の通りサンプルコードが用意されているようですね。なので、さっとサンプルコードで手を動かしてみました。 https://github.com/robolectric/robolectric-samples このサンプルで使われているRobolectric3.0-SNAPSHOTはまだ正常に動作しない模様。(2015/01/14現在)。Roboletric 2.4とAPI 19向けにアノテーションを加えたコピーを作成して実施してみました。 https://github.com/KazuCocoa/sampleRoboletricTests 正常にテストを実施しても、API 21でテストが失敗しますがRoboletricのAPI 21対応が3.0なので、一旦は気にしないことに。 締め Roboletric + GradleでTDD for Androidを実施しようというライブラリもありました。こちらも少し手をつけてみようと思います。 https://github.com/robolectric/deckard-gradleMore
KarmaのMicroserviceへの取り組みを読んでみた
KarmaのMicroserviceへの取り組みを読んでみた。 検索する限りでは、以下URLの企業のよう。 https://yourkarma.com/ Microserviceにおける、個々のサービスがコミュニケーションする方法として以下の2通りを用いているそうな。 Communicate each other with HTTP requests Communicate each other with a message queue この中で、HTTPリクエストベースで、あるサービスから別のサービスへメッセージを投げる形をはじめはとっていたけれど、これはサービスが増加してきたらより複雑になってくるからmessage queueを使うようになってきたとか。 実現のため、Amazon SNSをイベントを配信するために使い、Amazon SQSをそれらイベントを蓄積するためにつかったそうな。プロセスが成功したらjobがQueueから取り出され、進行し、削除される。もしプロセスが失敗すれば、そのプロセスはqueueに戻ってくる。 新しいマイクロサービスが追加されたら、そのサービスはメッセージのタイプを受け取るか、何のメッセージを配信するかという設定ファイルを読み込む。Fareと呼ばれる内省ツールを使っている。 The Biggest Challenge is Testing とあるように、系として如何にテストするか、が大きな挑戦だと言っていたところが面白かった。 この記事のコメントのところに、Pactの話も出ていて、Consumer-Driven Contracts Design Patternはサービスごとの依存性を緩和する手段としてベストプラクティスになりつつあるのかなという感じを受けました。More
Consumer-Driven Contracts Design Patternを読み漁ってみた
Microserviceのテストの話を調べていると、以下のような記事を見つけました。 Simplifying Micro-Service testing with Pacts このPactoと呼ばれるツールがConsumer Driven Contractsと呼ばれるデザインパターンを使っていると書いていたので、同デザインパターンを少し調べてみました。 関連: MartinFowler氏のブログ記事 Pactoに関するGitHub デザインパターンとしての説明 http://www.servicedesignpatterns.com/WebServiceEvolution/ConsumerDrivenContracts http://java.dzone.com/articles/application-pattern-consumer アプリの実装寄りの話はこの記事が参考になりそう 消費者主導契約を使ったサービス指向開発 元記事 Consumer-Driven Contracts Design Patternをざっくりいうと Consumer-Driven Contract patternは、Consumerが取得可能な必要なサービスをProviderと共有(規約)し、Customerごとに特定のサービスのみをProviderから利用可能にするパターンです。 特定のCustomerが使う機能をProviderから取得することで、Customerは限定された範囲の機能を利用します。CustomrはProviderにより提供されるであろう機能の取得を試み、契約(Contract)を成立させようとします。このとき、Customerが利用する機能の補助的な説明をProviderに提供することもできます。ここで契約が正常に成立すると、サービス実行時には基本的にCustomerは契約の成立した機能を使ってProviderからサービスを受けます。 Customerが使っている機能はProviderに適宜提供されます。ProviderはすべてのCustomerが利用している機能の規約の集合をもちます。 登場人物 Provider contracts Providorから提供されているサービスに関する規約。XMLなどで記載される。 Consumer contracts Provider Contractのうち、個々のCustomerが必要とする範囲の規約 個々の消費者が必要とするサービスの契約 Consumer-Driven Contracts(消費者主導契約) Service Providerが満たすべき全Consumer Contractsの集合を書いた規約 Summary of Contract Characteristics MarfinFowler氏の記事のなかで、Provider,Consumer,Consumer-Drivenのそれぞれがどのような関係を持つものかをまとめたもの。 Contract Open Complete Number Authority Bounded Provider Closed Complete…More
Broad Stack Testとは
Broad Stack Testに関して、Testing Strategies IN A Microservice Architectureを読んだで言及されていたので少し調べてみました。 Martin Fowler氏がこの記事にて言及しているテストタイプです。同記事では、end-to-end testや、full-stack testに似ていると書いています。 Broad Stack Testは、SelneiumやSahiのようなツールを使い、UI越しに実施されるテストだそうです。テストピラミッドにおいてもUIテストに区分されると書かれていたので、Microservicesにおいて末端のユーザが使うUI越しの操作をテストする、というテストタイプのようです。 なるほど。More
ハイパフォーマンスブラウザネットワーキングを読んでモバイルアプリ開発(クライアント/サーバ含め)に関わる人が知っているべきだと思ったこと
モバイルアプリやWebアプリをテストする上で、それらの構成要素を知ることは非常に大事です。また、モバイル通信環境ではネットワークを考慮した環境への配慮の必要性がさらに大事です。そこで、ハイパフォーマンスブラウザネットワーキングを読みました。その中で、重要と感じたところをメモがてら残しておきます。 ハイパフォーマンスブラウザネットワーキング 始めに 大学や職場では、電波や光の変調技術や伝搬遅延などの基礎、TCPのセッション確立、その上側のHTTP通信の話しまでは知っていたのですが、物理層の端末側状態遷移までは知らなかったです。また、モバイルネットワークでも、基地局や3G/LTE/WiFiなどの切り替えや特性が存在することは知っていましたが、それらが物理層でどういう状態で待機状態になっているか?など知らなかったです。この本では、そこらへんを含めたネットワーキングを全体的に知ることできたことが一番の収穫です。 というのも、モバイルアプリのテストって、PCよりも通信状態によるパケットの損失など、環境に依存する箇所が大きいとつくづく感じているのですよね。そこら辺をある程度ざっくりとテストしはするのですが、不具合解析やよりユーザの利用状況を考えたテストまで踏み込むと、厳密に通信がどのような状態か、まで考慮できた方が良いです。なので、個人的にここはすごく良かったです。 以下、いくつかモバイル通信環境に焦点を当てた上で、個人的に重要だと感じたところをピックアップ。 RRCレイテンシの存在 RRC(Radio Resource Controller)は、モバイル端末が基地局との通信を物理層で制御する機能です。モバイル通信(3G/4Gなど)では、モバイル端末が基地局との通信を物理層で確立した後、TCPの確立などに進みます。それらすべてには遅延が生じるのですが、その一番始めに存在し、モバイル通信固有の機能になります。 このRRCレイテンシは、LTE/3Gでは以下のようなレイテンシが発生するようです。 LTE: 10~100ms 3G: 最大で2秒 なので、モバイルネットワークの場合、HTTPリクエストの到達までにかかる遅延要素は以下になるのですね。 RRCネゴシエーション=>DNSルックアップ=>TCPハンドシェイク=>TLSハンドシェイク=>HTTPリクエスト この遅延を考慮した上で、端末上で動作するネイティブ/ブラウザアプリを設計・実装していく必要が現実世界ではあるのですね。モバイルアプリにおけるテストでは、OS側の責務だからと3G/LTE/WiFiと通信方式が異なる環境下でテスト(というか、動作確認)されることが少なくない気がします。一方で、こういう所はユーザビリティという視点でもアプリの快適さに大きな影響を与えるので、気に留めた方が良いです。 ハンドオーバー LTEでは、基地局から基地局のハンドオーバーに100ms以内の時間かかるそうです。一方、3Gなどでは、数秒かかることも多いそうです。日常的にこういう遅延が発生しているのですね。 ジッタ モバイルアプリケーションの通信では、ジッタと呼ばれる変動的なパケットの遅延が発生するらしいです。ここは知らなかったです。 AT&Tの各種ネットワークにおける、モバイル端末がRRCを行いDNSルックアップに到達するまでの、平均的なレイテンシは以下のようです。 LTE: 40~50ms HSPA+: 100~200ms HSPA: 150~400ms モバイル通信における、実世界で考慮されるトレードオフ バッテリー消費とネットワークパフォーマンス スループットをユーザ個別に最適化するか、ネットワーク全体に最適化するか レイテンシとジッタの考慮 コストとフィージビリティ 国や地域 他の基準 モバイルネットワークへの最適化 バッテリー消費を抑える 無線通信は、ディスプレイに次いで2番目に電力を消費するそうです。また、無線のエネルギー消費量とデータ転送量は比例する訳ではないそうです。 AT&TのApplication Resource Optimizerを使うことで、AndroidやiOSにおけるバッテリー消費量の概算を出せるそうです。やってみよう。 非効率な定期データの送受信を排除する プッシュ通信の活用、データをなるべくまとめる、重要度の低い通信は端末がアクティブになったときにのみ通信する、などを実施する。 ネットワークコミュニケーションとユーザインタラクションを切り離す 変化するネットワークインタフェース状態に対応するデザイン 無線の回線品質は、基地局との距離、混雑度、干渉などにより刻々と変化する 到達不能なホスト 突然のスループット低下やレイテンシの上昇 突然の圏外 エンドツーエンドの通信に置ける帯域幅などの予測は、モバイルネットワークの話しになると有線状態の倍以上の難しさになる バースト的に送受信し、アイドル状態に戻る モバイル端末のインタフェースはバースト的な送受信に最適化されている 多くのリクエストを集約し、できるだけ多くのデータをできるだけ早くダウンロードした上で、通信をアイドル状態にすることが望ましい バッチ処理や、プリフェッチで多くの情報を取得しておくことが大事…More
Testing Strategies in a Microservice Architectureを読んだ
2014年11月18日に公開された、Testing Strategies in a Microservice Architectureを読んでみました。Microservicesに対するテスト戦略に関する大まかな方針を書いています。想像した通りだったのですが、理解しやすく、例も記載しているので取り組む人はいったん読んでおいたほうが良さそうです。 http://martinfowler.com/articles/microservice-testing/ 目次 Some Definitions What is a microservice ? Anatomy: a loook inside a microservice Architecture: choreographing service then the Testing Strategies… Unit: mockist vs classic Integration: datastores and eternal services Component: in or our of process ? Contract: ensureing consistency across boundaries End-to-end: tips and tricks the some…More
iOS向けBDD Toolsをいくつか使ってみた
OBJC #15 TESTINGを読んでで並べられていたBDD Toolsを使ってみました。今更感あるものもありますが、そこは復習込みで、という感じで。 Swiftで書かれたものに関してはGitHubにサンプルを作りました。Objective-Cのものは確認程度。あとはXcode 6 Beta時代のTDDチュートリアルを行ってみました。Xcode6.1.1環境で私は実施したので、いろいろAPI変わってて辛かった… Objective-C時代のBDDフレームワーク Cedar Kiwi Specta Pure Swiftで開発されているフレームワーク Quick https://github.com/KazuCocoa/sampleQuickSpecs Sleipnir https://github.com/KazuCocoa/sampleSleipnirSpecs あと、ついでにBDDのチュートリアル。 https://github.com/KazuCocoa/sampleTddInSwift XCTestを使った例 サンプルを使ってみたところと、ざっと見た感じ、Quickは良さそう。Sleipnirは、最近はさっぱり開発が止まっている様子。黒魔術な気がしたSleipnirも、XCTestを使っていないという点で面白そうでした。 Onjective-Cも、知名度も合わせてKiwiを使っていたのですが、Spectaを使ったほうがよかったかもなと感じました… ただ、SpectaはQuickの開発に本腰入れている感じがするので、今からならSpectaよりもQuickのほうが良さそう。 あと、やはりモバイルアプリはコードレベルでテストを充実できるのはModel、頑張ってControlerレベルですね。Viewははやり実際に描画させないといけないので、AppiumとかCalabashとかが必要そう。More
モバイルアプリのCIサービスが増えてたのでいくつか使ってみた
iOS/AndroidのCIサービスがまた増えてきたようなので、少し触れてみました。安定性はやはり以前からあるものが良さそうですが、今年は選択肢の多様化と価格競争も進みそうですね。あとは対Enterprise向けサービスも今はTravisだけですが他の選択肢も出てきそう。 今まで触れたことのあるCI環境 Travis CI, Travis CI Enterprise Wercker CloudBees Hosted CI 新たに触ってみたもの GreenhouseCI Ship.io Circle CI 試したことは、適当なサンプルプロジェクトを、GitHubのPushなどを契機にビルドするということです。それぞれのサービスの制限(ディクス容量や、時間制限など)までは確認していません。 GreenhouseCI ビルド対象はRepository URLの直接指定で行います。Publicなものであればそのままビルドすれば良いのですが、username & passでのログインやSSHの利用が提供されているので、private repositoryも対象にすることができます。 ビルド設定すると、Cloneしてきて、Android/iOSを識別、いったんビルドを試します。その後、スキャンしたビルドオプションをプルダウン形式で選ぶことができるので、そこで次回以降実施するものを選ぶことができます。 GitHubのWebhookに所定のURLを設定したら、GitHubへのイベントをきっかけにCIを回すことができるところまでサポートされている模様。 Ship.io GitHubに接続し、リポジトリを指定してビルドを開始します。こちらはまだBeta版らしく、動作が重たいです。 重たかったので、ちゃんと試せていないです… Circle CI Android、iOS共にビルドできそうだったけれど、iOSをビルドしようとすると以下のような文言が表示されました。まだBetaなので、気長に待つことが必要そう。 Warning: Sorry! Your build didn’t run because we are still adding capacity to the iOS beta and haven’t enabled your organization yet. We know…More
2014年もあとわずかですが振り返る
ギリギリですが、2014年を振り返ります。 今年1年で一番大きかったのは、転職です。 中途、しかも社内では1人目の専門職ということで、その専門性を持つエンジニアとして成果をどれだけ出せるかがガチな問題でした。そのため、社内で成果を出すことに一番力を注いだ年だったと思います。 やったこと 仕事 転職しました。年明けて少したったらちょど1年 同僚らにまだ入社して1年満たないことに驚かれるほどには馴染んだ模様 モバイルアプリ開発関連のテストエンジニアとして成果を出せた気がする 少なくとも、組織として安定したリリースサイクルを回せるようになった 外部活動 JaSST 14 Hokkaidoで発表しました 第2回 日本Seleniumユーザーコミュニティ勉強会で登壇しました WACATE 2014 冬に参加しました 専門性 テストエンジニアとして、100%力を注ぎ込む環境に身を置くことができました 今まで読んできた書籍などが血肉になった プライベート ブログ、年間で100投稿超えました 文字としてアウトプットすることを私の中で気軽なものにするために取り組んでみましたが、思いの外続けることができました 次はブログの質に気を配りたい 技術書など含め、平均して月に2〜3冊は読めた気がする 小説、漫画などはのぞく やりたいこと 仕事 Rails(Ruby)、iOS、Androidのそれぞれのテストコード読んでレビューできるようになりたい モバイルアプリで使っているツールをほかの人も手軽に使えるように、広める段階に持っていきたい テストの考え方を社内でアプトプットしていきたい 外部活動 JaSST 15 Tokyoのパネリストとしての役割を果たしたい Appiumなどの、モバイルアプリ開発に関わるテスト関連の知識を共有するコミュニティを促進したい 自動化研究会にお声掛け頂けたので、日程あえば足を運んでみたい 専門性 書籍の量は落として、写経などのテストコードと遊びたい(質をあげたい) Android or iOS or Web Appで何かちゃんとゼロから開発してみよう サンプルコード触ってみました、操作してみました、ではなく プライベート コンサートやミュージカルなどにいきたい 旅行(海外?)行こうと言われているのでいきたい 締め 最近、忘年会などで同僚から聞かれるようになりました。 なんでサービス開発側ではなくテストエンジニアとして活動しているの? 普段の活動の中で、コード読んだり、書いたりしています。Productivity向上を専門とするエンジニアと言われるような領域の活動とも重なっている領域の活動もしています。そういうことを行うテストエンジニアとの交流が同僚の経験上少ないらしく、こういう質問を聞かれているようです。 就職時は将来のキャリアを考えたり、転職時も同じように考えていました。一方で、転職してからはキャリア以外のところでもテストエンジニアとして活動するところで良さを感じました。アプリ開発などを行ってもテストエンジニアから完全に外れることはないかなと思います。…More