我正在使用Stuart Sierra组件实现一个应用程序。如他在自述文件中所述:
采用一致的方式来设置和拆除与应用程序相关的所有状态,可以实现快速的开发周期,而无需重新启动JVM。由于创建和启动系统的成本很低,因此每个测试都可以创建系统的新实例,因此它还可以使单元测试更快,更独立。
这里首选的策略是什么?是类似于JUnit的oneTimeSetUp / oneTimeTearDown,还是真的在每个测试之间(类似于setUp / tearDown)?
如果在每个测试之间,是否有一种简单的方法来启动/停止所有测试(之前和之后)的系统,而不必每次都重复代码?
编辑:示例代码以显示我的意思
(defn test-component-lifecycle [f]
(println "Setting up test-system")
(let [s (system/new-test-system)]
(f s) ;; I cannot pass an argument here ( https://github.com/clojure/clojure/blob/master/src/clj/clojure/test.clj#L718 ), so how can I pass a system in parameters of a test ?
(println "Stopping test-system")
(component/stop s)))
(use-fixtures :once test-component-lifecycle)
Run Code Online (Sandbox Code Playgroud)
注意:我在这里谈论的是单元测试。
我正在为我的第一个Clojure项目编写测试用例。在这里,如果“:meat”的值为空,我希望测试失败:
(deftest order-sandwich
(let [response {:meat "" :bread "yes" :add-on "lettuce"}]
(is (= (:bread response) "yes"))
(is (not (nil? (:meat response))))))
Run Code Online (Sandbox Code Playgroud)
但是我的测试运行成功(返回“ nil”)。
有人知道为什么会这样吗?有一个更好的方法吗?
我提前谢谢你!!
使用 clojure.test,运行时lein test,默认设置仅打印断言数量,例如“运行了 12 个包含 19 个断言的测试”、失败测试的详细信息以及测试的命名空间。我还想要成功测试的输出,这样我就可以看到实际运行了哪些测试。像 JS 中的 Mocha 这样的框架默认就有这种行为。
例如,如果以下测试通过:
(deftest aTest
(testing "Simple test"
(is (= 1 1))))
Run Code Online (Sandbox Code Playgroud)
我想要一个类似的输出(格式是任意的):
Testing <namespace>
Passed: aTest -> Simple test
Run Code Online (Sandbox Code Playgroud)
理想情况下,通过的测试也应该有颜色编码。
我查看了一些库,包括 lein-test-refresh 和 humane-test-output,但没有看到我需要的东西。另一个选项看起来像是重写 clojure.test 中的报告函数,但我想如果可能的话避免这种情况。