gxpユニットテスト研修
DESCRIPTION
TRANSCRIPT
ユニットテスト研修
Copyright© 2010 Growth xPartners, Inc. All rights reserved.
2014/5/30
プログラミング、どうですか?
楽しい?
難しい?
1 Copyright© 2010 Growth xPartners, Inc. All rights reserved.
プログラミングについての俗言
「プログラムは思った通りに動かない。書いた通りに動く」
「バグのないプログラムはない」
2 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
情報システムの不具合が社会に影響を及ぼす例
3 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
http://www.yomiuri.co.jp/economy/20140430-OYT1T50142.html
情報システムの不具合が社会に影響を及ぼす例
4 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
http://sankei.jp.msn.com/world/news/140411/amr14041109000003-n1.htm
情報システムの不具合が社会に影響を及ぼす例
5 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
不具合とどう向き合うか
情報システムに不具合が内在するのは、プログラミングに限らず、システムに構築する過程に人間が介在する以上、避けられないこと。 •「プログラミングに不慣れだから」ではありません
お客様に責任を果たすために、構築したシステムの特性を評価し、お客様のビジネスにふさわしい品質かを評価する必要があります。
6 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
細かくチェックポイントを設ける
システムを組む都度都度において、細かくチェックポイントを設けます。
チェックポイントと、そこで行うテストのことを「ソフトウェアテスト」といいます。 •「全てのライフサイクルを通じて実施する静的、動的なプロセスにおいて、成果物が特定の要件を満足するかを判定し、目的に合致することを実証し、欠陥を見つけるため、ソフトウェアプロダクトや関連成果物に対し、計画、準備、評価をすること」
ソフトウェアテスト標準用語集 日本語版 Version 2.2.J01
http://jstqb.jp/dl/JSTQB-glossary.V2.2.J01.pdf
7 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
では、どうやって確認するか
みなさんが研修でやっていることと一緒です。 •テスト対象のプログラムを実行する。
•プログラムの実行結果を確認する。
8 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
例えば、閏年の判定
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;
}
テスト対象のプログラムを実行する。
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 + "年は閏年ではありません。");
}
}
プログラムの実行結果を確認する。
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 + "年は閏年ではありません。");
}
}
2つの問題点があります。
テストを1回だけでなく、毎回実行する必要がある •なんで?
「プログラムをいじってるうちに動かなくなった」(リグレッション)
「サーバーをバージョンアップしたら動かなくなった」
「特定のお客様の環境でだけ動かない」
12 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
現場のプロジェクトでは、何回くらいテストを実行しているのかというと....
13 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
実プロジェクトでは、実行するテストの総数が4桁になるのは普通
毎回mainメソッドを実行するのは大変
14 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
もう一つの問題点
毎回実行結果を目で見て確認するのは大変
15 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
定型作業は自動化作業
繰り返し行う作業はコンピュータに任せることで、人間はより創造的な作業ができるようになります。
16 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
ユニットテスト
テスト実行の自動化 •いわば、「自動化されたデバッグ」
•JavaではJUnitというツールが主流
• .net開発ではNUnitやMSTestというツールを使います。
•JUnitの知名度が一番高いことから、総称してxUnitと呼びます。
17 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
何ができるか
テスト実行の自動化
結果の判定の自動化
18 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
テスト実行の自動化
決まったフォーマットでテストを記述すると、テストを自動的に実行してくれる
19 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
@Test
public void _4で割り切れる場合は閏年() {
boolean result = LeapYear.isLeapYear(2012);
assertThat(result, is(true));
}
判定の自動化
決まったフォーマットで記述すると、テスト結果を自動的に判定してくれる(アサーション)
20 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
@Test
public void _4で割り切れる場合は閏年() {
boolean result = LeapYear.isLeapYear(2012);
assertThat(result, is(true));
}
テストに合格(成功)した例(グリーンバー)
21 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
テストに不合格(失敗)した例(レッドバー)
22 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
失敗した内容の出力
23 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
よくある誤解
「なにもしなくても自動でテストしてくれる」ではありません!
「テストコード」を自分で書く必要があります。
24 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
それでは、その「テストコード」の書き方を学んでいきましょう
25 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
JUnitについて
26 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
テストを書きたいクラスを選択します
27 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
テストクラスを作成する
28 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
「File」→「New」→「Junit Test Case」
29 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
そのまま「Finish」
30 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
そのまま「OK」
こうなるはず
31 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
1行追加します(説明は後述)
32 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
メソッドを書き直します
33 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
実行します。結果は...?
34 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
※Quick Junit というプラグインを入れると、 Ctrl + 0 で実行が出来るようになります。
それでは解説
35 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
クラス名
36 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
① クラス名は、テスト対象のクラス名 + 「Test」とするのが慣習です。
テストメソッド
37 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
②@Test という印(アノテーション)をつけたメソッドが、テストとして扱われます。
テストメソッドの規則
38 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
③ メソッドは public かつ void で、引数を持たないメソッドである必要があります。 メソッド名はJavaのメソッド名として有効であれば制限はありませんが、テストする内容がわかりやすいメソッド名にしましょう。
39 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
④ assertThatメソッドでメソッドの実行結果を確認します。 第1引数にメソッドの実行結果(actual)、第2引数のis()の中にメソッドの期待値(expected)を書きます。 左から並べた時に assert that result is true (結果が真であることを表明する)というように、英語でそのまま読むことができるようになっています。
40 Copyright© 2013 Growth xPartners, Inc. All rights reserved. 40 Copyright© 2013 Growth xPartners, Inc. All rights reserved.
④ この部分は、JUnitが用意している assertThat メソッドと isメソッドを使えるようにするための宣言です。
アサーションのバリエーション
値が○○でない 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.
実習
配布しているサンプルを参考に、年が100で割り切れる場合は閏年になることを確認するテストを書いてみましょう。
他、メソッドの仕様(JavaDoc)に従い、必要なテストケースを考えて、テストを書いてみましょう。
これまで演習でやってきた中で書いてきたテストを、JUnitによるテストに書き換えてみましょう。
42 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
43 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
ネクストステップ
44 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
リファクタリング
テストによって安全網(テストハーネス)を作ることにより、テストを安全に、改善していくことができます。このことをリファクタリングといいます。
45 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
例えば
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.
JUnitについて学びたくなったら
47 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
ソフトウェアテストについて学ぼう
48 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
さいごに
テスティングはバージョン管理、自動化とならんで、現代ソフトウェア開発の三本柱です。
コードを書こう。そして、優れたコードを読もう。
Enjoy Testing!
49 Copyright© 2014 Growth xPartners, Inc. All rights reserved.
CONFIDENTIAL
●本文書は、グロースエクスパートナーズ株式会社が著作権その他の権利を有する営業秘密(含サプライヤー等第三者が権利を有するもの)です。 ●当社の許可なく複製し利用すること、また漏洩することは「著作権法」「不正競争防止法」によって禁じられております。 ●本資料内の社名・製品名は各社の登録商標です。
50 Copyright© 2014 Growth xPartners, Inc. All rights reserved.