Testingの前の辺   @kuchitama
テスト• 不変で純粋な(副作用の無い)関数• シンプルでテストしやすい
Mock• Clojureだとわりと不要• 不変コレクションやレコードは、シン プルなのでモックデータはいらないこ とが多い
でもMockりたいとき• with-redefs• 既に束縛されたvarを一時的に置き換え•(def	 i	 1)•(with-redefs	 [i	 3]	 i) ‣  3•i	  ‣ 	 1 ←元に戻ってる
アサーション• clojure/testのisマクロを利用 -   (is (論理式) “アサーションメッセージ”)
is Sample•   (require ‘clojure/test)•   (is (= 1 2) “one is not two”)    ‣   FAIL in clojure.lang.PersistentList$EmptyList...
Error/Excptionの検査• thrown? フォーム• 第2引数の関数が第1引数で指定した throwableをthrowすればtrueを返す• (thrown? (検出するthrowableクラス) (検 査関数))
thrown? sample (1/2)• (is (thrown? ArithmeticException (/ 1 0))) ‣ #<ArithmeticException    java.lang.ArithmeticException:...
thrown? sample (2/2)• (is (thrown-with-msg? ArithmeticException  #"zero" (/ 1 0))) ‣ #<ArithmeticException    java.lang.Ar...
test suite• deftestで一連のテストをまとめて定義可 能→名前を付けれる• deftestで定義したtest suiteのmeta情報 は:testに格納される
deftest sample•   (deftest test-foo2    (is (= 1 1) "one is not onw")    (is (= 1 2) "one is not two"))     ‣   #user/test...
with-test• プロダクトコードとテストコードをひ とまとまりに定義出来る• プロダクトコードとして、テストとして それぞれで実行出来る• ただし、テストコードの分までメモリ を圧迫するので注意
with-testサンプル(1/2)•       (with-test          (defn hello [name]              (str "Hello, " name))          (is (= hello ...
with-testサンプル(2/2)•       (with-test          (defn hello [name]              (str "Hello, " name))          (is (= hello ...
Fixtures(1/2)• JUnitの@Before/@After 的なことを実現 するテクニック• 関数を引数にとるメソッドを定義して、 事前条件と事後条件でくるむ
Fixtures(2/2)• こんなかんじ• (deftest hoge [f]    ((before)     (f)      (after)))
Fixturesサンプル• (defn fixtures-test [f]     (let [n 3]        (f n)))• (fixtures-test #(* % 2))   ‣6
Upcoming SlideShare
Loading in...5
×

Clojrue 13 testing

375

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
375
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Clojrue 13 testing

    1. 1. Testingの前の辺 @kuchitama
    2. 2. テスト• 不変で純粋な(副作用の無い)関数• シンプルでテストしやすい
    3. 3. Mock• Clojureだとわりと不要• 不変コレクションやレコードは、シン プルなのでモックデータはいらないこ とが多い
    4. 4. でもMockりたいとき• with-redefs• 既に束縛されたvarを一時的に置き換え•(def i 1)•(with-redefs [i 3] i) ‣ 3•i ‣ 1 ←元に戻ってる
    5. 5. アサーション• clojure/testのisマクロを利用 - (is (論理式) “アサーションメッセージ”)
    6. 6. is Sample• (require ‘clojure/test)• (is (= 1 2) “one is not two”) ‣ FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:17) ‣ one is not two ←アサーションメッセージ ‣ expected: (= 1 2) ‣ actual: (not (= 1 2)) ‣ false
    7. 7. Error/Excptionの検査• thrown? フォーム• 第2引数の関数が第1引数で指定した throwableをthrowすればtrueを返す• (thrown? (検出するthrowableクラス) (検 査関数))
    8. 8. thrown? sample (1/2)• (is (thrown? ArithmeticException (/ 1 0))) ‣ #<ArithmeticException java.lang.ArithmeticException: Divide by zero>
    9. 9. thrown? sample (2/2)• (is (thrown-with-msg? ArithmeticException #"zero" (/ 1 0))) ‣ #<ArithmeticException java.lang.ArithmeticException: Divide by zero>• 第2引数に正規表現を指定すると、エ ラーのメッセージにその表現が含まれ るかどうかまでテスト可能
    10. 10. test suite• deftestで一連のテストをまとめて定義可 能→名前を付けれる• deftestで定義したtest suiteのmeta情報 は:testに格納される
    11. 11. deftest sample• (deftest test-foo2 (is (= 1 1) "one is not onw") (is (= 1 2) "one is not two")) ‣ #user/test-foo2• ((:test (meta #test-foo2))) ‣ FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:27) ‣ one is not two ‣ expected: (= 1 2) ‣ actual: (not (= 1 2)) ‣ false
    12. 12. with-test• プロダクトコードとテストコードをひ とまとまりに定義出来る• プロダクトコードとして、テストとして それぞれで実行出来る• ただし、テストコードの分までメモリ を圧迫するので注意
    13. 13. with-testサンプル(1/2)• (with-test (defn hello [name] (str "Hello, " name)) (is (= hello "Brian") "Hello, Brian") (is (= (hello "Boo") "Hello, Foo" ) "hogehoge") ) ‣ #user/hello • (run-tests) ‣ Testing user ‣ FAIL in (hello) (NO_SOURCE_FILE:32) ‣ Hello, Brian ‣ expected: (= hello "Brian") ‣ actual: (not (= #<user$eval56$hello__57 user $eval56$hello__57@23de4dd8> "Brian"))
    14. 14. with-testサンプル(2/2)• (with-test (defn hello [name] (str "Hello, " name)) (is (= hello "Brian") "Hello, Brian") (is (= (hello "Boo") "Hello, Foo" ) "hogehoge") ) ‣ #user/hello • (run-tests) ‣ Testing user ‣ FAIL in (hello) (NO_SOURCE_FILE:32) ‣ Hello, Brian ‣ expected: (= hello "Brian") ‣ actual: (not (= #<user$eval56$hello__57 user $eval56$hello__57@23de4dd8> "Brian"))
    15. 15. Fixtures(1/2)• JUnitの@Before/@After 的なことを実現 するテクニック• 関数を引数にとるメソッドを定義して、 事前条件と事後条件でくるむ
    16. 16. Fixtures(2/2)• こんなかんじ• (deftest hoge [f] ((before) (f) (after)))
    17. 17. Fixturesサンプル• (defn fixtures-test [f] (let [n 3] (f n)))• (fixtures-test #(* % 2)) ‣6
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×