Lein test with Selectors - как задать тест для нескольких условий? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть несколько тестов, которые нужно запускать, используя соединение либо с локальной базой данных 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 вызывают только высокий уровеньtest и игнорирует test-one и test-two, я полагаю, потому что тесты более низкого уровня в этом случае не помечены.

Я пытался использовать: только для вызова теста высокого уровня без метаданных и без использования пользовательскихселекторы, но опять-таки тесты более низкого уровня не называются.

Что странно, если при запуске из Emacs Cider REPL тесты высокого уровня действительно запускают тесты низкого уровня.

Итак, как мне запустить эти тесты от Лейна с совершенно разными аргументами?

1 Ответ

0 голосов
/ 18 декабря 2018

Ваш последний пример находится на правильном пути:

(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.Обратите внимание, что профили могут храниться в нескольких местах (для получения полной информации см. документы по профилю lein ).

Профили, предназначенные для использования в проекте в SCM, добавляются в project.clj под клавишей :profiles.Информация профиля, которая не должна передаваться в SCM (например, имена пользователей и пароли в облаке или базе данных или в базе данных), может храниться в profiles.clj, который находится рядом с project.clj, но зависит от пользователя и НЕ проверяется в SCM.

...