「わかる! ドメイン駆動設計~もちこちゃんの大冒険~」を読んだ

そういえば読もうと思って買っていた、わかる! ドメイン駆動設計~もちこちゃんの大冒険~を読んだ。

DDD本は読んでいて、ユビキタス言語やコンテキストの境界といった考え方は馴染みのあるものでした。が、少し前からAndroid界隈でDDDの話をよく耳にすることになったので、よくまとまっていると知人から聞いたので読んでみました。

実装よりな話よりも、コンテキストの共有というような範囲でよく話がまとまっていて読みやすかったです。

メモメモ。

[Design][iOS][Android][windows]

メモ

[ReactNative][Appium]testIDの振られ方

ReactNativeだと、 testID としてiOSだとaccessibilityID、Androidだとview tagを使ってIDを埋め込むのですね。なので、ReactNativeのアプリに対してidで要素を検索したい場合はAndroidだと特に従来のAppiumやEspressoとは少し異なる。

Appiumだと、以下でview tagの取得をサポートするらしい。

これつくと、resource idが同じ要素も細かくidを振って操作することもできるようになるので、安定性向上に寄与しそうですね。

Does EarlGrey support finding react-native elements?
https://github.com/google/EarlGrey/blob/master/docs/faq.md

react native

[Android]Reactive系のテストではIdlingResourceやっぱり大事

Rx系において、Android向けの物にはRxJavaの他にAgeraがあります。
codelabsにAgeraがきていたので、簡単な学びがてらやってみました。

Rx系のテスト(Espresso使ったUI含む)までも書かれていたので、Rx系学ぶ人には良い材料になると思います。やっぱりRx系のテストコード書こうとしたら、 Espresso.registerIdlingResourcesIdlingResource の実装を使った非同期要素を待つ、ということがかけないといけないよなーということを思いました。

対象

Repositoryに対する処理

AgeraはRepositoryが1つの大事な要素だと書いていました。その中で、複雑なrepositoryを扱う場合は、以下のようになるそう。

https://codelabs.developers.google.com/codelabs/android-agera/#7

topAlbumsRepository = repositoryWithInitialValue(emptyList())
  .observe(accountManager,      // When the account changes...
           networkStatus)       // or when we get online...
  .onUpdatesPer(10000)          // but at most every 10 seconds...
  .goTo(networkExecutor)        // on the network thread...
  .getFrom(albumsFetcher)       // fetch albums from API...
  .thenTransform(                   
    functionFrom(String.class)
    .unpack(jsonUnpacker)       // unpack JSON items...
    .map(jsonToAlbum)           // for each album...
    .filter(fiveStarRating)     // filter the best...
    .thenLimit(5))              // and give us the first five of those!
  .compile();                   // Create the repository!

この中で、例えば値の変化を観測してそのないように変化があればそれをsetTextに反映する、というところは以下のようになる。

https://github.com/KazuCocoa/agera-example-android/commit/ba11829000bf820a2c34861cfb3e5c9b071a0e78

なるほど。

テストの書きやすさや保守も考えて…

このようなAgeraの特徴の他、Rx系はcallback地獄のように入れ子にコードを書けやすいが、その反面そうするとテストしにくかったり保守が困難なコードが出来上がる。そこで、Ageraの例ではそこを対応する方法を紹介している。

https://codelabs.developers.google.com/codelabs/android-agera/#9

他、処理の分散としてメインスレッド外へ処理を逃がすために、 .goTo(mExecutor) を使った処理方法も。

Espressoも使う

最後、UI含んだテストとして、 IdlingResource の実装を使った Espresso.registerIdlingResources を利用した非同期型のこのようなRx系に対するテストコードも書いています。

https://codelabs.developers.google.com/codelabs/android-agera/#11

アニメーションOFFは毎度のご愛嬌ですね 🙂

最後に

Reactive Programmingには幾つか世代があり、Ageraはまだまだ、RxJavaは2.0で世代3~4付近だと言われていました。
https://github.com/google/agera/issues/20#issuecomment-212007539

そうはいっても、Ageraを使ったこの題材は、Androidに対してReactive Programmingを入れてテスト書くまでをざっと学ぶことができるので、やることには良い意味があるものだなーと感じました。

Appium1.6.0 released !!

https://github.com/appium/appium/releases/tag/v1.6.0

  • support XCUITest(WebDriverAgent) to test against Xcode8 x above iOS9.3
    • BTW, this feature has some unstable/known issues
  • support UI Automator 2 for Android

I already tried previous its beta version in my company, and then I issued some problems to Appium and it already fixed. I’ll switch to this new version from previous 1.5 in the near future 🙂

In addition, EarlGrey 1.4.0 also released!

[Android]Chat Client for Phoenix server

I implemented a chat server and an iOS application and posted about them on [Swift][Elixir]implement chat server and client.

Today, I implemented easy an android chat application for the server.

https://github.com/KazuCocoa/WebSocketDemoForAndroid

Use Toothpick and Smoothie

I use libraries called toothpick and smoothie as DI, such as Dagger but they are simpler than it.

https://github.com/KazuCocoa/WebSocketDemoForAndroid/commit/24e9d3d8fa3abf8a8e1116b35334ff22d8d81d2e

And I add reflection free option to make everything static.

https://github.com/KazuCocoa/WebSocketDemoForAndroid/commit/fa1fadff0aeeedcb5515b55af1c5bf5ff81d6993

[Android]Try Espresso Test Recorder

AS2.2 Preview3がリリースされましたね。その中で、個人的に待っていたEspresso Test Recorderが実装されたので試してみました。

https://sites.google.com/a/android.com/tools/recent/androidstudio22preview3available

生成されたコードはこちら。

1つ、依存性で解決していないところがあるのでこのままでは動かないです。

試したリポジトリのブランチはこちらです。

初めのテンプレを楽にするためとか、ちょっとした動作を一時的に自動化したい時とかには使えるかなという印象です。assertionも設定可能。

レコード時のエミュレータ側ではない、録画側はこんな感じです。

Screen Shot 2016-06-09 at 19.40.28