Monoxer Intern Report #8_APIとテスト追加

自己紹介

こんにちは、モノグサ株式会社のソフトウェアエンジニアインターンに参加させていただきました、大本義貴です。今回は2022年に参加したサマーインターンについて書いていきたいと思います。

参加を決めた理由

私は関数型言語で遊ぶのが趣味なのですが、その経緯でScalaという言語に出会いました。Scalaはオブジェクト指向言語と関数型言語の側面を合わせ持つ挑戦的な言語です。そんな言語で大規模開発をしたらどうなるのだろうと疑問に思っていたところ、後輩の行ったインターン先がScalaを採用した場所だったと聞き参加を決めました。

取り組んだこと

今回、インターンではMonoxerのサーバサイドの開発に取り組ませていただきました。主に行ったタスクは、外部連携APIの追加とテストの追加です。

Monoxerの外部連携APIの追加

Monoxerは多くの方や組織に利用されています。利用者の中には、その組織のシステムとMonoxerを連携させている場合があります。そのような方のためにMonoxerでは外部連携APIを提供しています。ただ、現状だとブラウザから操作する時に比べて機能が豊富ではありません。今回のインターンでは外部連携APIを追加して便利に使えるようにしました。

Monoxerでは、複数人の学習者の集まりに対して同じ内容のコンテンツを一斉送信ができます。そのような学習者の集まりの単位にクラスというものが存在します。また、クラスの集まりの単位にはスクールがあります。スクールとクラスは以下のような階層構造を持つので、この構造をそのままJSONで記述してAPIで作成や取得ができると便利です。インターンでは、それらのAPI開発を行いました。

外部連携APIのテストの追加

長期に及ぶ開発においてはテストの存在は欠かせません。モノグサでは、品質の高いサービスを提供するためにテストの追加を活発に行っています。そんな中、私は外部連携APIにテストを追加するタスクを任せていただきました。テスト作成では2つの点で苦労しました。

最初にテストを書いていて直面した問題は、APIのエンドポイントに対してどのようなリクエストを送っても、ボディが空になるという問題でした。MonoxerではAPIの作成にPlay Frameworkを利用していますが、テストのためにControllerクラスに注入したstubControllerComponentsに問題があると思いライブラリのコードを読んでみました。すると、stubControllerComponentsのデフォルトのBodyParserは、”どのようなリクエストに対してもボディを空にする”挙動でした。JSONリクエストを解釈するBodyParserを指定したところ、無事に動作しました。

もう一つは、テストの設計が難しかったことです。テストを書くのは機能開発をするときとは勝手が違い、設計では以下の3つの点で堂々巡りが発生して悩みました。

  1. テストのカバレッジ性を上げようとすると、ソースコードが肥大化する

  2. コードを短くしようとユーティリティ関数などを作成して抽象化しようとすると、目的がぼやけてテストの可読性が著しく下がる。

  3. 可読性を確保したユーティリティを書こうとすると、作れるテストの種類が減ってカバレッジ性が下がる

最終的に行き着いたのは、テストが共通して使いそうなモックデータだけパッケージで切り出して、テストを基本的には愚直に書くという方式でした。これだとコードは長くなりますが、設計に対して時間をかけないので、実装全体でかかる時間はそれほど長くないと思います。

インターンの感想

今まで開発をする上で課題に感じていたことは、”良い設計とは何か?がわからない”ということでした。モノグサでのインターンでは、機能開発とテストの追加を経験させていただき、良い設計とは何かを考えながらコードを書く日々でした。また、自分がよくないコードを書いてしまっても、丁寧なPRのおかげで気づくことができました。良い設計とは何か?を完全にはまだ理解できていませんが、インターンを始める前の自分と比べれば分かることが増えたと感じます。学びの多いインターンの機会を提供していただいたモノグサにはとても感謝しています。