テストケース練習:シンプル純粋関数③
code: case3.js
/**
* パスワードの強度を判定する
* @param {string} password - 判定するパスワード
* @returns {string} 'weak', 'medium', 'strong', 'very_strong' のいずれか
*
* 判定基準:
* - 8文字未満: weak
* - 8文字以上で以下を1つ満たす: medium
* - 大文字と小文字の両方を含む
* - 数字を含む
* - 記号を含む
* - 12文字以上で上記を2つ満たす: strong
* - 16文字以上で上記を3つ全て満たす: very_strong
*/
function evaluatePasswordStrength(password) {
if (typeof password !== 'string') {
throw new Error('Password must be a string');
}
const length = password.length;
const hasLowerCase = /a-z/.test(password); const hasUpperCase = /A-Z/.test(password); const hasNumber = /0-9/.test(password); const hasSymbol = /[!@#$%^&*()_+\-=\\{};':"\\|,.<>\/?]/.test(password); const hasMixedCase = hasLowerCase && hasUpperCase;
let criteriaCount = 0;
if (hasMixedCase) criteriaCount++;
if (hasNumber) criteriaCount++;
if (hasSymbol) criteriaCount++;
if (length < 8) {
return 'weak';
}
if (length >= 16 && criteriaCount === 3) {
return 'very_strong';
}
if (length >= 12 && criteriaCount >= 2) {
return 'strong';
}
if (length >= 8 && criteriaCount >= 1) {
return 'medium';
}
return 'weak';
}
password = length / hasMixedCase / hasNumber / hasSymbol
機械的グルーピング
length:7, 8, 11, 12, 15, 16
hasMixedCase: 小文字のみ、大文字のみ、大小どっちも
hasNumber:ある、なし
hasSymbol:ある、なし
table: 各々の条件有無が有効に働くかをテスト
length hasMixedCase hasNumber hasSymbol 期待結果
16 大小どっちも ある ある very_strong
16 小文字のみ ある ある strong
16 大文字のみ ある ある strong
16 大小どっちも なし ある strong
16 大小どっちも ある なし strong
table: weakになるパターン
length criteriaCount 期待結果
7 3 weak
8 0 weak
16 0 weak
table: mediumになるパターン
length criteriaCount 期待結果
8 1 medium
16 1 medium
11 3 medium
table: strongになるパターン
length criteriaCount 期待結果
12 3 strong
15 3 strong
16 2 strong
table: very_strongになるパtーあん
length criteriaCount 期待結果
16 3 very_strong
気づき
引数が1つでも、仕様の観点から複数の属性に分解してテストケースを考える時もある
仕様から、条件を抽象化してテストケースを作ると効率的な時もある
❌ 全パターン列挙:Abc123!、abc123!、ABC123!...(膨大)
✅ 条件で整理:「3条件満たす」「2条件満たす」(簡潔)