第16章:Assert基礎①(数・文字・真偽)✅
![]()
テストって「書く」よりも、「どこをどう確認するか(Assert)」で強さが決まるよ〜!💪🧪 この章は “通るだけテスト” → “守れるテスト” に進化させる回だよ😊🌸
🎯 この章のゴール
- 数値・文字列・真偽の 基本Assertを迷わず選べる ✅
- 失敗した時に一発で原因がわかる Assertを書ける 🔍✨
- 「弱いAssert」を「強いAssert」に直せる 🛠️💕
📚 学ぶこと(使うAssertたち)
Vitestの expect() には Jest互換のAssert があり、さらに 2つ目の引数で失敗メッセージも付けられるよ📝✨(地味に便利!) (Vitest)
今日の主役🎬
-
数値:
toBe/toBeCloseTo/toBeGreaterThan/toBeLessThanOrEqual/toBeNaN -
文字列:
toBe/toContain/toMatch -
真偽:
toBe(true/false)/toBeTruthy/toBeFalsy- truthy/falsy の説明と「何がfalsyか」一覧は公式にも載ってるよ (Vitest)
🧠 まず結論:Assert選びのコツ(超大事)🌟
✅ 1) “仕様の言葉”に一番近いAssertを選ぶ
- 「結果は 13 である」→
toBe(13) - 「結果は 10より大きい」→
toBeGreaterThan(10)(Vitest) - 「文字列に 'apple' を含む」→
toContain('apple')(Vitest)
✅ 2) “弱いAssert”はバグを素通りする😇
例:toBeDefined() は「何か返った」しか見ない
→ 本当は「何が返ったか」を守りたいことが多いよね?🤔
🧪 手を動かす①:数値Assert(強くする)🔢✨
1) まずは toBe(プリミティブの一致)
import { test, expect } from "vitest";
function add(a: number, b: number) {
return a + b;
}
test("addは足し算できる", () => {
expect(add(2, 3)).toBe(5);
});
toBe はプリミティブの一致に強いよ✅ (Vitest)
2) 小数は toBeCloseTo(0.1+0.2問題)🫠
Vitest公式でも「小数に toBe は避けてね」って言ってるよ〜! (Vitest)
import { test, expect } from "vitest";
test("小数はtoBeCloseToで比べる", () => {
expect(0.1 + 0.2).toBeCloseTo(0.3, 5);
});
numDigits で「小数点以下何桁まで見るか」指定できるよ✅ (Vitest)
3) “範囲”で守る(大小比較)📏

import { test, expect } from "vitest";
function calcDiscounted(total: number) {
// 例:どんな処理でもいい(ここはassert練習用)
return total * 0.9;
}
test("割引後は元より小さい", () => {
const after = calcDiscounted(1000);
expect(after).toBeLessThan(1000);
});
比較系 Assert:toBeGreaterThan / toBeLessThanOrEqual など (Vitest)
4) NaN だけは専用Assert(罠回避)🕳️
import { test, expect } from "vitest";
test("NaNはtoBeNaNで確認する", () => {
expect(Number("???")).toBeNaN();
});
toBeNaN が用意されてるよ✅ (Vitest)
🧪 手を動かす②:文字列Assert(意図が伝わる)🧵💕
1) 完全一致:toBe
import { test, expect } from "vitest";
function normalizeName(name: string) {
return name.trim();
}
test("前後の空白を消す", () => {
expect(normalizeName(" Alice ")).toBe("Alice");
});
2) 部分一致:toContain
toContain は「配列に含まれる」だけじゃなく、文字列の部分一致にも使えるよ✨ (Vitest)
import { test, expect } from "vitest";
test("メッセージにキーワードを含む", () => {
const msg = "top fruits include apple, orange and grape";
expect(msg).toContain("apple");
});
3) パターン一致:toMatch(正規表現OK)🧙♀️
import { test, expect } from "vitest";
test("ID形式をざっくり確認する", () => {
const id = "user_12345";
expect(id).toMatch(/^user_\d+$/);
});
toMatch は「正規表現 or 文字列」でマッチできるよ✅ (Vitest)
🧪 手を動かす③:真偽Assert(“boolean”と“truthy”は別!)⚪️⚫️
1) booleanを守るなら:toBe(true/false) が基本👍
import { test, expect } from "vitest";
function isAdult(age: number) {
return age >= 18;
}
test("18歳以上はtrue", () => {
expect(isAdult(18)).toBe(true);
});
2) truthy/falsy は「booleanに変換したら…」の世界🌫️
toBeTruthy / toBeFalsy は「値そのもの」じゃなく boolean変換結果を見るよ〜 (Vitest)
falsy は false/null/undefined/NaN/0/"" などがあるって公式に明記されてる✅ (Vitest)
import { test, expect } from "vitest";
test("truthy/falsyは『変換したら』の確認", () => {
expect("hello").toBeTruthy();
expect("").toBeFalsy();
});
💡使い分けの目安
- 仕様が boolean(true/false) →
toBe(true)/toBe(false)✅ - 仕様が「存在する/しない」「空じゃない」 →
toBeTruthy/toBeFalsyが便利✨ (Vitest)
🧨 “弱いAssert” → “強いAssert” 変換ドリル(ミニ演習)🎮✨
お題:このテスト、どこが弱い?😇
import { test, expect } from "vitest";
function getUserLabel(isPremium: boolean) {
return isPremium ? "PREMIUM_USER" : "FREE_USER";
}
test("ユーザーラベルが返る", () => {
const label = getUserLabel(true);
expect(label).toBeDefined(); // ←弱い!
});
✅ 改善例(仕様を守る!)
test("プレミアムはPREMIUM_USERになる", () => {
expect(getUserLabel(true)).toBe("PREMIUM_USER");
});
test("無料はFREE_USERになる", () => {
expect(getUserLabel(false)).toBe("FREE_USER");
});
🤖 AIの使い方(この章のおすすめプロンプト)✨
- 「このテストのAssertが弱いところを指摘して、より仕様に近いAssertへ直して。候補を3つ出して」
- 「
toBeとtoContainとtoMatchのどれが仕様に近い?理由つきで」 - 「truthy/falsy を使っていいケースか、booleanを厳密に見るべきか判定して」
※AIに“仕様そのもの”を決めさせるんじゃなくて、Assert選びの候補出しに使うのが安全だよ🤖🛡️
✅ チェックリスト(合格ライン)💮
- 数値は 一致 / 範囲 / 小数 / NaN を使い分けできる(小数は
toBeCloseTo) (Vitest) - 文字列は 完全一致 / 部分一致 / パターン を使い分けできる (Vitest)
- boolean と truthy/falsy を混同してない (Vitest)
-
toBeDefined()だけで満足してない(“何が返るか”を守ってる)✅
次の第17章は「オブジェクト比較(toEqual / toMatchObject)」で、Assertが一気に楽しくなるところだよ〜!🧸✨