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

创新。社区。安全。