Модификация `test test` для контроля глубины трассировки стека (Clojure) - PullRequest
4 голосов
/ 05 декабря 2010

Я бы хотел изменить cake test, чтобы он работал с другим значением для *stack-trace-depth*.

Встроенное определение просто:

(deftask test #{compile}
  "Run project tests."
  "Specify which tests to run as arguments like: namespace, namespace/function, or :tag"
  (run-project-tests))

В идеале я хотел бы указать значение с аргументом командной строки --depth=n, что-то на этот счет:

(binding [*stack-trace-depth* (if (*opts* :depth)
                                  (read-string (*opts* :depth)))]
         (run-project-tests))

Какой код мне нужно сделатьэта работа?


Основано на ответах: Помещение следующего в tasks.clj

(undeftask test)
(deftask test #{compile}
  (.bindRoot #'*stack-trace-depth* 5)
  (println "Defining task: *stack-trace-depth* is" *stack-trace-depth* "in" (Thread/currentThread))
  (run-project-tests))

дает следующий вывод:

Загрузка test/cake_test/core.clj:

  Loading tests: *stack-trace-depth* is nil in #<Thread[thread-13,5,main]>

$ cake test

  Defining task: *stack-trace-depth* is 5 in #<Thread[Thread-18,5,main]>
  In test: *stack-trace-depth* is nil in #<Thread[Thread-16,5,main]>

  Testing cake-testing.core

  FAIL in (test-stack-trace-depth) (core.clj:8)
  expected: (= *stack-trace-depth* 5)     
  actual: (not (= nil 5))

  Ran 1 tests containing 1 assertions.
  1 failures, 0 errors.
  ----
  Finished in 0.011865 seconds.

(проверенный код на Gist .)

Ответы [ 2 ]

3 голосов
/ 05 декабря 2010

(Обновление: выкинул оригинальный ответ, вот то, что кажется рабочим решением.)

Я взял пример проекта из вашего Gist и внес следующие изменения:

  1. rm tasks.clj

  2. Добавлен следующий код в project.clj под формой defproject:

    (use '[bake.find-namespaces :only [find-namespaces-in-dir]]
         '[cake.tasks.test :only [test-opts]])
    
    
    (undeftask test)
    (deftask test #{compile}
      (bake (:use bake.test
                  [bake.core :only [with-context]]
                  [clojure.test :only [*stack-trace-depth*]])
        [namespaces (find-namespaces-in-dir (java.io.File. "test"))
         opts       (test-opts)]
        (with-context :test
          (binding [*stack-trace-depth* 5]
            (run-project-tests namespaces opts)))))
    
  3. Создан новый файл test/cake_testing/core_test.clj со следующим содержимым:

    (ns cake-testing.core-test
      (:use clojure.test))
    
    
    (deftest correct-stack-trace-depth?
      (is (= *stack-trace-depth* 5)))
    

На данный момент, кажется, все работает - cake test выводит

Testing cake-testing.core-test

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
----
Finished in 0.033200374 seconds.

Кроме того, добавление «теста», который преднамеренно генерирует исключение, приводит к печати хорошего короткого стека.

2 голосов
/ 07 декабря 2010

Был в состоянии поместить это в файл task.clj на том же уровне, что и файл project.clj, и когда я запускаю cake test --depth=5, я вижу «Выполнение тестов с stack-trace-глубина = 5 "печатается.Надеюсь, это поможет.

(ns tasks
  (:use cake cake.core cake.tasks.test
        [clojure.test :only [*stack-trace-depth*]]))

(undeftask test)
(deftask test #{compile}
  "Run tests"
  (binding [*stack-trace-depth* (if (*opts* :depth)
                                     (read-string (first (*opts* :depth))))]
    (println "Running tests with *stack-trace-depth* = " *stack-trace-depth*)
    (run-project-tests)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...