2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エラー処理_単項目チェック 例_01 とても質素な場合

Last updated at Posted at 2024-12-07

概要

・エラー処理の単項目チェックについてです。
内容はCodepenで動く実物と設計書(もどき)です。

目的

・ブラウザのみで動作できるようにする。
 プログラマ以外の端末でも動作環境を確保できるようにしたい。
 極力docker,node.jsなどを動作環境に含めたくない。
 (テストコードの動作環境はdocker有り)

・設計書を書く練習するため。ソースコードは手抜く感じにします。
・設計から実装、単体テストまで一貫して考える習慣をつけるため。

単項目チェックとは?

エラーチェックの一種
入力値の型、桁数、書式、必須、文字コードなどが規則どおりかを確認します。
ウェブシステムの場合はフロントエンド側で実施する

図解でなっとく!トラブル知らずのシステム設計 エラー制御・排他制御編 p25 単項目チェックより

成果物

codepen

数値に対して単項目チェックを行う
1以上100未満以外の値はエラーになるよう判定します。

See the Pen singleItemCheck by RYA234 (@rya234) on CodePen.

プロダクトコード

動作環境

名称 version 説明
GoogleChrome 131.0.6778.86 ウェブブラウザ
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>単項目チェック_01</title>
</head>
<body>
    <h1>単項目チェック_01</h1>
    <div>
        <label for="number">数値 :</label>
        <input type="number" id="number" name="number" size="10" />
    </div>
    <div>
        <button id="checkbutton">単項目チェック</button>
    </div>
    <div id="result">結果:</div>
<script>
  // エラーメッセージ設計

    // event 系
window.onload = (event) => {
    // dom要素取得
    const button = document.getElementById('checkbutton');
    const number = document.getElementById('number');
    const result = document.getElementById('result');
    
    // ボタンクリック時の処理
    button.addEventListener('click', event => {

        result.innerHTML = "結果:";
        let isNumber =  numberSingleItemCheck(parseInt(number.value));
        if(isNumber != true){
            console.error(isNumber);
            result.innerHTML += isNumber
            return;
        }
        result.innerHTML += "問題無し。"
    });
};

function numberSingleItemCheck(number){
    try{
        let numberMessage = "";

        // 整数以外の数字
        console.log(typeof(number));
        console.log(number);
        if( !Number.isInteger(number)){
            throw new TypeError("エラー:空欄か文字が入力されています。");
        }
        console.log(number);
        if( number < 0 || number >= 100){
            throw new RangeError("エラー:数値は0以上100未満です。");
        }
        return true;
    }catch (e) {
         return e.message;

        } finally {
    	 //必ず実行される処理
    }
}
</script>
</body>
</html>

テストコード

開発環境

名称 version 説明
Javascript - プログラミング言語
HTML HTML Living Standard GUI
Nodejs 22.9.0 単体テスト実行で使う
Jest 29.70 テストフレームワーク
jsdom 25.01 DOM操作のライブラリ テストで使う
Github Codespaces - クラウドIDE
import { beforeEach, expect, test } from '@jest/globals';
import fs from "fs/promises";
import { JSDOM } from "jsdom";
// 実行コマンド
// docker-compose exec -it webserver bash -c  "npm test simple_error_01.test.js"
// 参考にしたやつ
// https://symfoware.blog.fc2.com/blog-entry-2685.html

;
describe('test11', () => {

  let html="";
  let dom = ""
  beforeEach(async() => {
    html = await fs.readFile("system_design_error/01_simple_error/simple_error.html")
    dom =  new JSDOM(html,{runScripts: "dangerously"});
    dom.window.onload();

  })


  test.each([
    ["","空欄、数値以外が入力されています。"],
    ["kk","空欄、数値以外が入力されています。"],
    ["ああ","空欄、数値以外が入力されています。"],
    ["111","数値は0以上100未満です。"],
    ["100","数値は0以上100未満です。"],
    ["10","問題無し。"],  
    ["0","問題無し。"],
    ["99","問題無し。"],  
  ])('数字単項目テスト"', async(actualNumber,expected) => {
        // テキスト入力欄を取得し値を設定
        const number = dom.window.document.getElementById('number');
        number.value =  actualNumber;
        // ボタン取得とクリック
        const button = dom.window.document.getElementById('checkbutton');
        await button.click();
        // 結果の取得
        const result = dom.window.document.getElementById('result');

        expect(result.innerHTML).toContain(expected);
  });
});

ドキュメント

ユースケース記述

項目名 説明
ユースケース 単項目チェック
主アクター ユーザ
事前条件 無し
主シナリオ ・ユーザーが数値を入力する
・ボタンを押す
・入力値がビジネスルールを満たしているか判定する
成功時保証 無し
ビジネスルール 数値入力規則

ビジネスルール

項目名 説明
ビジネスルール名 数値 入力規則
内容 1以上100未満

画面項目

項目名 表示名 I/O プロパティ(物理名) 種類 備考
タイトル 単項目チェックサンプル O title ラベル _
数値 -- I number テキストボックス _
実行 単項目チェック I checkButton ボタン clickイベント有り
結果 結果:XXX O result ラベル clickイベント実行後に値が変化する

イベント処理

ボタン onClickイベント

 入力項目に対して、入力規則を満たしているか確認する。
 頻繁に使うので、クライアントで実行

ライフライン名 分類 説明
textbox HTML id=numberに該当
button HTML id=checkbuttonが該当
message HTML id= resultに相当
event JS Clickイベントハンドラー
singleItemCheck JS ビジネスルール 数値入力規則

単体テスト仕様書

テスト観点 確認内容 テスト条件 テスト手順 期待値 備考
入力 数値の入力欄がエラーになる場合。 未入力 数値以外の値 - 数値の入力欄に値(空欄, ”あああ”,"kk")を入力する。 以下のように表示結果:空欄、数値以外が入力されています。 テストコード作成
入力 数値の入力欄に期待する値が場合。 正常値の値 - 数値の入力欄に値(と)を入力する。 以下のように表示結果:問題なし。 テストコード作成
画面 初期表示 - ページを表示する 仕様書どおりになっていること 目視で確認

課題点

try catchの実装で手間取りました。
→多分エラー設計の経験が足りないからです。
 try catch exceptionとか深く考えたことない。

あとドキュメントが全体的にガバですね。数こなして改善していきます

ノートに書いた下書き

image.png

image.png

image.png

参考

github 差分
https://github.com/RYA234/routine_tool/commit/2e2ae590ecbe4208dd5a9a6bb882698b938c1985

テストコード

テスト観点

「図解でなっとく!トラブル知らずのシステム設計 エラー制御・排他制御編」 p25 単項目チェック
「はじめての設計をやり抜くための本 第2版」 p95 ユースケース分析

qiitaにCodepenを埋め込む
https://qiita.com/Qiita/items/edae7417214c8e957f54

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?