テスト駆動型開発手法を用いた...

30
平成 23 年度 修士学位論文 テスト駆動型開発手法を用いた Java プログラミング学習システム 学籍番号:43422525 岡山大学大学院自然科学研究科電子情報システム工学専攻 (通信ネットワーク工学系) 平成 24 2 6 日提出 指導教員 舩曵 信生 教授

Transcript of テスト駆動型開発手法を用いた...

Page 1: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

平成 23年度 修士学位論文

題 目

テスト駆動型開発手法を用いた

Javaプログラミング学習システム

報 告 者

福 山 裕 輝

学籍番号:43422525

岡山大学大学院自然科学研究科電子情報システム工学専攻

(通信ネットワーク工学系)

平成 24年 2月 6日提出

指導教員 舩曵 信生 教授

Page 2: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

テスト駆動型開発手法を用いた

Javaプログラミング学習システム

要約

現在,Javaは様々な用途で用いられており,企業が提供するWebアプリケーション,社内シス

テムにも広く用いられている.そのため,Java言語を学習し,仕様通りにプログラムを作成する

ことは重要であり,学生時代から訓練すべき内容である.しかし,現状では通常一人の教員が,演

習等の課題において学生全員のプログラムを検証することは大きな負担となっている.

また,社会の IT 化の浸透にともない,システム障害やソフトウェアの不具合がもたらす経済的,

社会的効果は計り知れないものになっている.バグの混入したソフトウェアが出荷されるのを食

い止める最後の砦として,ソフトウェアテストの重要性が急速にクローズアップされている.そ

の中で,近年広まってきているソフトウェア開発手法の一つとして「テスト駆動型開発 (TDD)」

と呼ばれる手法がある.テスト駆動型開発手法では,先にテストプログラム (テストコード)を書

いた後に,目的のプログラムを書く.これより,テスト漏れを防止したり,仕様に従わない箇所が

明確になるという利点がある.加えて,従来に比べてバグの少ないソフトウェアを作ることが出

来る.

そこで本研究では,Web技術を用いた「テスト駆動型開発手法」に基づく,Javaプログラミン

グ学習システムを提案する.同時に,学生がテストコードを通じてソフトウェアテストに関する

理解を深めるために,テストコードを学生に作成させる,「テスト駆動型開発手法」の学習機能を

有する.

本システムは,Web技術を用いてプログラミング課題をオンライン化する.テスト駆動型開発

手法に基づき,解答プログラムで実装した機能をテストコードで検証する.そのため,教員は検

証するための模範解答コード,及びテストコードをを予め用意しておく.学生はプログラム作成

と,テスト駆動型開発手法をオンライン上で学習することが可能となる.またオンラインでプロ

グラム課題を管理することで,学生に即座に検証結果をフィードバックすることができ,教員の

評価にかかる負担も軽減する.

本システムは,Web サーバおよびサーブレットコンテナとしてTomcat 6.0.26,開発言語はサー

バサイド Java であるサーブレット/JSP,データベースにMySQL5,機能の検証には JUnitを利

用している.本システムの評価として,学生に拡張機能を使ってもらい,アンケートによる評価

を行った.その結果,学生は本システムを通じてプログラミング学習について理解が深まったこ

とが明らかとなった.また,テスト駆動型開発手法の学習機能は学生にとって,テストに関する

学習について有用であることがわかった.

今後の課題としては,ユーザインターフェースの改善や,長期的なシステム利用による評価が

挙げられる.

i

Page 3: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

Java Programming Learning Assistant System Using Test-Driven

Development Method

Abstract

Today, Java is used in various purposes. It is widely used in Web Applications provided

companies and corporate systems. Therefore, learning language Java and making programs as

specified is important for students and should be trained from university. However, it is a heavy

burden for one teacher to verify all student’s programs in exercises.

With penetrations of information technology into our society, system failures and software

troubles have great negative impacts on our economy and society. Then, the importance of the

software test has increased rapidly to avoid the shipment of software containing bugs. As a

result, the test-driven development (TDD) method becomes popular as an effective software test

method. In the TDD method, the test code should be first developed before the target code for

the system is developed. This test-code-first approach aims to avoid the leakage of test points in

the software test and to clarify the code parts that do not follow the specification. As a result,

the TDD method allows software engineers to develop source codes that have a smaller number

of bugs.

In this paper, we propose a Java Programming Learning Assistant System(JPLAS) using the

test-driven development method. In order for students to study tests through a test code, this

system have an educational function of TDD that students made to design the test code.

Based on TDD, this system checks student’s program whether this program fills the required

function using a test code. Therefore, the teacher has to prepare the test code, and the model

answer beforehand. Students can study making programs and TDD. Students can immediately

receives feedback and a teacher can become easy to evaluate programming assignment.

For evaluations of our system, we asked students to solve Java programming assignments

using the functions in the system, and to answer the questionnaire questions. The questionnaire

results show that our system is effective to improve the understanding of Java programming and

software tests among students.

Our future works include the improvement of user interfaces and evaluations by using system

for long-term.

ii

Page 4: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

関連発表論文リスト

• 福山裕輝,松島由紀子,舩曵信生,中西透,“テスト駆動開発手法による Javaプログラミ

ング教育支援システムの実用性向上”,第 11回 IEEE広島支部学生シンポジウム (HISS),

pp.302-303,Nov. 2009.

• 福山裕輝,舩曵信生,中西透,天野憲樹,“テスト駆動型開発手法の Javaプログラミング教

育応用におけるテストコード提出機能”,情報処理学会,CE103,Mar. 2010.

• 福山裕輝,舩曵信生,中西透,渡邊寛,天野憲樹,“テスト駆動型開発手法を用いた Javaプロ

グラミング学習システムでのコード検証方法の改善”,信学技報,ET2011,pp.13-18,Sep.

2011.

• 福山裕輝,舩曵信生,中西透,渡邊寛,天野憲樹,“テスト駆動型開発手法を用いた Javaプロ

グラミング学習システムでの誤りコード指示機能の実装”,信学技報,ET2012,Mar. 2012.

• Nobuo Funabiki, Toru Nakanishi, Noriki Amano, Hiroki Kawano, Yuuki Fukuyama, and

Megumi Isogai, ”A software architecture and characteristic functions in learning manage-

ment system ”NOBASU”,” The 10th Annual IEEE/IPSJ Symposium on Applications and

Internet (SAINT 2010), pp. 109-112, July 2010.

iii

Page 5: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

目 次

1 まえがき 1

2 前提となる技術 2

2.1 テスト駆動型開発手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.2 JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.3 JUnitにおけるテストコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.4 様々なテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.4.1 assertTrue,assertFalseによるテスト . . . . . . . . . . . . . . . . . . . . . . 4

2.4.2 assertNullによるテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.4.3 テストメソッドの一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Javaコード学習機能 7

3.1 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.2 誤りコード指示機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.2.1 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.2.2 テストコード上におけるハイライト機能 . . . . . . . . . . . . . . . . . . . 8

3.2.3 解答コード上におけるハイライト機能 . . . . . . . . . . . . . . . . . . . . 8

3.3 操作フロー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.3.1 教員による課題登録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.3.2 学生によるテストコード参照 . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.3.3 学生による解答コード作成・検証 . . . . . . . . . . . . . . . . . . . . . . . 10

3.3.4 学生による検証結果確認・プログラム修正 . . . . . . . . . . . . . . . . . . 10

3.3.5 学生による解答コード提出 . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 TDD学習機能 12

4.1 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4.2 カバレッジ測定機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4.2.1 Coberturaの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4.2.2 本システムでの適用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.3 操作フロー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.3.1 教員による課題登録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.3.2 学生によるテストコード提出 . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.3.3 学生による提出コードの検証 . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 評価 17

5.1 システム構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2 Javaコード学習機能の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2.1 評価方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2.2 評価結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.3 TDD学習機能の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5.3.1 評価方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5.3.2 評価結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

6 関連研究 20

iv

Page 6: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

7 むすび 22

謝辞 23

参考文献 24

v

Page 7: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

1 まえがき

現在,Java言語は様々な用途で用いられており,企業が提供するWebアプリケーション,社内

システムにも広く用いられている.そのため,Java言語を学習し,仕様通りにプログラムを作成

することは重要であり,学生時代から訓練すべき内容である.しかし,現状では通常一人の教員

が,演習等の課題において学生全員のプログラムを検証することは大きな負担となっている.

また,社会の IT 化の浸透にともない,システム障害やソフトウェアの不具合がもたらす経済

的,社会的効果は計り知れないものになっている.このような背景のもと,バグの混入したソフ

トウェアが出荷されるのを食い止める最後の砦として,ソフトウェアテストの重要性が急速にク

ローズアップされている.企業では,テストを確実にかつ効率的に行なうための開発手法を模索

している.

近年広まってきているソフトウェア開発手法の一つとして「テスト駆動型開発(TDD)」 [1]が

ある.通常の開発では,プログラムを書いた後にそれをテストするためのプログラムを書き,テ

ストするという方式を取るが,テスト駆動型開発では,先にテストプログラムを書き,そのテス

トをパスするように目的のプログラムを書くというアプローチである.こうすることにより,テ

スト忘れがなくなり仕様通りでない箇所がはっきりするという利点があり,従来に比べてバグの

少ないソフトウェアを作ることが出来る.

このように,仕様通りにプログラムを書くことは,学校でのプログラミング教育の段階で身に

つけるべきであり,テストを学ぶことは学生にとって有用であるといえる.そこで,本研究グルー

プではこれまで,学生の Javaプログラミング教育の支援,また教員の負担を軽減する目的として,

テスト駆動型開発手法による Javaプログラミング学習システムを提案してきた.本システムは,

教員が登録した課題,テストコードを仕様書として,学生が課題プログラムを作成し,オンライ

ンで検証するシステムである.

しかし,従来のシステムでは,Java初学者にとって,検証結果は理解しにくいものとなってい

た.現状では,プログラムの検証結果ログをそのまま表示するのみとなっており,学生にとって,

提出したプログラムの,どの部分が誤っているのか理解できないという問題点がある.また,従

来のシステムでは,学生は教員が登録したテストコードを仕様書として,課題を作成するだけで

あった.この方法では,学生は教員の示した仕様書としてテストコードを参照するのみであり,学

生のテストコードに関する知識を深めることは出来ないという問題点がある.

そこで,本研究では,まず Java初学者の学生向けとして,プログラム上で誤った箇所を指摘す

るガイダンス機能をシステムに対して実装を行う.次に,テストコードを学生に作成させること

による,「テスト駆動型開発手法」の学習支援機能を実装する.学生がテストコードを作成を経験

することによって,テストについての知識を深めることが可能となる.

本システムでは,ガイダンス機能では,学生は提出したプログラムに検証失敗が含まれている

場合,テストコード,及び解答コード上で,誤った箇所を視覚的に確認することができる.また,

TDD学習機能では,課題に解答する前に,教員によってあらかじめ登録されている名称リストを

参考に,学生が課題に対するテストコードを作成することによって,テスト駆動型開発手法につ

いて学習することができる.

本システムの評価として,実装された各機能を学生に使ってもらい,アンケートによるユーザ

ビリティ評価を行った.レベルを問わない Java経験者に対し,簡単なプログラミング課題を出題

し,解答してもらった.そしてアンケートをとった結果,本システムが学生のテストに関する学

習に役立つことを明らかにした.

本論文の章構成を以下に示す.まず,2章で前提となる技術を述べる.3章で Javaコード学習

機能について述べる.次に 4章でテスト駆動型開発手法学習機能について述べる.5章で評価と考

察を述べる.6章に関連研究を述べる.最後に 7章でむすびを述べる.

1

Page 8: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

2 前提となる技術

本章では,本研究の前提となるテスト駆動型開発手法,および,本研究で採用したそのツール

の 1つである JUnit[3]について述べる.

2.1 テスト駆動型開発手法

テスト駆動型開発手法では,プログラム(ソースコード)本体よりも先にテストケース(テス

トコード)を作成する.テストコードは,プログラムの仕様テストを行なうためのプログラムで

ある.この手法はテストファーストとも呼ばれ,多くのアジャイルソフトウェア開発手法 [4],例

えばエクストリームプログラミング [5]などにおいて,強く推奨されている.以下にテスト駆動型

開発の開発サイクルとその利点を示す.

TDDでの基本となる開発サイクルは以下となる.

1. テストコードを作成する

2. テストがパスするようにプログラム本体を作成する

3. 全てのテストがパスするまで,プログラムの修正とテスト 2.と 3.を繰り返す

TDDでの利点を以下に示す.

1. テストコードがドキュメントとしての役割も持つこと

テストコードには,テストすべきプログラムの仕様(機能)が全て網羅されていなければな

らない.すなわち,テストコードを見ればそのプログラムがどのような動きをするのかが分

かる.

2. 効率の良いテストが行えること

詳細な仕様の単位でテストが行えるため,効率の良いテストを行うことができる.

3. 改良 (リファクタリング)がしやすくなること

プログラムを改良した場合に,それが仕様を満たしているかどうかを機械的に判断させるこ

とが可能となり,リファクタリングにも役立つ.リファクタリングとは,プログラムの機能

を変更せずに,プログラムの内部構造を整理することである [6].

図 1: テスト駆動型開発手法のサイクル

2

Page 9: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

2.2 JUnit

本研究のシステムでは,学生から提出されたプログラム(解答コード)が,教員の要求する機

能(動作仕様)を満たしているか否かを,Javaプログラムのテストツールである JUnitを用いて,

自動検証する.JUnitは,Javaプログラム開発において,ソフトウェアをユニット単位で独立し

てテストを行なう,単体テスト自動化のためのツールである.ここで,Javaではクラス (class)が

ユニットに相当するため,ソースコード,テストコード共に,1つ以上のクラスとして構成する.

JUnitでは,テストコード(テストクラス)作成の支援,テスト実行,および,テスト結果表示

までを支援する.また,JUnitは,Javaでの開発に慣れたユーザには,自然に受け入れられるよ

うに設計されている.テストコードを記述するために多くの知識を習得する必要はなく,数個の

規則を学ぶだけで良い.そのため,JUnitを用いることで,保守性の高いテストコードを手軽に作

成できる.

2.3 JUnitにおけるテストコード

テストコードには JUnitのライブラリを使用する.以下で,簡単なテスト対象コード(Mathク

ラス)を例に,JUnitにおけるテストコードの記述方法を説明する.

• テスト対象コード

1: public class Math{

2: /*

3: 2つの引数を足した結果を返すメソッドを実装する

4: */

5: public int plus(int a, int b){

6: return( a + b );

7: }

8: }

上記のテスト対象コードMathクラスでは,2つの引数の足し算の結果を返す plusメソッドを実

装している.

• テストコード

1: import static org.junit.Assert.*;

2: import org.junit.Test;

3:

4: public class MathTest {

5:

6: //Mathクラスの plusメソッドをテストするメソッド

7: @Test

8: public void testPlus(){

9: Math ma = new Math();

10: int result = ma.plus( 1, 4 );

11: asserEquals(5, result);

12: }

13:}

3

Page 10: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

この例では,MathクラスのテストコードMathTestクラスを作成している.テストコードの 1,2

行目で,テストメソッドなどを含む JUnitの提供するパッケージをインポートしている.4行目で

テストクラスMathTestを宣言し,テスト対象のメソッドのテストを行うコードを記述する.

ここで,Mathクラスのテストクラス名をMathTest,plusメソッドのテストメソッド名を testPlus

とすることで,両者の対応関係を明示的にしている.また,テストメソッドは,1つのテストクラ

スに複数設定しても構わない.”@Test”をその直前の行に記述することで,直後のメソッドはテ

ストメソッドとして認識される.

この例では,plusメソッドのテストを以下の流れで行う.

1. Mathクラスのインスタンス”ma”を作成する

2. 作成したインスタンス”ma”の plusメソッドに引数”1”,”4”を与えて呼び出す

3. その結果取得した値が正しい値である”5”か否かを assertメソッドで比較する

JUnitでは,テスト結果が期待通りかどうかの判定は,assertメソッドを使用する.今回はその中

の assertEqualsメソッドでテスト結果を判定している.assertEqualsメソッドでは,2つの引数が

等しいかどうかを判断する.1つ目の引数は期待される結果 (期待値),2つ目の引数は実際の結果

(実行値)である.

JUnitでは,以上のようにテストコードを作成する.その際,assertメソッドの使い方次第で,

様々なテストを行うことが可能である.

2.4 様々なテスト

ここでは,assertEquals以外の様々なテスト方法の例を示す.

2.4.1 assertTrue,assertFalseによるテスト

「うるう年」かどうかを判定するメソッドのテストクラスを用いて,assertTrueによるテスト

を説明する.入力として与えられる西暦がうるう年か否かの判定には,以下の条件を用いる.

1. 西暦が 4で割り切れる.かつ,西暦が 100で割り切れない場合,その西暦はうるう年である.

2. 西暦が 400で割り切れる場合,その西暦はうるう年である.

3. 上記 1.2.を満たさない場合,その西暦はうるう年ではない.

図 2に,入力 (西暦)を与えたらその年がうるう年であるかどうかを判定し,真または偽を返

す,isLeapメソッドを持つクラスである,MyDayクラスのテストコードを示す.上述した条件よ

り,”2012”はうるう年と判定されるため,trueが返されることを期待し,”2013”はうるう年では

ないと判定されるため,falseが返されることを期待する.

4

Page 11: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

1: import static org.junit.Assert.*;

2: import org.junit.Test;

3:

4: public class MyDayTest {

5: /*

6: testIsLeapメソッドは MyDayクラスの isLeapメソッドをテストするメソッド

7: */

8: @Test

9: public void testIsLeap(){

10: MyDay md = new MyDay();

11: boolean trueresult = md.isLeap(2012);

12: boolean falseresult = md.isLeap(2013);

13: assertTrue(trueresult);

14: assertFalse(falseresult);

15: }

16:}

図 2: うるう年を判定するクラスMyDayのテストコード

入力された値がうるう年かどうかを検証するためには,メソッドの返り値が真であるかどうか

を判定する必要がある.図 2の 13行目で呼び出されている,assertTrueメソッドは,引数が真で

あるかどうかを判定する検証用メソッドである.図 2の 14行目で呼び出されている,assertFalse

メソッドは,引数が偽であるかどうかを判定する検証用メソッドである.

2.4.2 assertNullによるテスト

与えられれた西暦を元号に変換するメソッドのテストクラスを用いて,assertNullによるテスト

を説明する.図 3に,入力 (西暦)を与えたらその年の元号を出力し,明治以前に対応する西暦が

与えられた場合は nullを出力する eraNameメソッドを持つクラス,MyEraクラスのテストコー

ドを示す.

1: import static org.junit.Assert.*;

2: import org.junit.Test;

3:

4: public class MyEraTest{

5: /*

6: testEraNameメソッドは MyEraクラスの eraNameメソッドをテストするメソッド

7: eraNameメソッドは明治以前の西暦に対して nullを返すものとする

8: */

9: public void testEraName(){

10: MyEra me = new MyEra();

11: String h_result = me.eraName(2010);

12: String s_result = me.eraName(1967);

5

Page 12: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

13: String t_result = me.eraName(1918);

14: String m_result = me.eraName(1894);

15: String n_result = me.eraName(1866);

16: assertEquals("平成 22年",h_result);

17: assertEquals("昭和 42年",s_result);

18: assertEquals("大正 7年",t_result);

19: assertEquals("明治 27年",m_result);

20: assertNull(n_result);

21: }

22:}

図 3: 与えられた西暦の元号を返すクラスMyEraのテストコード

assertNullメソッドは,引数として入力された変数が nullか否かを判定する.nullであればテ

スト成功,nullでなければテスト失敗となる.図 3では,明治以降に対応する西暦が eraNameメ

ソッドに入力された場合,対応する元号が出力されているかどうかを assertEqualsメソッドで検

証し,明治以前に対応する西暦が入力された場合,assertNullメソッドによって出力が nullと一

致するかどうかを検証している.

2.4.3 テストメソッドの一覧

以上の他にも,JUnitには様々なテストを行なうテストメソッドが用意されている.表 1に,

JUnitに用意されている assertメソッドを示す.

表 1: JUnitに用意されているテストメソッド

メソッド名 説明

assertEquals(基本データ型 a, 基本データ型 b) 値 aと値 bが同値かを検証

assertTrue(boolean a) 値 aが trueかを検証

assertFalse(boolean a) 値 aが falseかを検証

assertNull(Object型 a) 値 aが nullかを検証

assertNotNull(Object型 a) 値 aが nullでないことを検証

assertSame(Object型 a, Object型 b) 値 aと値 bが同一かを検証

assertNotSame(Object型 a, Object型 b) 値 aと値 bが同一でないことを検証

fail() 強制的にテスト失敗

6

Page 13: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

3 Javaコード学習機能

本システムは Javaを学習する学生のレベルに合わせて,本章,及び 4章にて示す 2つの学習支

援機能を有する.本章では,1つ目の機能である Javaコード学習機能について述べる.

3.1 概要

本機能は,学生による Javaコード作成のセルフ学習の支援を目的とする.プログラミング課題

毎に,課題に加え,教員が予め登録したテストコードを学生に提示する.学生は提示されたテス

トコードを仕様として解答コードを作成する.

図 4: オンラインでのプログラム課題評価

教員は,Webブラウザを用いてプログラミング課題を登録する際,課題文,模範解答コード,テ

ストコードを登録する.学生には,その中で,課題文と,クラス名,メソッド名,引数タイプを

含む,解答コードの詳細な仕様書としてのテストコードが提示される.学生は,テストコードに

示されたクラス名,メソッド名,引数タイプを用いて,その全テスト項目をパスするように解答

コードを作成し,Webブラウザを用いて提出する.提出された解答コードの検証は,Webサーバ

上でオンラインで行われ,検証結果が即座に学生にフィードバックされる.これにより,教員に

負担を与えずに,学生は,正しい解答コードが作成できるまで,繰り返し,その過ちを指摘され

ながら,学習を行うことが可能となる.

3.2 誤りコード指示機能

Javaコード学習機能では,Java初学者を対象とした誤りコード指示機能を実装している.これ

は,学生が検証を失敗した際に,誤ったコードが記述されている箇所を指示する機能である.以

下,ガイダンス機能の詳細について述べる.

3.2.1 概要

本システムでは,JUnitを用いたコード検証に失敗した場合,学生に JUnitが出力する検証ロ

グをそのまま画面に表示している.しかし,Java初学者にとって検証ログの内容は理解しやすい

ものとは言えず,学生がどこを直してよいのかを把握できない可能性がある.そこで本研究では,

テストコード上における検証失敗箇所のハイライト化と,解答コード上の,誤ったコードが記述

7

Page 14: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

されている可能性のあるメソッドのハイライト化を行うことによって,学生へ視覚的に誤り箇所

を提示し,誤り修正を容易に行えるようサポートすることとした.本機能は,テストコード上に

おけるハイライト機能,解答コード上におけるハイライト機能の 2種類に分かれる.以下,各ハ

イライト機能の詳細について述べる.

3.2.2 テストコード上におけるハイライト機能

本機能はテストコード上において,検証が失敗した assertEqualsなどの検証用メソッドを赤色

でハイライトする.検証失敗となった検証用メソッドの特定には,JUnitによる検証ログを用い

る.図 5に,テストコード上でのハイライト例を示す.

図 5: テストコード上でのハイライト例

3.2.3 解答コード上におけるハイライト機能

本機能は解答コード上において,誤った処理を行っていると思われるメソッドの宣言部分を赤色

でハイライトとする.該当メソッドの特定には,JUnitによる検証ログ,解答コード,テストコー

ドを用いる.検証に失敗した検証用メソッドを含むテストメソッド内で実行されている解答コード

上のメソッドを検出し,解答コード上での宣言位置を特定した後,ハイライトを行っている.図 6

に,解答コード上でのハイライト例を示す.

3.3 操作フロー

本節では,Javaコード学習機能を利用する際の流れについて述べる.

8

Page 15: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

図 6: 解答コード上でのハイライト例

3.3.1 教員による課題登録

教員は,課題登録時に,課題文に加え,模範解答コード,テストコードを登録する.ここで,模

範解答コードは,本機能での解答コード検証には使用しないが,それを登録することでテストコー

ドの雛形が出力されるため,教員のテストコード作成の手間を軽減している.テストコードは,学

生が作成する解答コードの検証に用いるため,必須である.図 7に,教員の模範解答コードの例

を示す.

図 7: 教員が登録する模範解答コード

3.3.2 学生によるテストコード参照

学生には,本システムにアクセスした場合,本システムを利用する科目の一覧が表示される.そ

の中から解答する科目を選択すると,図 8に示すように,その科目の課題の一覧が表示される.そ

して,課題毎に,課題番号,課題文,提出状況が表示され,「解答」ボタンにより解答コードの作

成・提出を行うことができる.学生はまず,教員によって登録されたテストコードを参照する.テ

ストコードを参照することにより,学生は課題の仕様を読み取ることができ,その仕様を基にプ

ログラムを作成する.

9

Page 16: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

図 8: 課題一覧ページの例

3.3.3 学生による解答コード作成・検証

テストコードを仕様として解答コードを作成した後,提出ボタンにより提出する.サーバにお

いて解答コードの自動検証が行われ,検証結果ページへと遷移する.コンパイルエラー,実行時

例外が発生した場合,学生にコンパイルエラー,実行時例外のログが表示される.以下の図 9に,

検証結果ページの例を示す.

図 9: 検証結果ページの例

3.3.4 学生による検証結果確認・プログラム修正

学生によって提出されたプログラムが検証に失敗した場合,学生は検証結果ページより,図 10

に示すような誤り箇所指摘ページへ遷移することができる.誤り箇所指摘ページでは,ガイダン

10

Page 17: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

ス機能によってプログラムの誤り箇所がハイライトされている他,プログラムの編集画面へ遷移

することできる.

図 10: 誤り箇所指摘ページの例

3.3.5 学生による解答コード提出

学生は,検証結果ページ,または誤り箇所指摘ページからいつでもプログラムを提出すること

ができる.

11

Page 18: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

4 TDD学習機能

本章では,本システムのもう 1つの学習支援機能である,TDD学習機能について述べる.

4.1 概要

本機能は,学生によるテスト駆動型開発手法の自主学習支援を目的とする.教員が予め登録し

た課題に対し,学生がテストコード,解答コードの両方を作成する.そのため,本機能では,学生

の解答コードの正当性検証に加え,学生のテストコードの正当性検証も必要となる.

本機能では,後者は,学生のテストコードによる,教員の模範解答コード検証により実現する.

そのためには,学生のテストコードで使用するクラス,メソッドの構成を,模範解答コードのも

のと一致するように,予め学生に指示しておく必要がある.教員は,そのために必要な情報(名

称リストと呼んでいる)を,課題文,模範解答コード,テストコードと共に登録しておくことと

している.

図 11: 学生の作成したテストコードの検証

4.2 カバレッジ測定機能

現状のシステムでは,学生が作成するテストコードに,テストすべき課題の機能や仕様に漏れ

がある場合にも,それを見逃すと言った問題がある.現状,学生からのテストコードの検証は,教

員が登録した模範解答コードのテストに適用することで実施しているが,テストコードが模範解

答コードの全コードの検証(実行)を行っているか否かの判定は実施していない.そのため,こ

こでのテストが成功した場合にも,模範解答コードの全コードをテストしているとは限らず,結

果として,課題で要求されているすべての機能や仕様のテストが,テストコードに含まれている

とは言えない.

そこで本システムでは,学生が提出するテストコードにおけるテスト項目の漏れを検出するた

めに,コードカバレッジツールを導入した.以下,本システムで採用したコードカバレッジツー

ル,Coberturaについて述べ,本システムへの適用について述べる.

4.2.1 Coberturaの概要

本研究では,コードカバレッジツールとして,Cobertura[7]を採用した.Coberturaは,Javaプ

ログラムのテストを行う際に,テスト対象クラスのコードがどれだけ網羅的に実行されたかを解析

するツールである.解析結果には,テスト対象クラスで実行されたコードの割合を示す line-rate,

複数の処理に分岐する場合に分岐内の実行されたコードの割合を示す branch-rateなどが数値とし

て出力され,それぞれ 1.0に近ければ近いほど網羅性が高いということになる.また,解析結果

を XMLや HTML形式で出力することができ,特に HTML形式では視覚的に解析結果を閲覧す

12

Page 19: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

ることが可能である.以下の図 12に,HTML形式のカバレッジ出力結果の例を示す.図 12にお

いて,Packageテーブルの LineCoverageカラムは解答コード,テストコードを含んだ全カバレッ

ジ率を示している.Class in this Packageテーブルの LineCoverageカラムでは,解答コード,テ

ストコードそれぞれのカバレッジ率を示している.基本的にテストコードは分岐等を含まないた

め,解答コードに冗長なコードが含まれない限り,カバレッジ率は 100% となる.解答コードのカ

バレッジ率が 100% を下回っている場合,テスト項目に漏れがあると考えられる.

図 12: HTMLのカバレッジレポート出力

4.2.2 本システムでの適用

本節では,Coberturaの本システムでの適用方法について述べる.Coberturaは,JUnitでのプ

ログラム検証時に実行される.以下に,本システムでの Coberturaの適用について説明する.

• 教員の課題登録時への適用

本機能は,教員による模範解答コードとテストコード登録時に実行される.JUnitを用いて

それらの検証を行う際に,Coberturaによるカバレッジ測定を行う.これにより,教員によ

るミスのないコードの登録を支援する.

• 学生のテストコード提出時への適用

本機能は,TDD学習機能において,学生によるテストコード提出時に実行される.テスト

コード提出後,教員の模範解答コードによる検証を行う際に,Coberturaによるカバレッジ

測定を行う.カバレッジ測定結果は,コンパイル,テスト結果ページに併せて表示される.

以下の図 13に出力結果のページ例を示す.

カバレッジ測定結果の line-rateが 1.0となる場合,テストコードは解答コードを網羅的に実

行していると言える.そのため,テストがパスしたとしても,line-rateパラメータが 1.0未

満となる場合には,そのテストコードにテスト漏れがあることになる.その場合,「カバレッ

ジレポートを出力」ボタンを押すことで,図 12のような HTML形式の測定結果をダウン

ロードすることができる.但し,ここでは教員が登録したプログラムは閲覧できないように

設定している.

• 学生の解答コード検証時への適用

本機能は,TDD学習機能において,学生による解答コード提出時に実行される.TDD学習

機能では,解答コードに対して,学生のテストコード,教員のテストコードのそれぞれによ

るカバレッジ測定が実行されるため,2種類のカバレッジ測定結果が出力される.

13

Page 20: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

図 13: カバレッジ測定結果

4.3 操作フロー

本節では,TDD学習機能を利用する際の流れについて述べる.

4.3.1 教員による課題登録

教員は,課題登録時,課題文,模範解答コード,テストコードに加え,名称リストを登録する.

名称リストには,学生がテストコードを作成する際に必要となる模範解答コードのクラス名,メ

ソッド名,その引数の構成と戻り値の型を記述する.本システムでは,模範解答コードから名称

リストの雛形を自動作成することで,教員負荷を軽減している.図 14に,2値の加算を行なうク

ラスの模範解答コードと,作成される名称リストの雛形を示す.

図 14: 模範解答コードと名称リストの雛形

4.3.2 学生によるテストコード提出

学生には,Javaコード学習機能同様の画面が表示され,科目を選択できる.各課題では,「解答」

ボタンのほかに,「テスト作成」ボタンにより,テストコードの作成・提出を行うことができる.

14

Page 21: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

図 15にテストコードの作成・提出のための画面を示す.ここでは,課題文,名称リスト,解答

コード入力欄 (コードエディタ),解答コードファイルのアップロード欄が用意されている.解答

コードの提出方法には,コードエディタによるものと,予めローカル環境で作成した解答コード

ファイルのアップロードの 2 つの方法がある.コードエディタを使用する場合,学生は一連の作

業をWeb ブラウザのみで行うことができる.但し,コードエディタの機能は,eclipseなどの統合

開発環境に比べて機能が低いため,ローカル環境でそれを用いて解答コードを作成してから,そ

のファイルのアップロードを推奨している.

図 15: テストコード作成・提出画面

テストコードの作成・提出後,「テストコード実行」ボタンによりテストコードの検証が行なわ

れる.この学生のテストコードの検証は,教員の模範解答コードを検証することで行われる.教

員の模範解答コードが正しいことを前提として,検証に失敗した場合,学生のテストコードに不

備があると判断する.

図 16に示すように,検証結果として,テストコードのコンパイル結果,テスト結果,コーディ

ングルールチェック結果が表示される.検証結果が正しい,あるいは,これ以上の改善を諦めた場

合,「この内容で提出」ボタンを押すことでテストコード提出が完了する.但し,その後も,課題

の提出締め切りまでは再度編集して提出しなおすことが可能である.その後,解答コードの作成・

提出を行なう.

図 16: テストコード検証画面

15

Page 22: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

4.3.3 学生による提出コードの検証

学生の解答コードは,教員のテストコードと,その学生のテストコードの両方で検証する.こ

れにより,TDD手法で必要となるテストコードと解答コードの組合せを正しく作成していること

を検証する.ここで,教員のテストコードにより正しく検証された解答コードを,学生のテスト

コードが正しく検証した場合には,テストコードも正しい可能性が高いと言える.

16

Page 23: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

5 評価

本章では,今回実装したシステムの各機能を Javaプログラミングを学んでいる学生に実際に

使ってもらい,アンケートによる評価を行った.Javaコード学習機能では,プログラミング演習

による Java教育を受けている学部生 (42名)を対象として,学生機能の利用と 5段階評価を行い,

TDD学習機能では,Javaプログラミング経験のある,本グループ所属の研究室の学生 11名を対

象に,評価実験を行った.

5.1 システム構成

図 17 に,本システムのシステム構成を示す.また,表 2に,サーバ環境を示す.

本システムでは,サーバOSにUbuntu Server 10.04[10],Webサーバ兼アプリケーションサー

バに Tomca6.0.26[8]を使用している.サーバプログラムは Servlet/JSPを用いて記述している.

また,データベースにはMySQL5[9]を用いている.2章で述べたように,テスト実行ツールとし

て JUnitを用いている.これらは,すべてオープンソースソフトウェアである.クライアントは

Webブラウザを用いてサーバにアクセスし,本システムの機能を利用する.

図 17: システム構成

表 2: サーバ環境

CPU Intel Corei5 3.20GHz

メモリ 2GB

OS Ubuntu Server 10.04

Java 1.6.2

サーブレットコンテナ Tomcat6.0.26

データベース MySQL5.0.27

5.2 Javaコード学習機能の評価

5.2.1 評価方法

Javaコード学習機能の評価方法として,先に挙げた学生 42名を対象に,実際に行われているプ

ログラミング演習の開始 15分程度の間で,予め用意しておいた Javaプログラミング課題に解答

17

Page 24: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

し,5段階評価のアンケートに回答してもらった.学生 42名には,事前に前回,前々回の演習で

システムを利用してもらい,システムの利用について支援を行っている.出題した課題は,図形

の面積を計算するという,比較的簡単な問題を選択した.学生への誤りコード指示機能の有効性

を検証するため,学生毎にあらかじめ誤ったコードを提出済みとして登録しておき,誤りコード

指示機能を用いて修正する方法を用いて評価を行った.

表 3: アンケート項目 (5段階評価)

項目 内容

Q1 システムの一連の操作に問題はなかったか

Q2 本システムはプログラムの機能チェックに役立つと思うか

Q3 テストコードを読むことは仕様の理解に役立つと思うか

Q4 プログラムの提出から結果画面遷移までの時間は長かったか

Q5 誤った処理を行っているメソッド名の指摘はプログラムの修正に役立つと思うか

Q6 本システムを利用し,プログラミングに関する理解が少しでも深まったか

以下の表 4に,表 3のアンケートに対する学生の回答を示す.

表 4: アンケート結果 (5段階評価)

項目 1 2 3 4 5

Q1 使いにくい 1 14 13 8 6 問題ない

Q2 役立たない 0 9 17 9 7 役立つ

Q3 役立たない 0 9 19 10 4 役立つ

Q4 長かった 2 5 9 14 12 問題ない

Q5 役立たない 0 2 22 9 9 役立つ

Q6 深まらなかった 3 5 22 6 6 深まった

5.2.2 評価結果

上記に示した,アンケート結果に対する考察を述べる.

表 4において,Q1で 2以下と答えた学生,4以上と答えた学生の割合が同程度となっているこ

とがわかる.これは,使い易いと感じた学生がいた一方で,システムのエディタがHTML標準の

テキストフォームであるため使いづらい等といった理由から使いにくいと感じた学生もいたこと

が原因としてと考えられる.今後,学生にとって,より使い易いシステムとするため,Webベー

スのコードエディタの開発,導入が必要であると考えられる.

Q2,3,6では 4以上と回答した学生が多かった一方で,2以下と回答した学生も若干名いたこ

とがわかる.この結果より,JUnitを用いた検証を行う本システムは,学生の Java学習にとって

効果があると言えるが,全ての学生に役立つと感じてもらうためには,長い時間を設けて継続的

にシステムを利用するなど,システムに関する理解を深める機会を多く設ける必要があると考え

られる.

Q5で 4以上と回答した学生が,2以下と回答した学生に比べて多い結果となっていることがわ

かる.この結果より,本システムの学生への誤りコード指示機能は学生の Java学習において有用

18

Page 25: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

であると考えられる.

5.3 TDD学習機能の評価

5.3.1 評価方法

TDD学習機能の評価方法として,先に挙げた学生 11名を対象に,予め用意しておいた Javaプ

ログラミング課題に解答し,5段階評価のアンケートに回答してもらった.ここでは,int型配列

の最大値,最小値を取得するクラスといった,比較的簡単な問題を選択した.

表 5: アンケート項目 (5段階評価)

項目 内容

Q1 システムの一連の操作に問題はなかったか

Q2 テストコードの作成はプログラムの仕様理解に役立つか

Q3 プログラム提出から結果出力までの時間は長かったか

Q4 カバレッジ測定結果はテストコードの作成に役立つか

Q5 グラフィカルなカバレッジレポートは役立つと思うか

Q6 本システムを利用し,テストに対する理解が深まったか

表 6: アンケート結果(5段階評価)

項目 1 2 3 4 5

Q1 使い難い 0 4 2 2 3 使い易い

Q2 役立つと思わない 1 0 4 4 2 役立つと思う

Q3 長かった 1 2 3 1 4 問題ない

Q4 役立つと思わない 0 0 4 2 5 役立つと思う

Q5 役立つと思わない 0 1 3 5 2 役立つと思う

Q6 理解できない 0 0 3 6 2 理解が深まった

5.3.2 評価結果

上記に示した,アンケート結果に対する考察を述べる.

表 6において,Q4,5で半数の学生が 4以上と回答した.これは,テストコード作成段階で,そ

れによるテスト漏れを防止するためには,カバレッジ測定結果が有用と感じたためと考えられる.

これより,コードカバレッジツールの本システムへの導入は有用であると言える.

Q3で半数の学生が 3以下と回答した.これは,今回の実験で学生が解答コードを提出した際,

検証結果の出力までに 10秒近くかかることがあったためと思われる.これは,プログラムのコン

パイル,実行,検証の各ステップでの所要時間が 1秒未満であるのに対し,カバレッジツールの

実行時間が 10秒近くと,かなり長いことが原因であり,今後,サーバの分散処理などにより,レ

スポンスの向上が必要と言える.

Q6で半数以上の学生が 4以上と回答した.これにより,本機能は学生にとって,テストに関す

る学習について有用であることがわかった.

19

Page 26: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

6 関連研究

本章では,関連研究をいくつか紹介する.

• 失敗知識を利用したプログラミング学習環境の構築[12]

 「失敗から新たな知識を学ぶ」失敗学の概念をプログラミング教育に適用することを狙い

とした支援システムを提案し,学部 2,3年生 21名に対する評価実験を通じてその効果を示

している.本研究では,プログラミング教育における事象・概念を失敗学における失敗知識

に対応させている.具体的には,エラー(コンパイルエラー,実行エラー,論理エラー)を

「事象」,演習課題を「背景」,エラー発生時のソースプログラムを「経過」に対応させ,「原

因」,「対処」,「総括」は学習者に記述させることで失敗情報の知識化を行い,内省を支援す

る.つまり,本システムでは,エラー発生時のソース該当箇所の提示と,その原因や対処を

記入するメモ欄を実装しているのみである.そのため,エラー発生時に,学習者がその原因

や対処方法を文章として整理し,システムに記憶させる(メモを残す)ことに,本システム

の独自性があると言えるが,それだけのものである.通常のノートに記述することも可能で

あり,Webシステムとしての特徴,長所は活かせていない.各学習者に,それらをノートに

記載させるだけで,同様の効果が得られるものと思われる.また,論理エラーは学習者によ

る手入力のため,精度,手間の点で問題がある.実際,多くの学生は,演習課題に対して,

コンパイルエラー,実行エラーは 0とすることができるが,論理エラーを 0とすることに難

があるのが現状である.評価実験の事後テストにおいて,適用群と非適用群間に,正答率の

平均値に有意差がなく,標準偏差に有意差があると言っているのみである.すなわち,評価

も十分とは言えない.

• プログラミング演習における評価方法の改善[13]

 プログラミング演習における演習課題の評価を,学生自らコンパイル・実行すること,評

価者による口頭質問に回答することで行う.そのために,学生は,事前に授業支援システム

を用いてレポートを提出しておく,評価時には,学生が自らダウンロード,コンパイル・実

行,自動採点プログラム(Javaのリフレクションを採用)の実行によるテスト項目とテスト

結果(構成テスト,機能テスト)の表示,評価者による口頭質問に対するソースコードを用

いての回答の順で行う.評価実験では,アンケートでの 80%の学生が提案方式を支持,口

頭質問を入れることでのコピー防止などの結果が得られている.

本研究に対しては,テストコード,課題プログラムの検証結果に関する口頭試問の実施が挙

げられる.

• プログラミングレポート採点支援ツールと課題設計による評価方法の改善[14]

 プログラミングレポート採点作業の改善を目的として,プログラミングレポート採点支

援ツールを Javaで開発している.コンパイル・実行・閲覧・評価記録の同一画面での表示,

コード検査・テストプログラムのプラグイン可能,プログラミング言語非依存,評価記録を

元にした学生のグループ化可能の機能を有している.

本システムの問題点は,評価項目毎の評価結果はすべて手動で入力すること,個々のプログ

ラムを手動で実行する必要があることが挙げられる.本研究に対しては,テスト項目毎の検

証結果閲覧機能の実装が挙げられる.

• 個々の学習者の理解状況と学習意欲に合わせたプログラミング教育支援[15]

 プログラミング教育において,個々の学習者の理解度と意欲に応じた演習課題を出題する

手法を提案し,立命館大学での実際の開講科目への適用結果を示している.学習者の理解度

の評価は,演習課題の達成度に対する協調フィルタリングを用いる.協調フィルタリングは,

20

Page 27: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

Webサイト検索などで実用化されている,ユーザの傾向や嗜好を過去の行動で記録し,それ

を類似の行動を取るユーザの情報を元に,そのユーザの今後の傾向や嗜好を推測する手法で

ある.達成度は,課題毎に設定された 10~20個程度の評価観点に対して,重要度を 1~10

で設定し,それぞれに対して,「理解できている」,「どちらとも言えない」,「理解できていな

い」の 3段階で教員が主観的に評価を行った結果を,重みでの加重平均を取ることで算出す

る.意欲は,教員が課題毎に 3段階で主観的に行い,提出された課題での最低提出必要課題

数に関する平均値で評価する.

本手法の問題点は,まず,教員の負担が非常に大きいこと,公平性に問題があることである.

多数の学生からの多くの課題のそれぞれに対し,多数の評価観点からの評価は困難である.

評価の自動化,アルゴリズム化が不可欠である.また,多数の学生が課題の未提出となって

おり,推薦課題を提出したのは少数の元々意欲の高い学生と考えられることから,評価結果

の分析は正確ではない(提案手法の有効性は言えない)と思われる.但し,本研究に対して

は,学習者のプログラミング能力に関するプロファイルの作成と,それに基づいて,適切な

課題提示,個別指導が行える機能の実装が挙げられる.

• プログラミング教育における学習者に適応的な支援システムの推薦手法[16]

 プログラミング教育において,学習者を支援するシステムは数多く開発され,運用されて

いる.しかし,それらの支援システムを効率的に使用するためには,学習者の状態に対応し

た支援システムを推薦する必要がある.そこで,本論文では,学習者の状態と,プログラミ

ング教育と支援システムの分析を行なった結果をモデル化し,定義したそれぞれの情報に基

づく,支援システム推薦アルゴリズムを提案し,支援システム選出のための枠組みを示して

いる.

本研究に対しては,学生個人のプログラミング能力を定義し,情報をデータベースに登録す

ることで,レベルに応じた課題の提示機能の実装が挙げられる.

21

Page 28: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

7 むすび

本研究では,本研究グループがこれまで提案してきた,Javaプログラミング学習システムにお

いて, Java初学者に対する,プログラム上の誤り箇所を指摘するガイダンス機能,学生がテスト

コード作成を経験することによる,TDD学習機能を提案した.

今後の課題としては,ユーザインターフェースの改善,長期的なシステム利用による学生の理

解を支援があげられる.ユーザインターフェース改善に関しては,現在エディタとして利用して

いるHtml標準のテキストフォームを取りやめ,新たなコードエディタを採用,もしくは開発する

等,コードエディタの部分の利便性を向上させることが考えられる.長期的なシステム利用につ

いては,プログラミング演習などで継続してシステムを利用し,学生にシステムに対する理解を

深めてもらい,その上で評価するという点が考えられる.

22

Page 29: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

謝辞

本研究の全過程を通じて,御指導を賜りました舩曵信生教授に心より感謝いたします.

本研究を進めるにあたり,多岐にわたる御指導を賜りました岡山大学教育開発センターの天野

憲樹准教授に深く感謝致します.

本研究を進めるにあたり,評価へのご協力を頂いた野上保之准教授に深く感謝致します.

本研究を進めるにあたり,種々御助言頂きました中西透准教授,渡邊寛助教に心からお礼申し

上げます.

本研究のシステム評価に協力して頂いた通信ネットワーク工学科の学部生の皆様に深く感謝致

します.

最後に,種々ご協力と御助言頂いた分散システム構成学研究室の皆様に感謝致します.

23

Page 30: テスト駆動型開発手法を用いた Javaプログラミング学習システムdist/pdf/2011/2012_fukuyama.pdf · テスト駆動型開発手法を用いた Javaプログラミング学習システム

参考文献

[1] Kent Beck:テスト駆動型開発入門, 株式会社ピアソン・エデュケーション, 2003.

[2] 松島由紀子, 笠井康裕, 舩曵信生, 中西透, 天野憲樹, ”テスト駆動型開発手法による Javaプロ

グラミング教育支援システムの提案,” 信学技報, ET2009-8, pp.7-12, June. 2009.

[3] JUnit.org, http://www.junit.org/.

[4] アジャイルソフトウェア開発, http://www.atmarkit.co.jp/aig/04biz/asd.html.

[5] エクストリームプログラミング, http://www.atmarkit.co.jp/aig/04biz/xp.html.

[6] マーチン・ファウラー:リファクタリング―プログラミングの体質改善テクニック,株式会社

ピアソン・エデュケーション,2000.

[7] コードカバレッジツール Cobertura, http://cobertura.sourceforge.net/

[8] Apache Tomcat, http://tomcat.apache.org/

[9] MySQL , http://www.mysql.com/

[10] Ubuntu HomePage,http://www.ubuntu.com/

[11] Firefox,http://mozilla.jp/firefox/

[12] 知見邦彦, 櫨山淳雄, 宮寺庸造, “失敗知識を利用したプログラミング学習環境の構築,”信学

論D-I, vol.J88-D-I, no.2, pp.66-75, Feb. 2005.

[13] 松浦佐江子, “プログラミング演習における評価方法の改善,” IT活用教育方法研究, vol.8, no.1,

pp.51-55, Nov. 2006.

[14] 松浦佐江子, “プログラミングレポート採点支援ツールと課題設計による評価方法の改善,” IT

活用教育方法研究, vol. 9, no. 1, pp.36-40, Nov. 2006.

[15] 田口浩, 糸賀裕弥, 毛利公一, 山本哲男, 島川博光, “個々の学習者の理解状況と学習意欲に合

わせたプログラミング教育支援,” 情処論, Vol.48 No.2, pp.958-96, Feb. 2007.

[16] 山本耕大,中村勝一,森本康彦,横山節雄,宮寺庸造,“プログラミング教育における学習者

に適応的な支援システムの推薦手法” ET2009-82,pp.175-180,Dec.2009.

24