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 :local
和 lein 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-one
和 test-two
需要是使用 defn
创建的常规函数, 而不是 使用 deftest
.
创建的测试
更新
测试选择器将 Clojure 元数据添加到测试函数。例如,它主要用于 分类 函数作为 :fast
与 :slow
。测试选择器并非旨在 参数化 测试函数,但是,这正是您想要做的。
您的配置文件解决方案更符合 lein
的预期用途。请注意,配置文件可以存储在多个位置(有关完整信息,请参阅 the lein profile docs)。
旨在与 SCM 中的项目一起保留的配置文件添加到 project.clj
:profiles
键下。不应提交到 SCM 中的配置文件信息(例如云或数据库用户名和密码)可以保存在 profiles.clj
中,它与 project.clj
并存,但它是特定于用户的,不会签入 SCM。
我有一些测试需要 运行 使用到本地 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 :local
和 lein 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-one
和 test-two
需要是使用 defn
创建的常规函数, 而不是 使用 deftest
.
更新
测试选择器将 Clojure 元数据添加到测试函数。例如,它主要用于 分类 函数作为 :fast
与 :slow
。测试选择器并非旨在 参数化 测试函数,但是,这正是您想要做的。
您的配置文件解决方案更符合 lein
的预期用途。请注意,配置文件可以存储在多个位置(有关完整信息,请参阅 the lein profile docs)。
旨在与 SCM 中的项目一起保留的配置文件添加到 project.clj
:profiles
键下。不应提交到 SCM 中的配置文件信息(例如云或数据库用户名和密码)可以保存在 profiles.clj
中,它与 project.clj
并存,但它是特定于用户的,不会签入 SCM。