ProcessLogger для анализа результатов "sbt test" - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь дать Scala каталог для запуска sbt test, а затем получить его возвращенные строки.Затем я хотел бы увидеть строки о количестве тестов и их неудаче или успехе.Это будет связано с использованием regex. Сбой с ошибкой ниже:

package custom.processLogger

import java.io.File


import scala.sys.process.{Process, ProcessLogger}

object SbtLogger extends App{

  val baseDir = new File("/Users/gakuo/Documents/ThesisProject/ShoppingCartExample")
  val assemble = Process(Seq("sbt", "test","run"), baseDir).!!.trim
  println(assemble)
  val (out, err) = (new StringBuffer(), new StringBuffer())
  val logger = ProcessLogger(
      out.append(_),
      err.append(_)
  )
 println(out.toString)
 println(err.toString)

}

Ошибка выглядит следующим образом:

Exception in thread "main" java.lang.RuntimeException: Nonzero exit value: 1
    at scala.sys.package$.error(package.scala:30)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:138)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:108)
    at custom.processLogger.SbtLogger$.delayedEndpoint$custom$processLogger$SbtLogger$1(SbtLogger.scala:13)
    at custom.processLogger.SbtLogger$delayedInit$body.apply(SbtLogger.scala:8)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1$adapted(App.scala:80)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.App.main(App.scala:80)
    at scala.App.main$(App.scala:78)
    at custom.processLogger.SbtLogger$.main(SbtLogger.scala:8)
    at custom.processLogger.SbtLogger.main(SbtLogger.scala)

Process finished with exit code 1

1 Ответ

0 голосов
/ 02 апреля 2019

Обратите внимание на разницу между ! и !! с точки зрения создания исключения при выходе из процесса с ненулевым значением:

def !!(log: ProcessLogger): String

Запускает процесс представленный этим строителем, блокирует до его выхода и возвращает вывод в виде строки. Стандартная ошибка отправляется на указанный ProcessLogger. Если код выхода не равен нулю, генерируется исключение.

def !(log: ProcessLogger): Int

Запускает процесс, представленный этим строителем, блокирует, пока не выйдет, и возвращает код выхода. Стандартный вывод и ошибка отправляются данный ProcessLogger.

Неудачный тест вызовет ненулевое возвращаемое значение, и, таким образом, !! вызовет исключение. С другой стороны ! не выбрасывает, так что вот возможное решение:

import java.io.File
import scala.sys.process.{Process, ProcessLogger}

object SbtLogger extends App{
  val (out, err) = (new StringBuffer(), new StringBuffer())
  val logger = ProcessLogger(
    line => out.append(line + '\n'),
    line => err.append(line + '\n')
  )

  val baseDir = new File("/Users/gakuo/Documents/ThesisProject/ShoppingCartExample")
  Process(Seq("sbt", "test"), baseDir) ! logger

  println(out)
}

Обратите внимание, как мы проходим logger в

Process(Seq("sbt", "test"), baseDir) ! logger

, который заставит out сохранить окончательный результат процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...