使用 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.