Sensei と AssertJ でユニットテストを読みやすくする。

2021年12月01日発行
ショーン・フラニガン著
ケーススタディ

Sensei と AssertJ でユニットテストを読みやすくする。

2021年12月01日発行
ショーン・フラニガン著
リソースを見る
リソースを見る

開発者は、さまざまな方法で自分のコードを作成し、テストしています。その一つがユニットテストです。ユニットテストは、自分のコードの最小部分をテストする非常にポピュラーな手法です。ユニットテストがうまく書かれていれば、コードの品質を向上させるだけでなく、コストや開発期間の削減にもつながります。テスト駆動開発(TDD)の一環として行われるかどうかに関わらず、ユニットテストは現代の開発手法の重要な部分を占めており、その重要性から多くのテストフレームワークが作られています。

しかし、適切なテストフレームワークやガイダンスがない場合、ユニットテストは、品質や読みやすさよりもカバレッジや量に焦点が移ることで、複雑で読みにくいものになってしまいます。これは、多くのユニットテストを持つ大規模で活発なコードベースでは特に顕著です。

優れたテストフレームワークは、シンプルで品質テストに特化した読みやすいテストを作成するのに役立ちます。また、コードの使用方法を文書化するのにも役立ちます。そのようなフレームワークの一つがAssertJです。

AssertJは、Javaでユニットテストを書くための流暢なAPIです。AssertJでは、文脈を考慮したオートコンプリートを使用して、英語のように読みやすいテストアサーションを書くことができます。多数のテストがあり、その読みやすさを向上させる必要がある場合は、すべてのテストをAssertJに移行し、将来のテストでもAssertJを最大限に活用できるようにするとよいでしょう。

しかし、完全な移行を手動で行うには膨大な労力と時間がかかるため、他の開発作業のために省略されたり、後回しにされたりすることがよくあります。そこで、私たちはSensei を作成しました。これは、高度にカスタマイズ可能な IntelliJ プラグインで、現在のユニットテストを AssertJ に移行し、今後のテストを正しい方法で記述できるようにします。このプラグインは、Senseiの開発チームが作成した多数のレシピ(ルール)を用いて行われます。Sensei では、一度だけの移行を行うことも、一度に一つのテストを AssertJ に移行する漸進的なアプローチを取ることも簡単です。AssertJに移行した後も、レシピは開発者がユニットテストを書く際に迅速な修正を適用するのに役立ち、ユニットテストがコードベース全体で均一、標準、一貫性のあるものになります。

AssertJのサイズルールの設定方法動画

についてSensei

Sensei は、入力中に望ましくないコードをスキャンして修正するための高度にカスタマイズ可能な IntelliJ プラグインで、何百ものダウンロード可能なコード変換と移行レシピ(ルール)に加え、独自のコードを作成する機能も備えています。Sensei を使用することで、開発者は入力中に不適切なコードパターンを修正することができ、高品質なコードをより早く提供することができ、最終的にはチームやプロジェクト全体で一貫した標準的な方法でコードを記述することができます。

ここでは、Sensei がどのようにしてユニットテストを AssertJ を使用するように移行するのに苦労しないかを理解するのに役立つと思われるサンプル移行の例を紹介します。

なぜAssertJはユニットテストを書くのに最適なフレームワークなのか?

このJUnitのアサーションのようなテストを書くのではなく

のように、AssertJで書くことができます。

つまり、アサーションを英語の文章のように左から右に読むことができ、どちらが期待されているか(この場合はサイズ3)が明確になります。このようにアサーションを間違った方向に書いてしまったことが何度かありませんか?

これらは簡単な例に過ぎません。チェックやアサーションが複雑になればなるほど、 AssertJ はテストをシンプルで読みやすいものにするのに役立ちます。また、IDE のオートコンプリートともうまく連携しています。と入力するとすぐに

を実行すると、myResult のタイプに応じて、チェックできるすべての項目がポップアップ表示されます。コレクションであれば、その内容やサイズ、特定の値や型を含んでいるかどうかなどを確認できます。

AssertJは、プリミティブとそのボックス型、アトミック型、コレクション、配列、マップ、日付、java.time、Futures、ファイル/パス、入力ストリーム、Throwable、URLをすぐにサポートします。また、Hamcrest用のお気に入りのカスタムMatcherがあれば、HamcrestConditionを介してAssertJで使用することができます。

読みやすいユニットテストは、開発者が通常の英語でコードを読むことを容易にするため、カバレッジを高めるだけでなく、間違いを見つけることも容易になります。

従来のユニットテストをAssertJに移行するためのレシピ

AssertJを使って一貫したコードを書くためのクックブックを作成しました。このクックブックは、以下のフレームワークからアサーションをAssertJに移行する際に役立ちます。JUnit 3、JUnit 4、JUnit 5、FEST-Assert。

このクックブックは、Sensei で設定してすぐに使用することができます。また、Sensei 用のインストール手順はこちらをご覧ください。

コードを書きながらより良いユニットテストを書く - JUnitの品質を徐々に向上させる

Sensei AssertJのクックブックは、他のフレームワークからの移行を支援するだけではありません。テストの書き方を改善したり、古い習慣を断ち切ったり、よりイディオム的なAssertJテストを書いたりするのに役立つレシピが掲載されています。

例えば、次のようなテストを書いたとします。

おそらく、上記の移行レシピの一つを使って、このJUnitスタイルのアサーションから移行したのではないでしょうか。

Sensei の AssertJ のクックブックには、この古いスタイルのアサーションも検出できるレシピがあり、これへの変換を提案しています。

別のレシピでは、次のように変換できます。

にしました。

一度だけの移行で、チーム間で統一されたコーディング作業が可能になります。Sensei

上記の例から、AssertJを使用するためにユニットテストを手動で移行することは、より良いテストを書くために費やすべき多くの労力と時間を必要とすることがわかります。Sensei を使用すれば、自信を持ってユニットテストをAssertJに簡単に移行することができます。Sensei は、このような柔軟性を提供することで、コードの移行を容易にします。

ユニットテストの移行は、プロジェクト全体で一貫性のあるコードを書くためにSensei を利用する多くの方法の一例に過ぎません。アンチパターンや、プルリクエストや自分でコーディングする際に頻繁に遭遇する手動でのコード変換には常に注意を払う必要があります。開発者が見落としがちなコーディングガイドラインがあれば、そのガイドラインをレシピ化することで、開発者が自信を持って承認されたコード変換を適用できるようになります。

ご質問があれば、ぜひお聞かせください。sensei-scw.slack.comのSlackにご参加ください。

リソースを見る
リソースを見る

著者

ショーン・フラニガン

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Sensei と AssertJ でユニットテストを読みやすくする。

2021年12月01日発行
ショーン・フラニガン著

開発者は、さまざまな方法で自分のコードを作成し、テストしています。その一つがユニットテストです。ユニットテストは、自分のコードの最小部分をテストする非常にポピュラーな手法です。ユニットテストがうまく書かれていれば、コードの品質を向上させるだけでなく、コストや開発期間の削減にもつながります。テスト駆動開発(TDD)の一環として行われるかどうかに関わらず、ユニットテストは現代の開発手法の重要な部分を占めており、その重要性から多くのテストフレームワークが作られています。

しかし、適切なテストフレームワークやガイダンスがない場合、ユニットテストは、品質や読みやすさよりもカバレッジや量に焦点が移ることで、複雑で読みにくいものになってしまいます。これは、多くのユニットテストを持つ大規模で活発なコードベースでは特に顕著です。

優れたテストフレームワークは、シンプルで品質テストに特化した読みやすいテストを作成するのに役立ちます。また、コードの使用方法を文書化するのにも役立ちます。そのようなフレームワークの一つがAssertJです。

AssertJは、Javaでユニットテストを書くための流暢なAPIです。AssertJでは、文脈を考慮したオートコンプリートを使用して、英語のように読みやすいテストアサーションを書くことができます。多数のテストがあり、その読みやすさを向上させる必要がある場合は、すべてのテストをAssertJに移行し、将来のテストでもAssertJを最大限に活用できるようにするとよいでしょう。

しかし、完全な移行を手動で行うには膨大な労力と時間がかかるため、他の開発作業のために省略されたり、後回しにされたりすることがよくあります。そこで、私たちはSensei を作成しました。これは、高度にカスタマイズ可能な IntelliJ プラグインで、現在のユニットテストを AssertJ に移行し、今後のテストを正しい方法で記述できるようにします。このプラグインは、Senseiの開発チームが作成した多数のレシピ(ルール)を用いて行われます。Sensei では、一度だけの移行を行うことも、一度に一つのテストを AssertJ に移行する漸進的なアプローチを取ることも簡単です。AssertJに移行した後も、レシピは開発者がユニットテストを書く際に迅速な修正を適用するのに役立ち、ユニットテストがコードベース全体で均一、標準、一貫性のあるものになります。

AssertJのサイズルールの設定方法動画

についてSensei

Sensei は、入力中に望ましくないコードをスキャンして修正するための高度にカスタマイズ可能な IntelliJ プラグインで、何百ものダウンロード可能なコード変換と移行レシピ(ルール)に加え、独自のコードを作成する機能も備えています。Sensei を使用することで、開発者は入力中に不適切なコードパターンを修正することができ、高品質なコードをより早く提供することができ、最終的にはチームやプロジェクト全体で一貫した標準的な方法でコードを記述することができます。

ここでは、Sensei がどのようにしてユニットテストを AssertJ を使用するように移行するのに苦労しないかを理解するのに役立つと思われるサンプル移行の例を紹介します。

なぜAssertJはユニットテストを書くのに最適なフレームワークなのか?

このJUnitのアサーションのようなテストを書くのではなく

のように、AssertJで書くことができます。

つまり、アサーションを英語の文章のように左から右に読むことができ、どちらが期待されているか(この場合はサイズ3)が明確になります。このようにアサーションを間違った方向に書いてしまったことが何度かありませんか?

これらは簡単な例に過ぎません。チェックやアサーションが複雑になればなるほど、 AssertJ はテストをシンプルで読みやすいものにするのに役立ちます。また、IDE のオートコンプリートともうまく連携しています。と入力するとすぐに

を実行すると、myResult のタイプに応じて、チェックできるすべての項目がポップアップ表示されます。コレクションであれば、その内容やサイズ、特定の値や型を含んでいるかどうかなどを確認できます。

AssertJは、プリミティブとそのボックス型、アトミック型、コレクション、配列、マップ、日付、java.time、Futures、ファイル/パス、入力ストリーム、Throwable、URLをすぐにサポートします。また、Hamcrest用のお気に入りのカスタムMatcherがあれば、HamcrestConditionを介してAssertJで使用することができます。

読みやすいユニットテストは、開発者が通常の英語でコードを読むことを容易にするため、カバレッジを高めるだけでなく、間違いを見つけることも容易になります。

従来のユニットテストをAssertJに移行するためのレシピ

AssertJを使って一貫したコードを書くためのクックブックを作成しました。このクックブックは、以下のフレームワークからアサーションをAssertJに移行する際に役立ちます。JUnit 3、JUnit 4、JUnit 5、FEST-Assert。

このクックブックは、Sensei で設定してすぐに使用することができます。また、Sensei 用のインストール手順はこちらをご覧ください。

コードを書きながらより良いユニットテストを書く - JUnitの品質を徐々に向上させる

Sensei AssertJのクックブックは、他のフレームワークからの移行を支援するだけではありません。テストの書き方を改善したり、古い習慣を断ち切ったり、よりイディオム的なAssertJテストを書いたりするのに役立つレシピが掲載されています。

例えば、次のようなテストを書いたとします。

おそらく、上記の移行レシピの一つを使って、このJUnitスタイルのアサーションから移行したのではないでしょうか。

Sensei の AssertJ のクックブックには、この古いスタイルのアサーションも検出できるレシピがあり、これへの変換を提案しています。

別のレシピでは、次のように変換できます。

にしました。

一度だけの移行で、チーム間で統一されたコーディング作業が可能になります。Sensei

上記の例から、AssertJを使用するためにユニットテストを手動で移行することは、より良いテストを書くために費やすべき多くの労力と時間を必要とすることがわかります。Sensei を使用すれば、自信を持ってユニットテストをAssertJに簡単に移行することができます。Sensei は、このような柔軟性を提供することで、コードの移行を容易にします。

ユニットテストの移行は、プロジェクト全体で一貫性のあるコードを書くためにSensei を利用する多くの方法の一例に過ぎません。アンチパターンや、プルリクエストや自分でコーディングする際に頻繁に遭遇する手動でのコード変換には常に注意を払う必要があります。開発者が見落としがちなコーディングガイドラインがあれば、そのガイドラインをレシピ化することで、開発者が自信を持って承認されたコード変換を適用できるようになります。

ご質問があれば、ぜひお聞かせください。sensei-scw.slack.comのSlackにご参加ください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。