Не мог заставить Гудзон анализировать тест JUnit производит XML

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

Первым шагом является написание класса типа , который захватывает необходимые операции:

trait Calculable[A] {
  def create(values: Seq[Double]): A
  def calculate(a: A): Double
}

Вы можете рассматривать экземпляры этого типа как «свидетельство» того, что вы можете выполнить эти операции на некоторых A.

Далее вы напишите свой MyClass следующим образом:

class MyClass[T: Calculable] {
  private val instance = implicitly[Calculable[T]]
  val pars = Seq(1.0, 2.0)
  val calc: T = instance.create(pars)
  val res: Double = instance.calculate(calc)
}

Часть T: Calculable является «связанной с контекстом», которая указывает, что должно быть неявное свидетельство того, что T имеет Calculable экземпляр. Это ограничение гласит: «T может быть любого типа, если мы знаем, как выполнять над ним операции Calculable».

Теперь вы можете написать конкретный класс, который можно использовать как T, например:

class MyCalculation(vs: Seq[Double]) {
  def calculate(): Double = vs.sum
}

object MyCalculation {
  implicit val calculableInstance: Calculable[MyCalculation] =
    new Calculable[MyCalculation] {
      def create(values: Seq[Double]): MyCalculation = new MyCalculation(values)
      def calculate(a: MyCalculation): Double = a.calculate()
    }
}

И вы получите желаемое использование:

scala> val myClass = new MyClass[MyCalculation]
myClass: MyClass[MyCalculation] = MyClass@646bf8a6

scala> myClass.res
res0: Double = 3.0

Если вы контролируете В определении MyCalculation наиболее удобным местом для определения его неявного Calculable[MyCalculation] является сопутствующий объект MyCalculation, но одно из преимуществ подхода класса типов состоит в том, что он отделяет определение операций над типом от определения типа, и эти экземпляры могут быть определены отдельно.

5
задан Nik Reiman 15 January 2010 в 13:33
поделиться

3 ответа

Править: Тест Google устранил эту проблему, которая включена в gtest 1.4.0 выпуска. См. исходный отчет об ошибках для большего количества информации.

Вот еще! Я наконец нашел причину этой проблемы - это - потому что gtest производит один гигантский XML-файл для всех результатов испытаний, и Гудзон ожидает один отчет о тестировании XML в классе. Я записал сценарий жемчуга как обходное решение для этой проблемы. Для использования его Вы сделали бы цель у своего муравья xml сценарием, который выглядит примерно так:

<target name="runtests">
  <exec executable="wherever/${ant.project.name}Test" failonerror="false" dir="tests">
    <arg value="--gtest_output=xml:${build.dir}\reports\${ant.project.name}.xml"/>
  </exec>
  <!-- Workaround for broken gtest output -->
  <mkdir dir="${build.dir}/reports/output"/>
  <exec executable="perl" failonerror="false" dir="tests">
  <arg value="gtest-hudson.pl"/>
    <arg value="${build.dir}/reports/${ant.project.name}.xml"/>
    <arg value="${build.dir}/reports/output"/>
  </exec>
</target>

По некоторым причинам, gtest также не любит неправильный стиль наклонных черт, передаваемых ему от муравья, таким образом, я сделал свое должностное лицо для окон только, поскольку мой Гудзон работает на Windows Server. Изменитесь на '/' для Unix, очевидно.

Я также зарегистрировал проблему для этого на gtest странице, и также один на системе отслеживания ошибок Гудзона, таким образом, надо надеяться, одна из этих двух команд возьмет по проблеме, поскольку у меня нет достаточного количества времени, чтобы вскочить и сделать патч самого...., хотя, если это не становится фиксированным в ближайшем будущем, я мог бы просто иметь к.;)

4
ответ дан 13 December 2019 в 22:18
поделиться

Вот то, как я делаю это:

    <target name="junit" depends="compile-tests" description="run all unit tests">
      <mkdir dir="${reports}"/>
      <junit haltonfailure="false">
         <jvmarg value="-Xms128m"/>
         <jvmarg value="-Xmx128m"/>
         <classpath>
            <path refid="project.classpath"/>
         </classpath>
         <formatter type="xml"/>
         <batchtest fork="yes" todir="${reports}">
            <fileset dir="${test}/classes">
                <include name="**/*Test*.class"/>
            </fileset>
         </batchtest>
      </junit>
  </target>

  <target name="generate-reports" depends="junit" description="create JUnit test HTML reports">
      <mkdir dir="${reports}"/>
      <junitreport todir="${reports}">
          <fileset dir="${reports}">
              <include name="TEST-*.xml"/>
          </fileset>
          <report format="frames" todir="${reports}"/>
      </junitreport>
  </target>
6
ответ дан 13 December 2019 в 22:18
поделиться

Я почти уверен, что это не проблема, анализирующая XML, а скорее проблему, находящую XML-файлы. При использовании относительного пути в Гудзонской конфигурации удостоверьтесь, что Вы ясны, какой каталог это относительно (я, кажется, помню это являющийся неочевидным при определенных обстоятельствах).

Что касается примеров того, на что XML-файлы JUnit, как предполагается, похожи, удача с этим. Это точно не указано нигде. Различные инструменты имеют отличающиеся диалекты. Тем не менее Гудзон делает хорошее задание распознавания всех их. Я полагаю, что это были разработчики JUnitReport, которые сначала представили формат XML, поэтому если Вы используете это, это почти так канонически, как Вы собираетесь добраться.

0
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: