ギークフィードエンジニアの君島です。
以前にGradleでJavaアプリの書き方と自動テストのフレームワークについて紹介しました。
Eclipse環境でGradleビルドするJavaアプリケーションの開発tips
今回は2つの記事の続編という立ち位置の記事として、Javaの自動テストフレームワークJUnit5でテストを書く方法を紹介します。
以下の流れで読めば、Eclipseを使いながらGradleで作成したJavaアプリケーションを自動テストJUnit5で動作させることできるようになっています。
目次
JUnit5とは
詳細は公式のユーザガイドを参照してください。
このうち、自動テストを書くにおいては2章が参考になるかと思います。
この記事では2.1. Annotationsと2.4. Assertionsの一部を実例と共に紹介します。
2. Writing Tests
2.1. Annotations
2.2. Test Classes and Methods
2.3. Display Names
2.4. Assertions
2.5. Assumptions
2.6. Disabling Tests
2.7. Conditional Test Execution
2.8. Tagging and Filtering
2.9. Test Execution Order
2.10. Test Instance Lifecycle
2.11. Nested Tests
2.12. Dependency Injection for Constructors and Methods
2.13. Test Interfaces and Default Methods
2.14. Repeated Tests
2.15. Parameterized Tests
2.16. Test Templates
2.17. Dynamic Tests
2.18. Timeouts
2.19. Parallel Execution
2.20. Built-in Extensions
環境
OS | Windows10 (64bit) |
IDE | Eclipse 4.10.0 |
JDK | JDK8 |
Gradle | 5.5 |
JUnit5での自動テストの作り方
プロジェクト作成
Eclipse環境でGradleビルドするJavaアプリケーションの開発tips
をほぼそのまま引用します。違いは一点のみです。
1 |
gradle init |
実行時に、回答を全てデフォルトではなく、type of projectをapplication、かつtest frameworkをJUnit Jupiterにします。以下gradle initの出力例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
D:\kimishima\eclipse\testworkspace\Junt5Target>gradle init Configuration on demand is an incubating feature. Select type of project to generate: 1: basic 2: application 3: library 4: Gradle plugin Enter selection (default: basic) [1..4] 2 Select implementation language: 1: C++ 2: Groovy 3: Java 4: Kotlin Enter selection (default: Java) [1..4] Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] Select test framework: 1: JUnit 4 2: TestNG 3: Spock 4: JUnit Jupiter Enter selection (default: JUnit 4) [1..4] 4 Project name (default: Junt5Target): Source package (default: Junt5Target): jp.co.gf.junit5 > Task :init Get more help with your project: https://docs.gradle.org/5.5/userguide/tutorial_java_projects.html BUILD SUCCESSFUL in 19s 2 actionable tasks: 2 executed Configuration on demand is an incubating feature.adle eclipse BUILD SUCCESSFUL in 6s 3 actionable tasks: 3 executed |
このあとは、過去の記事に従ってeclipseで読み込めるようにすれば、以下のプロジェクトが出来上がっていることでしょう。
この時点でソースのパスとは別にテストコードのパスも、ソースと同一パッケージ名にてテストクラスも出来上がっています。
つまりは、もうEclipse環境でGradleビルドするJavaアプリケーションの自動テストの8割は完成です。
この後は実際の修正を想定して自動テストを実際に書いていくだけになります。
アプリケーションのソースコードの修正
もともと出来上がっていたApp.javaに以下のような修正を加えました。
・各アクセス修飾子のメソッドを追加した
・メンバ変数を追加した
・定義を用いた(やってみたが特に意味はなかった)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package jp.co.gf.junit5; public class App { protected static final String GREETING = "Hello world."; private String mValue; public String getValue() { return mValue; } protected void setValue(String value) { if (isEmpty(value)) { mValue = null; return; } mValue = value; } private boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; } public String getGreeting() { return GREETING; } public static void main(String[] args) { System.out.println(new App().getGreeting()); } } |
テストケースの追加
それでは修正したクラスのテストケースを追加しましょう。
アクセス修飾子protectedのテストもしたいので、パッケージ名を対象のクラスと同じにします。
また、Class under test(対象のクラスの指定)にパッケージ名を含む対象のクラスを入力し、Nextをクリックします。
そうすると、メソッド単位でテストメソッドの自動生成ができます。
ご覧の通り、当然private修飾子のメソッドは表示されません。privateメソッドはprotectedかpublicのテストから行うか、自動テストの対象としたければ修飾子を変更しましょう。(ここで修飾子を変更するというのは、設計が間違っているともいえるので、その際は見直しをしましょう。)
Finishを押すとテストメソッドが自動生成された状態のテストクラスが生成されます。
自動テストを書く
ここから先は実際に自動テストのプログラムを書いていきます。
User Guideの2.1. Annotationsについて、よく言われる点を簡単に記載します。以下の表の順序に呼び出されます。
Annotation | Description |
@BeforeAll | テストケースの実行前に一度だけ呼ばれるメソッドであることを示します。staticなメソッドとなります。 |
@BeforeEach | テストメソッドごとにその直前に呼ばれるメソッドであることを示します。 |
@Test | テストメソッドであることを示します。 |
@AfterEach | テストメソッドごとにその直後に呼ばれるメソッドであることを示します。 |
@AfterAll | テストケースの実行後に一度だけ呼ばれるメソッドであることを示します。staticなメソッドとなります。 |
また、User Guideの2.4. Assertionについて、
今まではassertionは上から実行されて、途中で失敗した場合は以降のassertionは実行されませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 |
@Test void testSetValue() { mApp.setValue(null); assertTrue(mApp.getValue() == null); mApp.setValue(""); assertEquals("", mApp.getValue()); mApp.setValue("Junit5 のStringのテストです。"); assertEquals("Junit5 のStringのテストです。", mApp.getValue()); } |
それをJUnit5では、以下のような書き方をすると途中でassertに失敗しても、実行される書き方ができるようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Test void testSetValue() { assertAll( () -> { mApp.setValue(null); assertTrue(mApp.getValue() == null); }, () -> { mApp.setValue(""); assertEquals("", mApp.getValue()); }, () -> { mApp.setValue("Junit5 のStringのテストです。"); assertEquals("Junit5 のStringのテストです。", mApp.getValue()); } ); } |
以上を踏まえて書いたテストコードの例がこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
package jp.co.gf.junit5; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class AppCustomizedTest { private App mApp; @BeforeAll static void initAll() { System.out.println("BeforeAll fuction."); } @BeforeEach void init() { mApp = new App(); System.out.println("BeforeEach fuction."); } @Test void testGetValue() { assertTrue(mApp.getValue() == null); } @Test void testSetValue() { assertAll( () -> { mApp.setValue(null); assertTrue(mApp.getValue() == null); }, () -> { mApp.setValue(""); assertTrue(mApp.getValue() == null); }, () -> { mApp.setValue("Junit5 のStringのテストです。"); assertEquals("Junit5 のStringのテストです。", mApp.getValue()); } ); } @Test void testGetGreeting() { assertEquals(App.GREETING, mApp.getGreeting()); } @AfterEach void tearDown() { System.out.println("AfterEach fuction."); } @AfterAll static void tearDownAll() { System.out.println("AfterAll fuction."); } } |
テスト実行・ビルド実行
テストの実行はEclipseのRun As > JUnit Testで実行できます。
また、ビルド前に自動テストの実行もしてくれます。つまり、いつも通りbuild gradleでOKです。
また、build\reports\tests\test\index.htmlにテスト結果のレポートも出力してくれます。Packageから辿ると、テストメソッドごとの詳細も出力されていることが分かります。
まとめ
以上が、Eclipse環境でGradleビルドするJavaアプリケーションの自動テスト(JUnit5)の書き方、並びにテスト自動化のためのフレームワーク② JUnitでした。
JUnit5からの新機能もまだまだありますが、長くなってしまうので別の機会に紹介していきたいと思います。
テストコードを書くこと自体は作業になりますが、それまでに特別な操作はあまりないことが分かりますので、自動テストを書いていく習慣をつけていきたいですね。
- CLIでAmazon S3にあるファイル内の文字列検索をしてみる - 2024-02-01
- 不完全なマルチパートアップロードをCLIで確認してS3の無駄コストを無くそう - 2024-01-29
- AlmaLinux9.3にPHP8.3を入れてLaravel9から10にバージョンアップする - 2024-01-12
- AWS CloudShellの表現力を確認してみよう - 2024-01-01
- AWSのアーキテクチャーを学べるAWS Card Clash攻略Wiki - 2023-12-26