用选择器进行Lein测试-如何为多个条件指定测试?

时间:2018-12-18 18:28:53

标签: clojure leiningen

我有一些测试需要使用与本地MySQL数据库或远程MySQL数据库的连接来运行。

我可以选择使用类似的方法运行; (sql/with-conn...)东西建立了一个动态绑定以建立正确的连接,随后的所有调用都只使用该绑定。

(sql/with-conn (sql/conn :remote)
    (test-one)  ;; will use remote db
    (test-two)) ;; will use remote db

类似地,

(sql/with-conn (sql/conn :local)
    (test-one)  ;; will use local db
    (test-two)) ;; will use local db

我想使用选择器从命令行中选择绑定,因为这似乎是正确的方法。 我尝试添加元数据,所以我可以说lein test :local(在将:selectors {:local :local}添加到我的project.clj之后:

(deftest ^:local test-one [] ...)
(deftest ^:local test-two [] ...)

这可行,但是现在我不能lein test :remote了。

我无法弄清lein如何使用选择器映射的值,因此我可以选择使用:local:remote的测试,但是不能选择是:cache,旨在运行另一组测试。

我尝试将标签添加到两个不同的高级测试中:

(deftest ^:local test-local []
    (sql/with-conn (sql/conn :local)
        (test-one)
        (test-two)))

(deftest ^:remote test-remote []
    (sql/with-conn (sql/conn :remote)
        (test-one)
        (test-two)))

但是lein test :locallein test :remote仅调用高级测试,而忽略测试一和测试二,我相信是因为在这种情况下,较低级的测试没有被标记。

我尝试使用:only来调用不带元数据的高级测试,并且不使用自定义选择器,但是再次不调用较低级别的测试。

奇怪的是,从Emacs Cider REPL运行时,高级别的测试实际上确实在运行低级别的测试。

那么我如何使用本质上不同的参数从Lein运行这些测试?

1 个答案:

答案 0 :(得分:0)

您的最后一个示例在正确的轨道上:

(deftest ^:local test-local []
    (sql/with-conn (sql/conn :local)
        (test-one)
        (test-two)))

(deftest ^:remote test-remote []
    (sql/with-conn (sql/conn :remote)
        (test-one)
        (test-two)))

缺少的部分是test-onetest-two必须是使用defn创建的常规函数​​,而 不是 创建的测试deftest


更新

测试选择器将Clojure元数据添加到测试功能。例如,它主要用于将功能 分类 :fast:slow。测试选择器并不是要 参数化 ,但这正是您想要做的。

您的配置文件解决方案更符合lein的预期用法。请注意,配置文件可以存储在多个位置(有关完整信息,请参见the lein profile docs)。

打算在SCM中保留该项目的配置文件在project.clj键下添加到:profiles。不应提交给SCM的配置文件信息(例如云或数据库用户名和密码)可以保存在profiles.clj旁边的project.clj中,但它是用户特定的,并且不会签入SCM。