使用 Dune 執行執行檔與測試
執行執行檔
簡而言之
在您的
dune
檔案中加入executable
段落,並使用dune exec <executable_path>.exe
或dune exec <public_name>
執行執行檔。
若要告訴 Dune 產生執行檔,您可以使用 executable 段落
namepublic_namelibraries
<executable_name>
是專案內部使用的執行檔名稱。 <public_name>
是安裝套件時已安裝二進位檔的名稱。最後,<libraries...>
是要連結到執行檔的函式庫清單。
一旦 Dune 使用 dune build
產生執行檔後,您可以使用 dune exec <executable_path>.exe
或 dune exec <public_name>
執行它。
例如,如果您將 dune
檔案放在 bin/dune
中,並且包含以下內容
namepublic_name
您可以使用 dune exec bin/main.exe
或 dune 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 檔案中加入測試
namemodules
以及一個 dummy_test.ml
模組
let () = exit 1
執行 dune test
將會失敗,並產生以下輸出
dummy_test alias src/ocamlorg_web/test/runtest (exit 1)
這表示測試失敗,因為執行檔以狀態碼 1
結束。
輸出沒有太多描述。如果我們想要建立單元測試套件,每個檔案有多個測試,以及不同類型的斷言,我們會想要使用 Alcotest 等測試框架。
讓我們修改虛擬測試以連結到 Alcotest
namemoduleslibraries
使用以下模組
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.