Clojure - 集成测试组织

Clojure - integration test organization

在 Clojure 中构建集成和单元测试的典型方法是什么? 到目前为止,我有一个遵循 src/ 目录结构的 test/ 文件夹。但我想把它们分成单元测试和集成测试。

有推荐攻略吗?测试中的注释?子文件夹 test/unittest/integration?环境变量?

注意:我使用 boot 而不是 leiningen 以防万一

组织由你决定。您可以为集成测试创建单独的目录树,在同一目录树中有单独的文件,或者在相同的测试源文件中有单元测试和集成测试。

单元测试和集成测试之间唯一真正的区别是

  1. 他们需要多长时间 运行
  2. 与系统其他部分的额外设置(这也意味着它们更慢 and/or 更难 运行)。

因此,无论哪种方式,所有集成测试都应在每个函数上用 ^:integration 元数据进行标记。此技术对于 "slow" 单元测试也很有用。

一个 "slow" 测试可以像这样标记(使用 clojure.test.check 生成测试):

(tst/defspec ^:slow round-trip-bytes 9999
  (prop/for-all [orig gen/bytes]
    (let [string-b64  (b64/encode-bytes->str  orig)
          result      (b64/decode-str->bytes  string-b64) ]
      (assert (every? b64/base64-chars (seq string-b64)))
      (assert (types/byte-array? result))
      (= (seq orig) (seq result)))))

然后在你的project.clj(不是引导,我知道)中,指定:

:test-selectors { :default    (complement :slow)
                  :slow       :slow }

然后当你说 lein test 时,标有 ^:slow 的测试将被跳过,当你说 lein test :all 所有测试(包括 "slow" 的)将是 运行.

请注意关键字 :slow 没有什么特别之处。您可以替换任何您想要的关键字,例如 :integration.

我没有经常使用 boot,但我认为可以使用类似的技术。