📌

マイヤーズの三角形の問題のテスト対象を google formsで作る

2020/10/26に公開

はじめに

みなさん "マイヤーズの三角形の問題"というのをご存知でしょうか
3辺の長さをあらわす3つの整数を読みとり
出力として、不等辺三角形、二等辺三角形、正三角形を判別して表示するプログラムに対して
テストケースを書くというエクササイズです。
これはテストケースを考案するためのエクササイズとして知られています
考案したのは、グレンフォード・マイヤーズという人で名前を聞いたことがある人も多いでしょう。
彼の名前は、いろんなテスト関連の資料の中に出てきますが、
"The Art of Software Testing "の著者として有名です。
今回このエクササイズを進めてテスト実行するための対象としてgoogle formを使って作ってみたいと思います

Step 01.フォームを作成する

このフォームの目的は、A,BとCという3つの入力から
三角形のタイプ(正三角形か二等辺三角形か普通の三角形か)を計算し、
答えを表示することです。
取り急ぎこんかフォームを作成しましょう
image.png

Step 03. フォームの入力をSpread Sheetに追加する設定を入れる

最終的な答えはspreadsheetに記載されるためFormの機能を使ってSpread sheetと連携させましょう
image.png
こちらを連携させます

↑のSpreadSheetのURLの部分
https://docs.google.com/spreadsheets/d/XXXXXXX/edit#gid=1030984857
このXXXXの部分をメモっておいてください

Step02. 三角形を計算するロジックをGoogle Apps Scriptで実装し、連携させます

image.png
ここを押すとGoogle App Scriptを追加できます
image.png

このソースコードの部分に下記をコピペして貼り付けてください

/**
 * myFunction: main function
 *
 * @return void
 *
 **/
function myFunction() {
	//gather inputs A,B and C from the form
	var inputs = new Array(3); // [A,B,C]
	var form = FormApp.getActiveForm(); // this form
	var formResponses = form.getResponses(); // this response
	for (var i = 0; i < formResponses.length; i++) {
		var itemResponses = formResponses[i].getItemResponses();
		for (var j = 0; j < itemResponses.length; j++) {
			inputs[j] = itemResponses[j].getResponse();
		}
	}

	//validate
	var type = "error"; // default type is "error"
	// type has changed if there are all valid inputs 
	if (validInput(inputs[0], inputs[1], inputs[2])) {
		//categorize the triangle type from inputs
		type = triangleType(inputs[0], inputs[1], inputs[2]);
	}
  
    // log inputs and type
	Logger.log(inputs);
	Logger.log(type);
  
    // put the anser to last row
	var sheet = SpreadsheetApp.openById("Step2でメモったXXXXXX").getSheets()[0];
	var lastRow = sheet.getLastRow();
     
	sheet.getRange(lastRow, 5).setValue(type);
}

/**
 * validateInput: vaidate Inputs
 *
 * @parameter A:integer
 * @parameter B:integer
 * @parameter C:integer
 * @return boolean
 *
 **/
function validInput(A, B, C) {
	// A,B and C all should be a number
	if (isNaN(A) || isNaN(B) || isNaN(C)) {
		return false;
	}
	// A,B and C all should be a integer
	if (!parseInt(Number(A)) == A || !parseInt(Number(B)) == B || !parseInt(Number(C)) == C) {
		return false;
	}
	// A,B and C all should be a positive integer
	if (A < 0 || B < 0 || C < 0) {
		return false;
	}
	// A,B and C all should be less than MAX_VALUE
	if (A > Number.MAX_SAFE_INTEGER || B > Number.MAX_SAFE_INTEGER || C > Number.MAX_SAFE_INTEGER) {
		return false;
	}
	return true;
}

/**
 * triangleType: categorize the triangle from inputs
 *
 * @parameter A:integer
 * @parameter B:integer
 * @parameter C:integer
 * @return string
 *
 **/
function triangleType(A, B, C) {
	// transform to integer type
	A = parseInt(Number(A));
	B = parseInt(Number(B));
	C = parseInt(Number(C));
	// can create a triangle?
	if (!(Math.abs(A - B) < C && C < A + B)) {
		return "not a triangle";
	}
	// can be a equilateral triangle
	if (A === B && B === C && C === A) {
		return "equilateral triangle";
	}
	// can be a isosceles triangle
	if (A === B || B === C || C === A) {
		return "isosceles triangle";
	}
	// or normal
	return "normal triangle";
}

Step 04. トリガーを設定する

先程のソースコードの画面で
image.png
こちらを選択 "+ Add Trigger"を押下して
image.png
のように設定して
終わり

デモ

デモはこちらです
https://forms.gle/Z6aCtEYeiW37Vzr66

最後まで読んでいただきありがとうございました!!

Discussion