Skip to content

Instantly share code, notes, and snippets.

@shibukawa
Created February 9, 2013 18:22
Show Gist options
  • Save shibukawa/4746430 to your computer and use it in GitHub Desktop.
Save shibukawa/4746430 to your computer and use it in GitHub Desktop.
JSX new test-case.jsx feedback
今回はsetUpでエラーを起こしてみたのですが、ok扱いになってしまっていますね。これはngにしたほうがいいと思います。
同じ例外のメッセージが3回でていますが、最後のだけでいいかな、と思います。
スタックトレースも、多くの人はテスティングフレームワーク自身の部分には興味が無いと思うので、at TestCase.run$SF$V$以下の5行は抹消してもいいかも。
----
$ ./bin/jsx --add-search-path ./oktavia/lib --test ./oktavia/test/test_fm_index.jsx
1..22
not ok 1 - test_sizefailed with exception: [oktavia/lib/wavelet_matrix.jsx:70:45] null access
this._bv[depth].set(range_tmp[key as string], bit);
^
# Error: [oktavia/lib/wavelet_matrix.jsx:70:45] null access
# this._bv[depth].set(range_tmp[key as string], bit);
# ^
#
# Error: [oktavia/lib/wavelet_matrix.jsx:70:45] null access
# this._bv[depth].set(range_tmp[key as string], bit);
# ^
#
# at /private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:2150:12
# at WaveletMatrix.build$S (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:2153:5)
# at FMIndex.build$SIB (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:1544:11)
# at FMIndex.build$SI (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:1508:7)
# at TestCase._Test.setUp$ (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:660:10)
# at TestCase.run$SF$V$ (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:179:8)
# at JSX.runTests (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:3393:14)
# at Object.JSX.runTests (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:3398:4)
# at /private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:3404:5
# at Object.<anonymous> (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_fm_index.jsx.69252.13cc01adf60.js:3405:3)
1..0
ok 1 - test_size
Failureは、ユーザが指定したテストケースとの差分なので、詳細なスタックトレース(Error以降)はなくてもいいかと思います。スタックトレース中にユーザコードは最後のところしかないので、ここはjavascriptではなくて、JSXの行番号がわかると良いと思います。こんな感じはどうでしょうか。
# position: test_bit_vector.jsx:test_rank:55
# comparing with ==
# got: 2
# expected: 1
not ok 4 - test_rankfailed with exception
----
[09:57:32 yshibukawa@unknowne4ce8f157a58 (git:master) ~/develop/JSX_pull_request]
$ ./bin/jsx --add-search-path ./oktavia/lib --test ./oktavia/test/test_bit_vector.jsx
1..8
ok 1
ok 2
ok 3
ok 4
1..4
ok 1 - test_size
ok 1
ok 2
ok 3
ok 4
ok 5
ok 6
ok 7
ok 8
ok 9
ok 10
ok 11
ok 12
1..12
ok 2 - test_get
ok 1
ok 2
not ok 3
# comparing with ==
# got: 2
# expected: 1
not ok 4 - test_rankfailed with exception
# Error
# Error
# at /private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_bit_vector.jsx.69304.13cc01c0a8f.js:838:25
# at Object.<anonymous> (/private/var/folders/bw/7q92pn9s1m344dqf0tqnjq9r000_4n/T/test_bit_vector.jsx.69304.13cc01c0a8f.js:2049:3)
# at Module._compile (module.js:449:26)
# at Object.Module._extensions..js (module.js:467:10)
# at Module.load (module.js:356:32)
# at Function.Module._load (module.js:312:12)
# at Module.require (module.js:362:17)
# at require (module.js:378:17)
# at eval (eval at <anonymous> (/Users/yshibukawa/develop/JSX_pull_request/bin/jsx:294:14))
# at node.require$S (/Users/yshibukawa/develop/JSX_pull_request/bin/jsx:294:9)
1..3
not ok 3 - test_rank
@gfx
Copy link

gfx commented Feb 10, 2013

jsx/JSX@5ab6f5b...530cef2 で対応してみました。

  • setUp()でpassになるのは単にバグでした。これはテストケースのバグなので例外をcatchすらせず異常終了になります(tearDown()も同様)
  • 同じ例外メッセージが3度出るのはバグなので直しました。テストランナーの(prove)の都合上2回はだします
  • TestCaseのスタックトレースをなくすのはできなくはないですが、これはしょうがないのかなと。見せ方はもっと工夫してもいいかもしれないですが、JS/JSXにスタックトレースの明確な仕様がそもそも存在していないのですよね…
  • JSXのソース箇所を出せればいいというのはそのとおりで、--enable-source-map付きだったら変換するとかしたいですね。しかし今回はパス

@shibukawa
Copy link
Author

僕は1ファイルずつしかテストを実行したこと無いですが、JSXって複数のファイルのテストを実行する機能ってないんでしたっけ?test.jsxからすべてのテストをimportするとかしてみましたが、実行されませんでしたが・・・

もし複数テストができる/将来的にやる可能性があるなら、setUp()/tearDown()の例外はキャッチすべきかと思います。今回のテスト用に意図的に混入させたバグも、部品(bit_vector)のテストでは「テスト失敗」になるけど、それを使っているモジュール(fm_index)はsetUpでそれを使っていて、それが原因でsetUpが失敗、というシチュエーションです。完全に失敗させてしまう&bit_vectorの方が後で実行されるとなると、エラーの原因を隠してわかりにくくしてしまう可能性があるかな、と思います。

もし複数テストに対応しないのであれば、今のままでも十分かと思います。

スタックトレースの行番号が変換後のJSであっても、関数名とエラーメッセージでだいたいは分かると思うので、かなり使いやすくなったと思います。

@gfx
Copy link

gfx commented Feb 11, 2013

複数ファイルのテストはprove(1)で行なっているのですが、JSXコアでサポートするつもりはありません。
proveはPerl用のテストランナーなのですが、こんな感じの .proverc を定義したらあとは prove を起動するだけでJSXのテストができます。並列実行(-j4など; ただし新しめのバージョンが必要)やok行のtrimも行なってくれるので便利ですよ。

https://github.com/gfx/mizuki/blob/master/.proverc

@shibukawa
Copy link
Author

了解です!それなら問題ないと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment