package junit_alcotest

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file junit_alcotest.ml

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
module A = Alcotest

external reraise : exn -> 'a = "%reraise"

type exit = unit -> unit

let push l v = l := v :: !l

let wrap_test ?classname handle_result (name, s, test) =
  let classname =
    (* The 'classname' attribute may not be empty, and should contain a period
       for best rendering in Jenkins by junit-plugin.
       For example, classname="foo.bar.baz" is rendered as a package "foo.bar"
       containing a class "baz" containing one or more test cases with their
       own name. *)
    match classname with
    | None | Some "" -> name
    | Some path -> path
  in
  let test () =
    try
      test ();
      Junit.Testcase.pass ~name ~classname ~time:0. |> handle_result
    with
    | Failure exn_msg as exn ->
      Junit.Testcase.failure
        ~name
        ~classname
        ~time:0.
        ~typ:"not expected result"
        ~message:"test failed"
        exn_msg
      |> handle_result;
      reraise exn
    | Alcotest_engine.V1.Core.Skip as exn ->
      Junit.Testcase.skipped ~name ~classname ~time:0. |> handle_result;
      reraise exn
    | exn ->
      let exn_msg = Printexc.to_string exn in
      Junit.Testcase.error
        ~name
        ~classname
        ~time:0.
        ~typ:"exception raised"
        ~message:"test crashed"
        exn_msg
      |> handle_result;
      reraise exn
  in
  name, s, test
;;

let run_and_report
      ?stdout
      ?stderr
      ?(and_exit = true)
      ?verbose
      ?compact
      ?tail_errors
      ?quick_only
      ?show_errors
      ?json
      ?filter
      ?log_dir
      ?bail
      ?record_backtrace
      ?ci
      ?package
      ?timestamp
      ?argv
      name
      tests
  =
  let testcases = ref [] in
  let testsuite = Junit.Testsuite.make ?package ?timestamp ~name () in
  let tests =
    List.map
      (fun (title, test_set) ->
         let classname = Printf.sprintf "%s.%s" name title in
         title, List.map (wrap_test ~classname (push testcases)) test_set)
      tests
  in
  let exit =
    try
      A.run
        ?stdout
        ?stderr
        ?verbose
        ?compact
        ?tail_errors
        ?quick_only
        ?show_errors
        ?json
        ?filter
        ?log_dir
        ?bail
        ?record_backtrace
        ?ci
        ?argv
        ~and_exit:false
        name
        tests;
      fun () -> if and_exit then exit 0 else ()
    with
    | A.Test_error as exn -> fun () -> if and_exit then exit 1 else reraise exn
  in
  Junit.Testsuite.add_testcases !testcases testsuite, exit
;;