运行 使用沙丘的 OUnit 测试

Running OUnit tests using dune

我在 运行 测试 OUnit 时遇到困难,主要是因为我对 dune 和 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

项目结构如下:

├── dune
├── f.ml  # This is the source file.
└── test
    ├── dune
    └── f_test.ml  # This is the test.

这是dune:

(executable
  (name f))

这是test/dune:

(test
  (name f_test)
  (libraries oUnit f))  ; <- `f` here causes problems.

我可以看到出现错误是因为 dune 不知道 f.ml,因此不知道 dune 文件中的 f

如何让 dune 编译 f.ml 使 test/dune 知道我在 test/f_test.ml 中使用的 f 库?我怎样才能 运行 单元测试正确?

一种可能是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.

dune

 (executable (name main) (libraries Lib)) 

为了测试,test/dune:

(test (name test) (libraries Lib oUnit))

最后 lib/dune

(library (name Lib))

使用此设置,测试可以 运行 和 dune runtest