導入
このコース全体は「先にテストを書き、それを通す実装をし、整える」というTDD(テスト駆動開発)で進みます。まずは短い題材で、Red→Green→Refactor(失敗するテストを書く→通す最小実装→整える)のリズムを思い出しておきましょう。JavaのテストはJUnit5、@Test を付けたメソッドが1件のテストになります。
図解
flowchart LR
R["Red<br/>失敗するテストを書く"] --> G["Green<br/>通す最小実装"]
G --> RF["Refactor<br/>コードを整える"]
RF --> R
style R fill:#ffebee
style G fill:#e8f5e9
説明
JUnit 5 のテストは、次の3点だけ覚えれば読み書きできます。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class SampleTest {
@Test
void tashizanGaTadashii() {
assertEquals(5, 2 + 3); // 期待値, 実際の値
assertTrue(2 < 3, "2は3より小さい"); // 条件, 失敗時のメッセージ
}
}
@Testを付けたメソッドが1件のテスト。publicでなくてよい(パッケージプライベートが慣習)assertEquals(期待値, 実際の値)は期待値が先。順番を逆にすると失敗メッセージが逆さまになるimport static org.junit.jupiter.api.Assertions.*;と書くとAssertions.を省いて呼べる
やってみよう
下のエディタには TitleRules.java(実装)と TitleRulesTest.java(テスト)の2つのタブがあります。まず何も書かずに「▶ 実行」を押してみてください。テストが赤(❌)になるのがRedの状態です。
演習
タスクのタイトルには「50文字以内」というルールを、後の章(Entity・値オブジェクト)で実装します。ここでは先取りして、文字数チェックのテストを通してください。TitleRules.java の TODO を埋めます。
public class TitleRules {
// TODO: 文字列の長さが50文字以内なら true を返す isShortEnough を実装してください
// (static メソッドにします)
}
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class TitleRulesTest {
@Test
void mijikaiTitleHaOk() {
assertTrue(TitleRules.isShortEnough("牛乳を買う"), "短いタイトルはOK");
}
@Test
void chodoGojuMojiHaOk() {
assertTrue(TitleRules.isShortEnough("a".repeat(50)), "ちょうど50文字はOK");
}
@Test
void gojuIchiMojiHaNg() {
assertFalse(TitleRules.isShortEnough("a".repeat(51)), "51文字はNG");
}
}
- 期待される結果: 3件のテストがすべて成功
ヒント1を見る
public static boolean isShortEnough(String s) { return s.length() <= 50; }
ヒント2を見る
文字数は .length() で取れます。「50文字以内」なので比較演算子は <= です
まとめ
- TDDは実装より先にテストを書く。Red→Green→Refactorのリズム
- JUnit 5 は
@TestとassertEquals/assertTrue/assertFalseがわかれば読み書きできる - このコースでは、Entity・値オブジェクト・Factory・Service・ViewModelのほぼ全てをこのリズムで作る
次回: このコースの設計思想「MVVM」とは何かを見ていきます。