---
breaks: false
tags: public-tech
---
# Dune で環境変数によって動かすテストを変える
この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の二日目です。
超絶重いテストがあるときに、そのテストを有効化するフラグを作って、
そのフラグが立っているときにだけそのテストを動かしたいとします。
例えば Alcotest を使っている場合
```
"string-concat", [ test_case "String mashing" `Quick test_str_concat ];
"list-concat", [ test_case "List mashing" `Slow test_list_concat ];
```
のように `test_case` に渡すフラグを変えることでこれが実現できます。
しかし Alcotest を使っていない場合や、テストの前処理の段階で時間がかかる場合には、
この方法は採用できません。
そのような場合に、Dune 側でテストの有効・無効を環境変数の値によって切り替えることができます。
まず `test/` ディレクトリ配下に、遅いテスト専用のディレクトリを作っておきます。
```
$ mkdir test/slow
```
続いて `test/slow/dune` ファイルを作ります。ここで `enabled_if` stanza を使って
環境変数 `ENABLE_SLOW_TEST` の値を確認し、値が `1` であればこのテストを有効化します。
```
$ vim test/slow/dune
(tests
(names test_slow_hello)
(libraries yourfavname alcotest)
(enabled_if
(= 1 %{env:ENABLE_SLOW_TEST=0})))
```
テストを書きます。普通のテストと比較できるように、このテストはコケるようにしておきます。
```ocaml=
$ vim test/slow/test_slow_hello.ml
open Yourfavname
let test_hello () =
assert (Hello.hello () <> (* ← 本当は = *) "Hello, World!");
()
let () =
let open Alcotest in
run "Hello" [ ("hello-function", [ test_case "unit" `Quick test_hello ]) ]
```
テストを実行します。
```
$ dune runtest
# 通る
$ ENABLE_SLOW_TEST=1 dune runtest
# 落ちる
```
## 参考
- https://github.com/ocaml/dune/issues/2132