При использовании теста стека выходные данные моих тестов hspec не окрашиваются

Это бесит, так как я создал наборы тестов на основе Hspec, в которых все цвета ведут себя нормально. Но в этом проекте я не могу заставить цвета появляться, когда я запускаю все наборы тестов одновременно.

Мой project.cabal настроен так:

test-suite unit
  type:               exitcode-stdio-1.0
  main-is:            SpecMain.hs
  hs-source-dirs:     tests/unit
  other-modules:      WikiSpec
  default-language:   Haskell2010
  ghc-options:        -Wall -fno-warn-orphans -threaded
  build-depends:      base                    >=4.6
  ...

test-suite integration
  type:               exitcode-stdio-1.0
  main-is:            SpecMain.hs
  hs-source-dirs:     tests/integration, webapp
  other-modules:      ApiSpec
  default-language:   Haskell2010
  ghc-options:        -Wall -fno-warn-orphans -threaded
  build-depends:      base                    >=4.6
  ...

И тогда мои файлы SpecMain.hs (идентичные) содержат это:

{-# OPTIONS_GHC -F -pgmF hspec-discover #-}

Итак, когда я запускаю stack test, все мои тесты выполняются, но вывод не окрашивается. Если я запускаю stack build --file-watch --test, тесты запускаются, но если вообще происходит какой-либо сбой, то весь вывод окрашивается в красный цвет. Наконец, если я запускаю stack test weblog:unit или stack test weblog:integration, то цвета получаются именно такими, какими они должны быть. Заголовки выделены белым цветом, пройденные тесты — зеленым, неудачные тесты — красным, а незавершенные тесты — желтым.

Когда я занимаюсь активной разработкой, я склонен полагаться на stack build --file-watch --test, но мне действительно нужно, чтобы цвета были правильными.

Кто-нибудь из вас знает, что происходит, как я могу это исправить или какую дополнительную информацию мне нужно предоставить?


person Savanni D'Gerinel    schedule 21.03.2016    source источник
comment
Хм, не могу воспроизвести с вариантом, который не использует hspec-discover и Stack 1.0.4. При этом, какую оболочку вы используете? Кроме того, вы пытались раскрасить вывод вручную с помощью --test-arguments "--color"?   -  person Zeta    schedule 21.03.2016
comment
Это интересно. stack test --test-arguments "--color" работает. Это поможет, но оставляет меня в замешательстве по поводу того, чем мой текущий проект отличается от других.   -  person Savanni D'Gerinel    schedule 21.03.2016


Ответы (2)


По умолчанию hspec будет использовать цвета только тогда, когда вывод отображается на терминал и когда переменная среды TERM не равна "dumb" (или не установлена). Если вы не установите для переменной среды значение "dumb", вполне вероятно, что что-то происходит с обнаружением терминала.

В любом случае stack build позволяет вам использовать аргументы для наборов тестов с --test-arguments, а hspec интерпретирует несколько аргументов командной строки, включая --color и --no-color, которые перезаписывают поведение по умолчанию. Следовательно, вы можете форсировать цвета:

stack test --file-watch --test-arguments "--color"
person Zeta    schedule 21.03.2016
comment
Ну, это не так. Терминал настроен на xterm-256color. Если я перехожу к другому проекту в том же терминале, stack test отображает цвета точно так, как я ожидаю. Разница в том, что рабочий проект запускает распознаватель стека 3.15, а сломанный проект запускает распознаватель стека 5.3. - person Savanni D'Gerinel; 22.03.2016
comment
@SavanniD'Gerinel снова, я не могу воспроизвести такое поведение. Можете ли вы предоставить минимально воспроизводимый пример? - person Zeta; 22.03.2016
comment
Это действительно дает цветной вывод, но мне бы хотелось, чтобы он был по умолчанию, когда я вызываю тест стека. Вы знаете способ (может быть, поместите его как-то в stack.yaml) заархивировать это? Я пробовал build: test-arguments: ["--color"], но это не сработало - person user3637541; 03.01.2017

Stack использует поведение, которое вы видите, когда даете ему более одного пакета для тестирования одновременно. Как правило, это происходит из-за того, что в разделе пакетов вашего файла stack.yaml указано несколько местоположений.

В последних версиях стека упоминается следующее в автоматически сгенерированном файле stack.yaml:

# A package marked 'extra-dep: true' will only be built if demanded by a
# non-dependency (i.e. a user package), and its test suites and benchmarks
# will not be run. This is useful for tweaking upstream packages.

Если вы пометите все места в разделе пакетов, кроме одного, как extra-dep, стек вернется к своему поведению с одним пакетом при тестировании и покажет раскрашенные результаты теста, как вы ожидаете.

person Jason Whittle    schedule 02.01.2017