Есть ли способ подавить трассировку стека из ScalaTest в последних версиях SBT?

Я получаю трассировку стека, когда тест ScalaTest не проходит в SBT. Я пробовал set traceLevel in Test := -1 в командной строке SBT, пытался изменить что-то в файле build.sbt и т. д., но, похоже, ничего не помогает.

Я хотел бы избавиться от этого:

> test
[info] TestWritingFunctions:
[info] - threeSquares examples *** FAILED ***
[info]   scala.NotImplementedError: an implementation is missing
[info]   at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252)
[info]   at TestWritingFunctions$$anonfun$1.apply$mcV$sp(WritingFunctions.scala:17)
[info]   at TestWritingFunctions$$anonfun$1.apply(WritingFunctions.scala:16)
[info]   at TestWritingFunctions$$anonfun$1.apply(WritingFunctions.scala:16)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info]   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]   ...

Как видите, тест провален, потому что я использовал новую конструкцию ??? в качестве заполнителя, но, поскольку я знаю, что там есть заполнитель, мне просто нужно сообщение *** FAILED *** без всей этой волокиты. Это возможно?


person Todd O'Bryan    schedule 15.10.2013    source источник


Ответы (2)


Вы можете использовать "-o..." без F или S (т. е. "-o" или "-oD" не дадут вам трассировки стека, но не "-oF", "-oS" или "-oDS" даст вам трассировку стека). Это означает, что вы будете подавлять все трассировки стека. Если вы вообще не укажете никаких репортеров, вы получите "-o", что означает отсутствие трассировки стека.

Если вам нравятся короткие трассировки стека в целом, но вы не хотите их видеть, когда ??? выдает NotImplementedError, вы можете переопределить withFixture и изменить NotImplementedError на ожидающие тесты:

import org.scalatest._

trait PendingIfUnimplemented extends SuiteMixin { this: Suite =>

  abstract override def withFixture(test: NoArgTest): Outcome = {
    super.withFixture(test) match {
      case Failed(ex: NotImplementedError) => Pending
      case other => other 
    }
  }
}

Таким образом, вы по-прежнему будете получать короткие, длинные или отсутствующие трассировки стека для регулярных сбоев, что бы вы ни выбрали, но видите (в ожидании) тесты, которые не пройдены из-за ???.

person Bill Venners    schedule 18.10.2013
comment
Спасибо за подробную инструкцию. Ваш указатель на ожидающие тесты напомнил мне, что я могу просто игнорировать еще не написанные тесты. (В этом году я впервые преподаю «Введение в программирование на Scala», и я все еще думаю, как лучше представить проекты по программированию. ScalaTest очень удобен для начинающих, но я пытаюсь свести к минимуму шум для мои школьники) - person Todd O'Bryan; 22.10.2013

(не авторитетно, но так как больше никто не ответил :)

Я подозреваю, что traceLevel ничего не делает, потому что трассировка стека поступает из ScalaTest, а не из sbt.

sbt имеет соответствующую настройку logLevel. Попробуй это:

set logLevel in Test := Level.Warn

Но обратите внимание, что это подавляет не только трассировку стека, но и все строки в вашем примере, которые начинаются с [info]. Вместо этого в конце вы просто получите материал [error], в котором, по крайней мере, есть имена наборов с неудачными тестами.

Если вы действительно хотите подавить только трассировку стека, не меняя ничего другого, я думаю, что это может быть невозможно. Глядя на http://www.scalest.org/user_guide/using_the_runner, я вижу варианты создания трассировка стека короче (-oS) или длиннее (-oF), но нет возможности полностью исключить трассировку стека.

person Seth Tisue    schedule 17.10.2013
comment
Да, именно это я и начал подозревать. Думаю, я отправлю вопрос в список рассылки scalatest-user и посмотрю, знает ли что-нибудь кто-нибудь со знанием дела. - person Todd O'Bryan; 18.10.2013
comment
Никакой стек не отслеживает его, просто старый -o без S или F. Вы просто получаете сообщение об ошибке, а также имя файла и номер строки. Это значение по умолчанию, поэтому я не уверен, почему sbt показывает трассировку стека. Попробуйте указать -o явно в ваших testOptions. - person Bill Venners; 18.10.2013