使用 Dune 執行執行檔與測試

執行執行檔

簡而言之

在您的 dune 檔案中加入 executable 段落,並使用 dune exec <executable_path>.exedune exec <public_name> 執行執行檔。

若要告訴 Dune 產生執行檔,您可以使用 executable 段落

(executable
 (name <executable_name>)
 (public_name <public_name>)
 (libraries <libraries...>))

<executable_name> 是專案內部使用的執行檔名稱。 <public_name> 是安裝套件時已安裝二進位檔的名稱。最後,<libraries...> 是要連結到執行檔的函式庫清單。

一旦 Dune 使用 dune build 產生執行檔後,您可以使用 dune exec <executable_path>.exedune exec <public_name> 執行它。

例如,如果您將 dune 檔案放在 bin/dune 中,並且包含以下內容

(executable
 (name main)
 (public_name my-app)
 (libraries))

您可以使用 dune exec bin/main.exedune exec my-app 來執行它。

檔案變更時自動重新編譯

使用 dune exec <executable_path>.exe 編譯專案可能需要時間,尤其是在檔案很多的情況下。為了加快此速度,您可以使用 dune build --watch,它會在檔案變更時自動重新編譯檔案。

請記住

  • dune build --watch 會監視檔案並觸發必要的重新編譯。
  • Dune 會鎖定建置目錄,因此您無法同時執行兩個 Dune 命令。
  • 若要執行應用程式,請停止監視程序 (Ctrl-C) 或使用 _build\default\<executable_path>.exe 直接執行應用程式。

執行測試

簡而言之

在您的 dune 檔案中加入 test 段落,並使用 dune test 執行測試。

測試是使用 Dune 的 test 段落建立的。 test 段落是一個簡單的便利包裝函式,它會建立一個執行檔並將其加入 @runtest 目標的測試清單中。

例如,如果您在您的 dune 檔案中加入測試

(test
 (name dummy_test)
 (modules dummy_test))

以及一個 dummy_test.ml 模組

let () = exit 1

執行 dune test 將會失敗,並產生以下輸出

  dummy_test alias src/ocamlorg_web/test/runtest (exit 1)

這表示測試失敗,因為執行檔以狀態碼 1 結束。

輸出沒有太多描述。如果我們想要建立單元測試套件,每個檔案有多個測試,以及不同類型的斷言,我們會想要使用 Alcotest 等測試框架。

讓我們修改虛擬測試以連結到 Alcotest

(test
 (name dummy_test)
 (modules dummy_test)
 (libraries alcotest))

使用以下模組

open Alcotest

let test_hello_with_name name () =
  let greeting = "Hello " ^ name ^ "!" in
  let expected = Printf.sprintf "Hello %s!" name in
  check string "same string" greeting expected

let suite =
  [ "can greet Tom", `Quick, test_hello_with_name "Tom"
  ; "can greet John", `Quick, test_hello_with_name "John"
  ]

let () =
  Alcotest.run "Dummy" [ "Greeting", suite ]

如果我們再次執行 dune test,測試應該會成功並輸出以下內容

Testing `Dummy'.
This run has ID `B5926D16-0DD4-4C97-8C7A-5AFE1F5DF31B'.

  [OK]          Greeting          0   can greet Tom.
  [OK]          Greeting          1   can greet John.

Full test results in `_build/default/_build/_tests/Dummy'.
Test Successful in 0.000s. 2 tests run.

仍然需要協助嗎?

協助改善我們的文件

所有 OCaml 文件都是開放原始碼。發現有錯誤或不清楚的地方嗎?提交提取請求。

OCaml

創新。社群。安全。