今週は第60回を開催しました!
引き続きKotlin Hands-onをすすめています。
前回の様子はコチラ↓
[第60回の様子]
2021/4/14に第60回を開催した。今週はいつもどおり水曜日の開催。
参加メンバーは自分をいれて4名。前回からの入れ替わりが2名。
今回も自分はナビゲータ役で参加した。
勉強会本編の内容としては、ひき続きIntroduction to Coroutines and Channelsハンズオンを進めた。第7章 Showing progress
のタスクの動作確認をしたり、答えあわせをしたり。
[学んだことや疑問点]
- Introduction to Coroutines and Channels: 7. Showing progress
- 前回できなかった動作確認をするところから。
- とりあえずサイトにあるgif画像と同じような動きをしたので、実装に大きな問題はなさそう
- 模範回答のsolutionを見てみると、いくつか違いがあった
- 違い1:我々の解答は、getOrgRepos()でリポジトリ一覧を取得する際のチェーンの最後で拡張関数.bodyList()を利用していない
- これはわざわざ拡張関数を使わなくても同じなので問題ない
- 違い2:模範解答は、集計結果を格納する変数allUsersが再代入可能
- 違い3:模範解答は終了フラグの実装がAtomicIntegerではなくList.withIndex()を利用して、indexがlastIndexと一致するかどうかで判定している
- これは、メモリ効率的にも模範解答の方が良さそう
- 問題は違い2の部分……testディレクトリ以下に、実は各タスクに対するテストケースが用意されていたことに気づいたので実行してみる。と、コンパイルエラーが出た
- GitHubServiceインターフェースに、RetrofitのCallクラス非使用のメソッドを追加したので、その分の実装がMockGithubServiceに足りていないらしい。これは既に実装が用意されていたので、コメントアウトを外すだけで終了。
- Request6ProgressKtTest.ktを再実行すると、今度は以下のようなエラーが出た
Wrong intermediate result after 3585: expected:<[User(login=user-2, contributions=50), User(login=user-1, contributions=50)]> but was:<[User(login=user-1, contributions=50), User(login=user-2, contributions=50)]> Expected :[User(login=user-2, contributions=50), User(login=user-1, contributions=50)] Actual :[User(login=user-1, contributions=50), User(login=user-2, contributions=50)]
- どうやらUserのソート順が違うらしい。ここではソート順関係ないはずなんだけどな……ということで違い2の部分を模範解答に合わせると、テストが通った
- テストにはコメントアウトされている部分があった
@Test fun testProgress() = runBlocking { val startTime = System.currentTimeMillis() var index = 0 loadContributorsProgress(MockGithubService, testRequestData) { users, _ -> val expected = progressResults[index++] val time = System.currentTimeMillis() - startTime /* // TODO: uncomment this assertion Assert.assertEquals("Expected intermediate result after virtual ${expected.timeFromStart} ms:", expected.timeFromStart, time) */ Assert.assertEquals("Wrong intermediate result after $time:", expected.users, users) } }
[まとめ]
モブプログラミング・スタイルで、Introduction to Coroutines and Channelsハンズオンを進めた。
ナビゲータの何気ない一言のおかげで、テストコードの存在を思い出すことができた。テスト大事!
今週のプルリクエストはこちら。