Lein test with Selectors——如何为多个条件指定一个测试?

Lein test with Selectors -- how to specify a test for multiple conditions?

我有一些测试需要 运行 使用到本地 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

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

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

这行得通,但现在我做不到 lein test :remote

我一直无法弄清楚 lein 如何使用 selector 映射的值,这样我就可以 select 进行测试,比如 :local or :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 来调用没有元数据的高级测试,而不是使用自定义 selectOR,但同样没有调用较低级别的测试。

奇怪的是,当 运行 来自 Emacs Cider REPL 时,高级测试实际上 运行 执行低级测试。

那么我如何 运行 来自 Lein 的这些测试,这些测试具有本质上不同的论点?

你的最后一个例子是正确的:

(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。