OUnitの結果をHTMLに

30分プログラム、その557。OUnitの結果をHTMLしてみる。
OUnitは便利なんだけど、結果の出力がテキストだけなので、ちょっとさみしい。JUnitみたいな感じでカラフルに表示して欲しい。
というわけで、テキストじゃなくてHTMLで結果を出力するようにしてみた。

次は、TkでGUI版を作りたいなぁ。

使い方

(* テストの書き方は従来通り *)
let tests = "List" >::: [
  "length(ok)" >:: (fun () ->
		      assert_equal 3 (List.length [1;1;1]));
  "length(ng)" >:: (fun () ->
		      assert_equal 3 (List.length [1;1]))
]

(* HTMLで出力 *)
let _ =
  run_test_html tests;;

ソースコード

#useとかを使っているので、ocamlコマンドで動かしてください。

#use "topfind";;
#require "oUnit";;

open OUnit;;

let run_test_html tests =
  let _ =
    print_endline "<html>";
    print_endline "<head><style>";
    print_endline ".success{background-color:green;}";
    print_endline ".failure{background-color:yellow;}";
    print_endline ".error{background-color:red;}";
    print_endline "</style></head>";
    print_endline "<body><h1>OUnit result</h1><table>" in
  let r =
    perform_test
      (function
	   EResult (RSuccess path) ->
	     Printf.printf
	       "<tr class=\"success\"><td>%s</td><td>Success</td></tr>\n"
	       (string_of_path path)
	 | EResult (RFailure (path,msg)) ->
	     Printf.printf
	       "<tr class=\"failure\"><td>%s</td><td>%s</td></tr>\n"
	       (string_of_path path)
	       msg
	 | EResult (RError (path,msg)) ->
	     Printf.printf
	       "<tr class=\"error\"><td>%s</td><td>%s</td></tr>\n"
	       (string_of_path path)
	       msg
	 | _ ->
	     ()) tests in
    print_endline "</table></body></html>";
    r

let tests = "List" >::: [
  "length(ok)" >:: (fun () ->
		      assert_equal 3 (List.length [1;1;1]));
  "length(ng)" >:: (fun () ->
		      assert_equal 3 (List.length [1;1]))
]

let _ =
  run_test_html tests;;