gxpユニットテスト研修

51
ユニットテスト研修 Copyright© 2010 Growth xPartners, Inc. All rights reserved. 2014/5/30

Upload: growth-xpartners-incorporated

Post on 27-Dec-2014

182 views

Category:

Business


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: GxPユニットテスト研修

ユニットテスト研修

Copyright© 2010 Growth xPartners, Inc. All rights reserved.

2014/5/30

Page 2: GxPユニットテスト研修

プログラミング、どうですか?

楽しい?

難しい?

1 Copyright© 2010 Growth xPartners, Inc. All rights reserved.

Page 3: GxPユニットテスト研修

プログラミングについての俗言

「プログラムは思った通りに動かない。書いた通りに動く」

「バグのないプログラムはない」

2 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 4: GxPユニットテスト研修

情報システムの不具合が社会に影響を及ぼす例

3 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

http://www.yomiuri.co.jp/economy/20140430-OYT1T50142.html

Page 5: GxPユニットテスト研修

情報システムの不具合が社会に影響を及ぼす例

4 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

http://sankei.jp.msn.com/world/news/140411/amr14041109000003-n1.htm

Page 6: GxPユニットテスト研修

情報システムの不具合が社会に影響を及ぼす例

5 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 7: GxPユニットテスト研修

不具合とどう向き合うか

情報システムに不具合が内在するのは、プログラミングに限らず、システムに構築する過程に人間が介在する以上、避けられないこと。 •「プログラミングに不慣れだから」ではありません

お客様に責任を果たすために、構築したシステムの特性を評価し、お客様のビジネスにふさわしい品質かを評価する必要があります。

6 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 8: GxPユニットテスト研修

細かくチェックポイントを設ける

システムを組む都度都度において、細かくチェックポイントを設けます。

チェックポイントと、そこで行うテストのことを「ソフトウェアテスト」といいます。 •「全てのライフサイクルを通じて実施する静的、動的なプロセスにおいて、成果物が特定の要件を満足するかを判定し、目的に合致することを実証し、欠陥を見つけるため、ソフトウェアプロダクトや関連成果物に対し、計画、準備、評価をすること」

ソフトウェアテスト標準用語集 日本語版 Version 2.2.J01

http://jstqb.jp/dl/JSTQB-glossary.V2.2.J01.pdf

7 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 9: GxPユニットテスト研修

では、どうやって確認するか

みなさんが研修でやっていることと一緒です。 •テスト対象のプログラムを実行する。

•プログラムの実行結果を確認する。

8 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 10: GxPユニットテスト研修

例えば、閏年の判定

9 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

/**

* 引数で渡された年度が閏年かを判定します。

* <ul>

* <li>西暦年が4で割り切れる年は閏年</li>

* <li>ただし、西暦年が100で割り切れる年は平年</li>

* <li>ただし、西暦年が400で割り切れる年は閏年</li>

* </ul>

*

* @param year 判定する年度

* @return 閏年の場合は{@code true}

*/

public static boolean isLeapYear(int year) {

if (year % 4 == 0) {

if (year % 100 == 0) {

if (year % 400 == 0) {

return true;

}

return false;

}

return true;

}

return false;

}

Page 11: GxPユニットテスト研修

テスト対象のプログラムを実行する。

10 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

public static void main(String[] args) {

int year = 2014;

boolean result = LeapYear.isLeapYear(year);

if (result){

System.out.println(year + "年は閏年です。");

} else {

System.out.println(year + "年は閏年ではありません。");

}

}

Page 12: GxPユニットテスト研修

プログラムの実行結果を確認する。

11 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

public static void main(String[] args) {

int year = 2014;

boolean result = LeapYear.isLeapYear(year);

if (result){

System.out.println(year + "年は閏年です。");

} else {

System.out.println(year + "年は閏年ではありません。");

}

}

Page 13: GxPユニットテスト研修

2つの問題点があります。

テストを1回だけでなく、毎回実行する必要がある •なんで?

「プログラムをいじってるうちに動かなくなった」(リグレッション)

「サーバーをバージョンアップしたら動かなくなった」

「特定のお客様の環境でだけ動かない」

12 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 14: GxPユニットテスト研修

現場のプロジェクトでは、何回くらいテストを実行しているのかというと....

13 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 15: GxPユニットテスト研修

実プロジェクトでは、実行するテストの総数が4桁になるのは普通

毎回mainメソッドを実行するのは大変

14 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 16: GxPユニットテスト研修

もう一つの問題点

毎回実行結果を目で見て確認するのは大変

15 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 17: GxPユニットテスト研修

定型作業は自動化作業

繰り返し行う作業はコンピュータに任せることで、人間はより創造的な作業ができるようになります。

16 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 18: GxPユニットテスト研修

ユニットテスト

テスト実行の自動化 •いわば、「自動化されたデバッグ」

•JavaではJUnitというツールが主流

• .net開発ではNUnitやMSTestというツールを使います。

•JUnitの知名度が一番高いことから、総称してxUnitと呼びます。

17 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 19: GxPユニットテスト研修

何ができるか

テスト実行の自動化

結果の判定の自動化

18 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 20: GxPユニットテスト研修

テスト実行の自動化

決まったフォーマットでテストを記述すると、テストを自動的に実行してくれる

19 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

@Test

public void _4で割り切れる場合は閏年() {

boolean result = LeapYear.isLeapYear(2012);

assertThat(result, is(true));

}

Page 21: GxPユニットテスト研修

判定の自動化

決まったフォーマットで記述すると、テスト結果を自動的に判定してくれる(アサーション)

20 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

@Test

public void _4で割り切れる場合は閏年() {

boolean result = LeapYear.isLeapYear(2012);

assertThat(result, is(true));

}

Page 22: GxPユニットテスト研修

テストに合格(成功)した例(グリーンバー)

21 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 23: GxPユニットテスト研修

テストに不合格(失敗)した例(レッドバー)

22 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 24: GxPユニットテスト研修

失敗した内容の出力

23 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 25: GxPユニットテスト研修

よくある誤解

「なにもしなくても自動でテストしてくれる」ではありません!

「テストコード」を自分で書く必要があります。

24 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 26: GxPユニットテスト研修

それでは、その「テストコード」の書き方を学んでいきましょう

25 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 27: GxPユニットテスト研修

JUnitについて

26 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 28: GxPユニットテスト研修

テストを書きたいクラスを選択します

27 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 29: GxPユニットテスト研修

テストクラスを作成する

28 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

「File」→「New」→「Junit Test Case」

Page 30: GxPユニットテスト研修

29 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

そのまま「Finish」

Page 31: GxPユニットテスト研修

30 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

そのまま「OK」

Page 32: GxPユニットテスト研修

こうなるはず

31 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 33: GxPユニットテスト研修

1行追加します(説明は後述)

32 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 34: GxPユニットテスト研修

メソッドを書き直します

33 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 35: GxPユニットテスト研修

実行します。結果は...?

34 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

※Quick Junit というプラグインを入れると、 Ctrl + 0 で実行が出来るようになります。

Page 36: GxPユニットテスト研修

それでは解説

35 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 37: GxPユニットテスト研修

クラス名

36 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

① クラス名は、テスト対象のクラス名 + 「Test」とするのが慣習です。

Page 38: GxPユニットテスト研修

テストメソッド

37 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

②@Test という印(アノテーション)をつけたメソッドが、テストとして扱われます。

Page 39: GxPユニットテスト研修

テストメソッドの規則

38 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

③ メソッドは public かつ void で、引数を持たないメソッドである必要があります。 メソッド名はJavaのメソッド名として有効であれば制限はありませんが、テストする内容がわかりやすいメソッド名にしましょう。

Page 40: GxPユニットテスト研修

39 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

④ assertThatメソッドでメソッドの実行結果を確認します。 第1引数にメソッドの実行結果(actual)、第2引数のis()の中にメソッドの期待値(expected)を書きます。 左から並べた時に assert that result is true (結果が真であることを表明する)というように、英語でそのまま読むことができるようになっています。

Page 41: GxPユニットテスト研修

40 Copyright© 2013 Growth xPartners, Inc. All rights reserved. 40 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

④ この部分は、JUnitが用意している assertThat メソッドと isメソッドを使えるようにするための宣言です。

Page 42: GxPユニットテスト研修

アサーションのバリエーション

値が○○でない assertThat(str, is(not("fuga")));

値がnullである assertThat(str, is(nullValue()));

値がnullではない assertThat(str, is(not(nullValue())));

41 Copyright© 2013 Growth xPartners, Inc. All rights reserved.

Page 43: GxPユニットテスト研修

実習

配布しているサンプルを参考に、年が100で割り切れる場合は閏年になることを確認するテストを書いてみましょう。

他、メソッドの仕様(JavaDoc)に従い、必要なテストケースを考えて、テストを書いてみましょう。

これまで演習でやってきた中で書いてきたテストを、JUnitによるテストに書き換えてみましょう。

42 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 44: GxPユニットテスト研修

43 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 45: GxPユニットテスト研修

ネクストステップ

44 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 46: GxPユニットテスト研修

リファクタリング

テストによって安全網(テストハーネス)を作ることにより、テストを安全に、改善していくことができます。このことをリファクタリングといいます。

45 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 47: GxPユニットテスト研修

例えば

return (( year % 4 ) == 0 && ( year % 100 ) != 0) || ( year % 400 ) == 0;

GregorianCalendar cal = new GregorianCalendar();

return cal.isLeapYear(year);

46 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 48: GxPユニットテスト研修

JUnitについて学びたくなったら

47 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 49: GxPユニットテスト研修

ソフトウェアテストについて学ぼう

48 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 50: GxPユニットテスト研修

さいごに

テスティングはバージョン管理、自動化とならんで、現代ソフトウェア開発の三本柱です。

コードを書こう。そして、優れたコードを読もう。

Enjoy Testing!

49 Copyright© 2014 Growth xPartners, Inc. All rights reserved.

Page 51: GxPユニットテスト研修

CONFIDENTIAL

●本文書は、グロースエクスパートナーズ株式会社が著作権その他の権利を有する営業秘密(含サプライヤー等第三者が権利を有するもの)です。 ●当社の許可なく複製し利用すること、また漏洩することは「著作権法」「不正競争防止法」によって禁じられております。 ●本資料内の社名・製品名は各社の登録商標です。

50 Copyright© 2014 Growth xPartners, Inc. All rights reserved.