1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソフトウェアテスト技法練習帳 デシジョンテーブル2_01 一杯目のビールの価格 学習メモ

Last updated at Posted at 2025-01-06

概要

投稿理由

・ソフトウェアテスト技法練習帳でデシジョンテーブルについて勉強したので記録に残します。
内容はCodepenで動く実物と設計書(もどき)です。

対象読者

・ソフトウェアテストのデシジョンテーブルの例を確認したい方。プロダクトコードとテストコードを確認できます。

工夫したこと

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

・プロダクトコードは動けば良いというレベルで実装しています。そこまで力入れてません。

デシジョンテーブルとは

デシジョンテーブルを使用して論理的な条件をカバーし、
入出力の組み合わせを規則ごとに実行するテストケースを設計するテスト

成果物

codepen

ビジネスルールに基づいて、一杯目の価格を決める。

See the Pen software_test_2_01 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>2_1 一杯目のビールの価格</title>
</head>
<body>
    <h1>2_1 一杯目のビールの価格</h1>
    <div>
        <div>
            <input type="checkbox" id="happyHour" name="happyHour" />
            <label for="happyHour">ハッピーアワー</label>
        </div>
        <div>
            <input type="checkbox" id="coupon" name="coupon" />
            <label for="coupon">クーポン</label>
        </div>
    </div>
    <button id="run">計算</button>
    <div id="result" style="color:red;"></div>
<script>
    let currentEnchant = [0,0,0,0];
    const maxEnchant = [0,0,0,1];
    const  weapon_id =["hinoki","ninjin","kikori","kusanagi"];

    // event 系
window.onload = (event) => {

    const coupon = document.getElementById('coupon');
    const happyHour = document.getElementById('happyHour');
    const button = document.getElementById('run');
    const result = document.getElementById('result');
    
    const normalPrice = 490;
    const couponPrice = 100;
    const happyHourPrice = 290;

    // ボタンクリック時の処理
    button.addEventListener('click', event => {
        console.log(happyHour.checked);
        if(coupon.checked){
            result.innerHTML = "結果: " + (couponPrice ) + "円です。";
            return
        }
        if(happyHour.checked){
            result.innerHTML = "結果: " + (happyHourPrice) + "円です。";
            return
        }
        result.innerHTML = "結果: " + (normalPrice) + "円です。";
    });
}
</script>
</body>
</html>

テストコード

開発環境

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

;
describe('1_07 武器の強化判定', () => {

  let html="";
  let dom = ""
  beforeEach(async() => {
    html = await fs.readFile("software_test/02Decision_Table/2_01/2_01.html")
    dom =  new JSDOM(html,{runScripts: "dangerously"});
    dom.window.onload();
  })

  test.each([
    [false,false,"490"],
    [true,true,"100"],
    [true,false,"290"],
    [false,true,"100"],
  ])('2択*2のデシジョンテスト', async(isHappyHour,isCoupon,expectedResult) => {
        
       // テキスト入力欄を取得し値を設定
        const button = dom.window.document.getElementById('run');
        const happyHoursCheckBox = dom.window.document.getElementById("happyHour");
        const couponCheckBox = dom.window.document.getElementById("coupon");
        const result = dom.window.document.getElementById('result');
        happyHoursCheckBox.checked = isHappyHour;
        couponCheckBox.checked = isCoupon;
        // クリック
        button.click();
        // 結果の取得
        expect(result.innerHTML).toContain(expectedResult);
  });

});


ドキュメント

ユースケース記述

項目名 説明
ユースケース 1杯目のビールの価格を求める
主アクター ユーザ
事前条件 なし
主シナリオ 1.入力欄を記入 2.ボタンを押す価格を確認する
成功時保証 --
ビジネスルール 通常価格、クーポン割引、ハッピーアワー割引、価格の優先度について

ビジネスルール

項目名 説明
ビジネスルール名 通常価格
内容 490円/杯
項目名 説明
ビジネスルール名 クーポン割引
内容 初めの一杯のみ100円
項目名 説明
ビジネスルール名 ハッピーアワー割引
内容 290円/杯
項目名 説明
ビジネスルール名 価格の優先度について
内容 最も安い値段を優先する

画面項目

項目名 表示名 I/O プロパティ(物理名) 種類 備考
タイトル 1杯目のビールの価格 O title ラベル _
ハッピーアワー -- I happyHour チェックボックス _
クーポン -- I coupon チェックボックス _
実行 計算 I run ボタン clickイベント有り
結果 結果:XXX O result ラベル clickイベント実行後に値が変化する

イベント処理

ボタン onClickイベント

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

ライフライン名 分類 説明
input HTML id=happyYear couponに該当
button HTML id=runが該当
result HTML id= resultに相当
event JS Clickイベントハンドラー
logic JS ビジネスルール 4種

ノートに書いた下書き

image.png

image.png

参考

github 差分
https://github.com/RYA234/routine_tool/commit/11eb85c46d79e01fb878ebe12d4b8fde4708b003

テスト観点

「はじめての設計をやり抜くための本 第2版」 p95 ユースケース分析

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

「ソフトウェアテスト技法練習帳 ~知識を経験に変える40問」

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?