使用 dune 运行 OUnit 测试

Flu*_*lux 4 ocaml ounit ocaml-dune

我在运行 OUnit 测试时遇到困难,主要是因为我对沙丘和 OUnit 都不熟悉。dune我跑步时抱怨dune runtest

File "test/dune", line 4, characters 13-14:
Error: Library "f" not found.
Hint: try: dune external-lib-deps --missing @runtest
Run Code Online (Sandbox Code Playgroud)

这是项目结构:

??? dune
??? f.ml  # This is the source file.
??? test
    ??? dune
    ??? f_test.ml  # This is the test.
Run Code Online (Sandbox Code Playgroud)

这是dune

(executable
  (name f))
Run Code Online (Sandbox Code Playgroud)

这是test/dune

(test
  (name f_test)
  (libraries oUnit f))  ; <- `f` here causes problems.
Run Code Online (Sandbox Code Playgroud)

我可以看到错误出现是因为沙丘不知道 about f.ml,因此f在沙丘文件中不知道。

如何f.mltest/dune了解f我使用的库的方式进行沙丘编译test/f_test.ml?如何正确运行单元测试?

oct*_*ron 5

一种可能是拆分f为私有库和可执行文件,然后测试拆分库。

编辑:

例如,项目结构可以更新为

??? dune
??? f.ml  # f only contains the I/O glue code.
??? lib
|    ??? dune
|    ??? a.ml  # a implements the features that need to be tested.
??? test
    ??? dune
    ??? test.ml  # This is the test.
Run Code Online (Sandbox Code Playgroud)

dune

 (executable (name main) (libraries Lib)) 
Run Code Online (Sandbox Code Playgroud)

对于测试,test/dune

(test (name test) (libraries Lib oUnit))
Run Code Online (Sandbox Code Playgroud)

最后 lib/dune

(library (name Lib))
Run Code Online (Sandbox Code Playgroud)

使用此设置,可以使用dune runtest.