我有一些测试需要使用与本地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 :local
和lein test :remote
仅调用高级测试,而忽略测试一和测试二,我相信是因为在这种情况下,较低级的测试没有被标记。
我尝试使用:only来调用不带元数据的高级测试,并且不使用自定义选择器,但是再次不调用较低级别的测试。
奇怪的是,从Emacs Cider REPL运行时,高级别的测试实际上确实在运行低级别的测试。
那么我如何使用本质上不同的参数从Lein运行这些测试?
答案 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-one
和test-two
必须是使用defn
创建的常规函数,而 不是 创建的测试deftest
。
更新
测试选择器将Clojure元数据添加到测试功能。例如,它主要用于将功能 分类 为:fast
与:slow
。测试选择器并不是要 参数化 ,但这正是您想要做的。
您的配置文件解决方案更符合lein
的预期用法。请注意,配置文件可以存储在多个位置(有关完整信息,请参见the lein profile docs)。
打算在SCM中保留该项目的配置文件在project.clj
键下添加到:profiles
。不应提交给SCM的配置文件信息(例如云或数据库用户名和密码)可以保存在profiles.clj
旁边的project.clj
中,但它是用户特定的,并且不会签入SCM。