Siesta – No.2 アサーション
テストケースを記述していくときに、値を評価して、値が正であるか負であるかなどを判定していくために、アサーション用のメソッドが用意されています。 今回は、このアサーションメソッドについて、実際に利用しながら、1つずつ確認していきましょう。
まずは、Siesta.Test クラスに実装されているメソッド(正確には、mixinsも含む)について、使い方を見ていきましょう。
Ok アサーション
「No1. テスト環境の構築」でも利用しましたが、第1引数の値を評価してtrueの場合、正常とするokメソッド、逆にfalseの場合に、正常とするnotOkメソッドがあります。 両メソッドともに、第2引数にはメッセージを指定することができ、ハーネス内に表示されます。
010_ok_assertions.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 | StartTest(function(t) { t.diag("Ok アサーション"); t.ok(true, 'true is ok'); t.ok(1, '1 is ok'); t.ok({}, '{} is ok'); t.notOk(false, 'false is not ok'); t.notOk(0, '0 is not ok'); t.notOk(undefined, '`undefined` is not ok'); }); |
Is アサーション
isメソッドは、第1引数と、第2引数に指定された値を評価して、等しければ正常とするメソッドです。 またisntは、第1引数と、第2引数の値が等しくない場合、正常とするメソッドです。 isntは、isNotと表記しても大丈夫です。 isStrictとisntStrictは、Siestaの内部評価で===を利用して、型まで一致するか判定します。
011_is_assertions.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | StartTest(function(t) { t.diag("Is アサーション"); t.is(1, 1, '1 is 1'); t.is(1, "1", '1 is "1"'); t.isStrict(null, null, '型まで含めて等しい。'); t.is(null, undefined, 'null is undefined'); t.isnt(1, 2, "1 isn't 2"); t.isNot(1, 2, "1 isn't 2"); t.isntStrict(2, "2", '型まで含めて等しくない。'); // Siesta 2.0.2 でバグFixされています。 }); |
Like アサーション
likeメソッドは、第1引数に検査対象文字列、第2引数に正規表現オブジェクト、または文字列を指定します。 正規表現でマッチする場合は、正常とするメソッドです。その反対が、unlikeメソッドです。
012_like_assertions.t.js
1 2 3 4 5 6 7 8 9 10 11 | StartTest(function(t) { t.diag("Like アサーション"); t.like('Yo', /yo/i, '"Yo" は、"yo" にマッチします。') t.like('Yoda', 'Yo', '"Yoda" は "Yo" を含みます。') t.unlike('Yo', /yp/i, '"Yo"は、 "yp"にマッチしません。') t.unlike('Yoda', 'Yp', '"Yoda" は、"Yp"を含みません。') }); |
Throws / Lives アサーション
例外が発生し、likeメソッドと同じく正規表現で例外メッセージを判定するthrowsOkメソッド。 逆に例外が発生しないことを正とするlivesOkメソッド。
両メソッドとも、第1引数に施行する関数オブジェクトを設定します。
013_throws_lives_assertions.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 | StartTest(function(t) { t.diag("Throws / lives アサーション"); t.throwsOk(function () { throw "yo" }, /yo/, '例外発生、そしてメッセージに"yo"が含まれます。'); t.livesOk(function () { var a = 1 }, '例外は発生しませんでした。'); }); |
isDeeply アサーション
isDeeplyメソッドは、2つのオブジェクトの値を比較して検査します。 Siestaの内部評価では、==が利用されるため、1と’1’は等しいと判断されます。 型まで判定する必要がある場合は、isDeeplyStrictを利用してください。
014_isDeeply_assertions.t.js.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | StartTest(function(t) { t.diag("isDeeply アサーション"); t.isDeeply({ a : 1, b : 2 }, { a : '1', b : 2 }, '一致します。'); t.isDeeply({ a : 1, b : 2 }, { a : 1, b : 2 }, '一致します。'); t.isDeeplyStrict({ a : 1, b : 2 }, { a : 1, b : 2 }, '型まで含めて一致します。'); t.isDeeply({ a : 1, b : 2, c : { c1: 1, c2: 2 } }, { a : '1', b : 2, c : { c1: 1, c2: 2 } }, '一致します。'); }); |
診断メッセージ
diagに関しては、既に何度も利用していますが、それ以外にpassメソッド、failメソッドがあります。 passメソッドは、正常にテストが通過したときにメッセージを表示するために、faliは、その反対にテストに失敗したときのメッセージを表示するために利用します。
015_messages.t.js.t.js
1 2 3 4 5 6 7 | StartTest(function(t) { t.diag("診断メッセージ"); t.pass("通過メッセージ"); // t.fail("失敗メッセージ"); // 記述するとfailが+1されます。 }); |
TODO
todoメソッドは、現在エラーになることが意図的に分かっていながらも、後ほどプログラムを修正(またはテストケースを修正)し、残しておくことができるメソッドです。todo内に記載されているテストケースは、Siestaにより実行されますが、ハーネス上の表示では、緑色の表示になります。
テストケースをコメントアウトしておくわけでは無く、ちゃんと実行するが後で対処するべきものを忘れないようにするために利用します。
016_todo.t.js.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | StartTest(function(t) { var summator = function(a, b) { return a + b }; t.is(summator(1, 1), 2, '1 + 1 = 2'); t.is(summator(1, 10), 11, '1 + 10 = 11'); t.todo('型が違う場合の対処を行う', function(todo) { // 引数にtodoを指定し、tの代わりに利用することができます。 todo.throwsOk(function () { summator([], {}); }, 'Error', '型違いによる例外処理'); // 以下は、全て自動キャストされない todo.is(summator("1.1", "2.1"), 2.3, '文字列から数値へ自動キャストで計算されること #1'); todo.is(summator("1.1", 2.1), 2.3, '文字列から数値へ自動キャストで計算されること #2'); todo.is(summator(1.1, "2.1"), 2.3, '文字列から数値へ自動キャストで計算されること #3'); // 時々成功する(ここでは例で必ず成功するが) todo.is(summator(0, 1), 1, 'これらは、時々成功したり失敗したりする'); }); }); |
型判定
それぞれの型を判定するメソッドが用意されています。
017_type.t.js.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | StartTest(function(t) { // 配列チェック t.isArray([], '[]は、配列です。'); // 真偽値チェック t.isBoolean(true, 'trueは、真偽値です。'); // 日付型チェック t.isDate(new Date(), 'new Date()は、日付型です。'); // 日付比較 t.isDateEqual(new Date('2013/08/28'), new Date('2013/08/28'), "new Date('2013/08/28')と、new Date('2013/08/28')は同じ日付です。"); // 関数型チェック t.isFunction(function() {}, 'function() {}は、関数型です。'); // 数値型チェック t.isNumber(123, '123は数値型です。'); // オブジェクト型チェック t.isObject({}, '{}は、オブジェクトです。'); // 文字列型チェック t.isString('String', "'String'は、文字列型です。"); // RegExp型チェック t.isRegExp(/yo/i, "/yo/iは、RegExp型です。"); // おおよその数値比較 // Siesta 2.0.2 でバグFixされています。 t.isApprox(1, 1.05, '前後5%以内の範囲内で一致している。'); t.isApprox(1, 1.05, 0.05, '前後5%以内の範囲内で一致している。'); }); |
大小比較
2つの数値を比較するために、isGreater、isGreaterOrEqual、isLess、isLessOrEqualメソッドが用意されています。
018_greater_less.t.js.t.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | StartTest(function(t) { // value1 > value2 比較 t.isGreater(2, 1, '2は、1より大きい。'); // value1 >= value2 比較 t.isGreaterOrEqual(2, 1, '2は、1以上。#1'); t.isGreaterOrEqual(2, 2, '2は、1以上。#2'); // value1 < value2 比較 t.isLess(1, 2, '1は、2より小さい。'); // value1 <= value2 比較 t.isLessOrEqual(1, 2, '1は、2以下。#1'); t.isLessOrEqual(1, 2, '1は、2以下。#2'); }); |
まとめ
今回は、テストケースの中で、どのようなアサーションメソッドが利用できるかを、具体的なコードで確認してきました。このようにアサーションメソッドを利用して、単純に値を評価するだけであれば、Siestaでなくてもできます。Siestaには、単純なアサーション以外に、まだまだ機能が備わっています。
次回は、それらの機能を確認していきましょう。
今回、作成したテストケースは、下記URLで実行できるように設置してありますので、参考にしてください。
http://preview.xenophy.com/xenophy/senchaug/bryntum/siesta/no2/harness.html