WEBVTT

00:00:00.520 --> 00:00:04.840 align:middle
こんにちは、今回は Pharo の
sUnit テストフレームワークでの

00:00:05.000 --> 00:00:08.720 align:middle
ユニットテストを見てみましょう。

00:00:08.880 --> 00:00:13.200 align:middle
テストフレームワークはアジャイル開発を
支援するために使われます。

00:00:13.360 --> 00:00:16.560 align:middle
インクリメンタルな開発をして

00:00:16.720 --> 00:00:18.720 align:middle
定期的にコードをテストして

00:00:18.880 --> 00:00:23.240 align:middle
コードの修正でコードに求められる特性や
不変条件を壊していないかを確認します。

00:00:23.400 --> 00:00:25.240 align:middle
変化に備えるということです。

00:00:25.400 --> 00:00:28.160 align:middle
コードを修正したらテストを書いて

00:00:28.320 --> 00:00:30.520 align:middle
テストを再実行することで

00:00:30.680 --> 00:00:33.680 align:middle
どこか壊してしまったり、変えてはいけない
部分を変えてしまっていないかチェックします。

00:00:33.880 --> 00:00:38.520 align:middle
自動化されたテストはこの種のプログラミング
を支援する上でとても重要です。

00:00:38.680 --> 00:00:42.680 align:middle
sUnit フレームワークはテストを書くための
特別なフレームワークです。

00:00:42.840 --> 00:00:46.400 align:middle
sUnit は 4 つのクラスで実装されています。
とてもシンプルです。

00:00:46.560 --> 00:00:48.960 align:middle
sUnit は最初、ケント・ベックによって
開発されました。

00:00:49.120 --> 00:00:52.960 align:middle
そして他の言語の数々のテストフレームワーク
を生むきっかけになりました。

00:00:53.120 --> 00:00:55.040 align:middle
例えば、JUnitもその1つです。

00:00:55.840 --> 00:00:57.440 align:middle
では、テストとは何でしょう？

00:00:57.600 --> 00:01:00.080 align:middle
テストを書くには 3 段階があります。

00:01:00.240 --> 00:01:04.960 align:middle
第 1 段階では、コンテキストを作ります。
例えば、空集合です。

00:01:05.120 --> 00:01:07.480 align:middle
第 2 段階では、刺激を作ります。

00:01:07.640 --> 00:01:11.960 align:middle
ここでは、さきほど作った集合に

00:01:12.120 --> 00:01:14.840 align:middle
同じ要素を 2 度追加しようとしています。

00:01:15.000 --> 00:01:18.760 align:middle
そして第 3 段階では
得られた結果をテストして

00:01:18.920 --> 00:01:23.160 align:middle
この集合が要素を 1 つだけ含んでいる
ことを確かめます。

00:01:23.320 --> 00:01:26.960 align:middle
集合オブジェクトは同じ要素を 1 つしか
持つことができません。

00:01:27.120 --> 00:01:28.680 align:middle
同じ要素は 2 つ持てないのです。

00:01:28.840 --> 00:01:32.520 align:middle
なので、結果をテストして
不変条件が破られていないことを確認します。

00:01:33.120 --> 00:01:35.320 align:middle
テストを書く例題です。

00:01:35.480 --> 00:01:40.760 align:middle
TestCase のサブクラスを書きます。
ここでは SetTestCase です。

00:01:40.920 --> 00:01:44.480 align:middle
集合をテストするものです。
testAdd メソッドを定義します。

00:01:44.640 --> 00:01:47.240 align:middle
テストメソッドの名前は test で始まります。

00:01:47.400 --> 00:01:48.960 align:middle
まず、コンテキストを設定します。

00:01:49.120 --> 00:01:52.200 align:middle
Set クラスのインスタンスを作ります。
空集合です。

00:01:52.360 --> 00:01:55.840 align:middle
同じ要素を

00:01:56.000 --> 00:01:59.240 align:middle
2 回追加します。

00:01:59.400 --> 00:02:03.360 align:middle
5 を 2 回。
ここと、ここで。

00:02:03.520 --> 00:02:06.000 align:middle
そしてチェックします。

00:02:06.160 --> 00:02:08.600 align:middle
チェックには assert: を使います。

00:02:09.920 --> 00:02:12.840 align:middle
集合のサイズが

00:02:13.000 --> 00:02:16.480 align:middle
1 であれば、テストは成功です。
要素が 1 つだけ追加されたということです。

00:02:16.640 --> 00:02:19.320 align:middle
この式を使って

00:02:20.720 --> 00:02:24.280 align:middle
テストを実行することができます。
このテストで条件が守られているかを

00:02:24.440 --> 00:02:28.760 align:middle
つまり assert: の式が true であるか
テストします。

00:02:29.560 --> 00:02:30.880 align:middle
名前が test で始まるメソッドは

00:02:31.080 --> 00:02:34.960 align:middle
テストであることを表します。

00:02:35.120 --> 00:02:39.640 align:middle
そしてそれらはテストランナーというツールで
自動的に実行されます。

00:02:40.440 --> 00:02:44.480 align:middle
全ての結果を見ることができます。
テストメソッドの全ての実行の

00:02:44.640 --> 00:02:48.040 align:middle
結果が集計されて

00:02:48.200 --> 00:02:52.560 align:middle
TestResult クラスのインスタンスに
集約されます。

00:02:54.120 --> 00:02:55.760 align:middle
別の例をお見せします。

00:02:55.920 --> 00:02:59.920 align:middle
この例では、名前が test で始まる
テストメソッドがあります。

00:03:00.080 --> 00:03:03.560 align:middle
これがメソッド名ですが

00:03:03.720 --> 00:03:07.240 align:middle
testAdjacentRunsWithEqualsAttributesAreMerged

00:03:07.400 --> 00:03:12.960 align:middle
ここにコンテキストがあります。
オブジェクトを作ります。

00:03:13.120 --> 00:03:14.720 align:middle
ここに刺激があります。

00:03:14.880 --> 00:03:18.640 align:middle
addLast:times: メッセージを

00:03:18.800 --> 00:03:22.760 align:middle
3 回送ろうとしています。
1 回目はここにあります。

00:03:22.920 --> 00:03:26.880 align:middle
2 回目がここにあり

00:03:27.040 --> 00:03:28.640 align:middle
3 回目は 2 回目と同じです。

00:03:28.800 --> 00:03:31.560 align:middle
ここでテストします。

00:03:31.720 --> 00:03:35.760 align:middle
要素数が 2 であることを確認します。
いいですか？

00:03:35.960 --> 00:03:40.960 align:middle
同じ要素を 2 回続けて追加する
ことはできませんでした。

00:03:41.720 --> 00:03:46.320 align:middle
テストを実行する上で
いくつかのシナリオがありえます。

00:03:46.640 --> 00:03:50.720 align:middle
1 つ目のシナリオは「失敗」です。

00:03:50.880 --> 00:03:53.720 align:middle
つまり、表明（assert:）のどれかが

00:03:53.880 --> 00:03:56.560 align:middle
false の場合です。

00:03:56.720 --> 00:04:01.560 align:middle
そういう場合には「失敗」になります。

00:04:01.720 --> 00:04:03.600 align:middle
それは予期された問題です。

00:04:03.760 --> 00:04:09.240 align:middle
潜在的にそういうことが起こり得ると
予期しているわけです。

00:04:09.600 --> 00:04:13.160 align:middle
そして「エラー」があります。
これはチェックしようとしていたものではなく

00:04:13.320 --> 00:04:17.240 align:middle
何かが起こってしまった場合です。
テストを書いた時には

00:04:17.400 --> 00:04:20.480 align:middle
想定していなかった
例外が発生した場合などです。

00:04:20.640 --> 00:04:22.480 align:middle
これらの 2 つのものは別々のものです。

00:04:23.120 --> 00:04:27.640 align:middle
あるコードが例外を発生させることを

00:04:28.480 --> 00:04:32.000 align:middle
確認するためのテストは
どう書くのでしょう？

00:04:32.160 --> 00:04:36.680 align:middle
例えば、
Set new remove: 1 をテストしたい時

00:04:36.840 --> 00:04:40.120 align:middle
このコードは NotFound 例外を
挙げるでしょう。

00:04:40.280 --> 00:04:42.520 align:middle
Set new は空集合なので

00:04:42.680 --> 00:04:44.640 align:middle
そこから要素を取り出すことは

00:04:44.800 --> 00:04:47.600 align:middle
無理です。
NotFound 例外が挙がることになります。

00:04:47.760 --> 00:04:50.800 align:middle
これをテストするには
should:raise: を使います。

00:04:50.960 --> 00:04:53.600 align:middle
ブロックを渡して
そのブロックの実行中に

00:04:53.760 --> 00:04:55.240 align:middle
例外が挙がるかを確認します。

00:04:55.400 --> 00:04:59.440 align:middle
この場合、例外は NotFound です。
このテストはグリーンです。OK です。

00:05:00.920 --> 00:05:02.280 align:middle
反対のことをテストすることもできます。

00:05:02.440 --> 00:05:04.680 align:middle
あるコードが例外を挙げないことを
確認します。

00:05:04.840 --> 00:05:08.440 align:middle
この場合
self shouldnt:raise: を使います。

00:05:08.600 --> 00:05:12.880 align:middle
つまり、このコードは NotFound 例外を
挙げないことを確認します。

00:05:14.000 --> 00:05:16.960 align:middle
テストを沢山書いていると

00:05:17.120 --> 00:05:19.480 align:middle
テストのコンテキストに

00:05:19.640 --> 00:05:21.600 align:middle
沢山の重複ができることがあります。

00:05:21.920 --> 00:05:23.880 align:middle
例えば
ここで集合について

00:05:24.040 --> 00:05:26.120 align:middle
もう 1 つテストを書きます。
testOccurrences です。

00:05:26.280 --> 00:05:31.800 align:middle
するとコンテキストで
空集合をまた作ろうとしています。

00:05:31.960 --> 00:05:35.120 align:middle
テストを書くたびに

00:05:35.280 --> 00:05:37.880 align:middle
テストのコンテキストで
Set new を書くことになります。

00:05:38.040 --> 00:05:41.920 align:middle
毎回毎回この行を繰り返したくはありません。

00:05:42.080 --> 00:05:45.120 align:middle
繰り返さないためには

00:05:45.280 --> 00:05:48.080 align:middle
それを括り出してしまえば解決します。

00:05:48.240 --> 00:05:52.280 align:middle
sUnit では setUp メソッドに

00:05:52.440 --> 00:05:57.160 align:middle
テストを実行する前の全ての初期化を
括り出します。

00:05:57.320 --> 00:05:59.680 align:middle
こうすることで

00:05:59.840 --> 00:06:02.280 align:middle
テストを実行する直前に

00:06:02.440 --> 00:06:05.560 align:middle
つまり test で始まるメソッドを
実行する直前に

00:06:05.720 --> 00:06:08.760 align:middle
setUp メソッドを実行します。

00:06:08.960 --> 00:06:11.200 align:middle
その setUp メソッドの中で
コンテキストを書きます。

00:06:11.360 --> 00:06:15.320 align:middle
テストを通して刺激や

00:06:15.480 --> 00:06:17.280 align:middle
チェック、つまり表明をして

00:06:17.440 --> 00:06:20.200 align:middle
テスト実行の最後で

00:06:20.360 --> 00:06:22.360 align:middle
テストが成功であろうが失敗であろうが

00:06:22.520 --> 00:06:24.880 align:middle
tearDown メソッドを実行します。

00:06:25.040 --> 00:06:26.960 align:middle
tearDown メソッドで全ての

00:06:27.120 --> 00:06:29.520 align:middle
解放すべきリソースをきれいにします。

00:06:29.680 --> 00:06:33.360 align:middle
複数のテストメソッドの実行は簡単です。

00:06:33.520 --> 00:06:35.400 align:middle
まず setUp の実行があり

00:06:35.560 --> 00:06:37.720 align:middle
最初のテストメソッドが実行されて

00:06:37.880 --> 00:06:41.360 align:middle
tearDown を実行して片付けます。
そして新しい setUp の実行があり

00:06:41.520 --> 00:06:44.720 align:middle
新しいテストが実行され
tearDown、setUp

00:06:44.880 --> 00:06:47.760 align:middle
テストの実行、そして tearDown
という具合です。

00:06:47.920 --> 00:06:50.960 align:middle
こうすることでコンテキストの実装と
リソースの片付けを

00:06:51.120 --> 00:06:55.040 align:middle
setUp と tearDown の
2 つのメソッドに括り出すことができます。

00:06:56.240 --> 00:06:58.560 align:middle
どんな風になるでしょうか？

00:06:58.720 --> 00:07:01.440 align:middle
SetTestCase の例では

00:07:01.600 --> 00:07:04.640 align:middle
setUp メソッドを定義して

00:07:04.800 --> 00:07:07.320 align:middle
そこで
empty := Set new とします。

00:07:07.480 --> 00:07:11.840 align:middle
つまり empty は SetTestCase の
インスタンス変数になります。

00:07:12.520 --> 00:07:14.560 align:middle
そしてテストメソッドの中では

00:07:14.720 --> 00:07:18.080 align:middle
すぐにインスタンス変数 empty を
使うことができます。

00:07:18.240 --> 00:07:21.880 align:middle
testOccurrence を実行する前に
setUp メソッドが実行されるので

00:07:22.040 --> 00:07:26.800 align:middle
empty は既に正しく初期化されています。

00:07:29.680 --> 00:07:33.040 align:middle
sUnit のコアのクラス構成を見ると

00:07:33.200 --> 00:07:37.600 align:middle
クラスが 4 つしかありません。

00:07:37.760 --> 00:07:41.440 align:middle
1 つは TestCase です。
TestCase は単に

00:07:41.600 --> 00:07:43.560 align:middle
あるコンテキストにおいて

00:07:43.720 --> 00:07:47.000 align:middle
条件を満たすかどうかを検証するものです。
各 TestCase は

00:07:47.960 --> 00:07:50.280 align:middle
setUp メソッドと
tearDown メソッドと

00:07:50.440 --> 00:07:52.840 align:middle
一連のテストメソッドを持っています。

00:07:53.000 --> 00:07:57.480 align:middle
実際に TestCase の新しいサブクラスを
書くことになります。

00:07:57.640 --> 00:08:00.520 align:middle
それらのテストケースは

00:08:00.680 --> 00:08:05.080 align:middle
TestSuite に併せられます。

00:08:05.240 --> 00:08:08.560 align:middle
そして一揃いのテストの実行を行います。

00:08:08.720 --> 00:08:11.640 align:middle
一揃いの実行をすると、結果が得られます。

00:08:11.800 --> 00:08:16.040 align:middle
その結果は TestResult のインスタンスで

00:08:16.200 --> 00:08:19.120 align:middle
何個のテストが合格して

00:08:19.280 --> 00:08:22.800 align:middle
何個のテストが実行されて

00:08:23.480 --> 00:08:26.240 align:middle
何個のテストが失敗やエラーとなったか
を持っています。

00:08:27.160 --> 00:08:29.560 align:middle
TestResource というものもあります。

00:08:29.720 --> 00:08:33.960 align:middle
TestResource は TestSuite で使う
リソースを定義します。

00:08:36.040 --> 00:08:39.760 align:middle
TestCaseの各サブクラス は
1 つのテストを表して

00:08:39.920 --> 00:08:44.040 align:middle
その test で始まるメソッドが
1 つのテストを表します。

00:08:45.360 --> 00:08:47.360 align:middle
TestSuite は一連のテストで

00:08:47.520 --> 00:08:52.320 align:middle
そのテストケースのテストメソッドから成ります。

00:08:52.480 --> 00:08:56.880 align:middle
TestResult は複数のテスト実行の結果で

00:08:58.160 --> 00:09:02.040 align:middle
TestResource は

00:09:02.600 --> 00:09:05.120 align:middle
一連のリソースの初期化をします。

00:09:05.280 --> 00:09:07.520 align:middle
その初期化というのは通常は

00:09:07.680 --> 00:09:10.280 align:middle
一連のテストで1度だけ初期化したい
リソースの初期化です。

00:09:10.440 --> 00:09:14.400 align:middle
TestResource がリソースを 1 度初期化して
沢山のテストを実行して

00:09:14.560 --> 00:09:17.440 align:middle
そして最後に解放します。

00:09:17.640 --> 00:09:20.320 align:middle
今回学んだことは

00:09:20.800 --> 00:09:24.520 align:middle
テストの書き方です。
テストを書くのはとても単純です。

00:09:24.680 --> 00:09:27.480 align:middle
TestCase クラスのサブクラスを書いて

00:09:27.640 --> 00:09:31.240 align:middle
test で始まるメソッドを定義します。

00:09:31.400 --> 00:09:33.440 align:middle
そこにコンテキストの設定を書いて

00:09:33.600 --> 00:09:36.960 align:middle
刺激を与え、表明を検査します。

00:09:37.800 --> 00:09:39.720 align:middle
コンテキストを再利用するには

00:09:39.880 --> 00:09:42.240 align:middle
複数のテストメソッドから

00:09:42.400 --> 00:09:45.640 align:middle
setUp メソッドに括り出すことで
おこないます。

00:09:47.000 --> 00:09:52.080 align:middle
まとめると、今回は
sUnit テストフレームワークを見ました。

00:09:52.240 --> 00:09:54.360 align:middle
とても簡単に使うことができ

00:09:54.520 --> 00:09:57.560 align:middle
アジャイル開発を開始する上で
とても効率的です。

00:09:57.720 --> 00:10:01.520 align:middle
sUnit を使うよう、強く勧めます。
テストはとても簡単に定義できます。

00:10:01.680 --> 00:10:04.840 align:middle
sUnit を使うことで
1 つのテストを作ったら

00:10:05.000 --> 00:10:10.400 align:middle
百万回それを実行できます。
どこかコードを修正した時に

00:10:10.560 --> 00:10:13.360 align:middle
コードがまだ正常に動くことを
とても手軽に検査することができます。

00:10:13.520 --> 00:10:16.640 align:middle
テストを最新に保つことで

00:10:16.800 --> 00:10:20.720 align:middle
もしどこか壊れても
それを即座に発見できます。

00:10:20.880 --> 00:10:25.320 align:middle
さらに他のフレームワークで
テストを書くこともできます。

00:10:25.480 --> 00:10:28.640 align:middle
例えば BabyMock のような
Mock フレームワークなど

00:10:28.840 --> 00:10:33.440 align:middle
異なるスタイルのテスト手法があります。

00:10:34.480 --> 00:10:38.720 align:middle
プログラムを書く時には沢山のテストを
書くことを強くお勧めします。

