Можете ли вы запускать тестовые наборы более одного раза в ScalaTest? - PullRequest
0 голосов
/ 06 апреля 2020

У меня много шагов в процессе Spark ETL, и я создал пакеты для проверки функциональности каждого шага, и вывод моих шагов является входом следующего шага.

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

Необработанные данные >> ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3 >> Дельта-данные> > ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3

Я получаю сообщение об ошибке от Reporter, поскольку он не может запустить пакет с тем же именем, что и тот, который был запущен ранее (например, я не могу запустить пакет вызывается ETL_Step_1 дважды). Проблема исчезнет, ​​если дублировать наборы и переименовать дубликаты, чтобы выполнить следующие действия:

Необработанные данные >> ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3 >> Дельта-данные >> ETL_Step_1_2 >> ETL_Step_2_2 >> ETL_Step3

Есть ли лучший способ выполнить мой тест без дублирования и переименования комплектов тестов?

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете поместить все шаги ETL в определение (коллекцию) и запустить их

import org.scalatest.FunSpec
import com.github.mrpowers.spark.fast.tests.DataFrameComparer
import com.github.mrpowers.spark.daria.sql.SparkSessionExt._
import org.apache.spark.sql.types.{IntegerType, StringType}

 describe("etl collection") {

    it("can run etls that are organized in a map") {

      val sourceDF = spark.createDF(
        List(
          ("bob", 14),
          ("liz", 20)
        ), List(
          ("name", StringType, true),
          ("age", IntegerType, true)
        )
      )

    val etlDefinition = new EtlDefinition(
       name =  "example",
       sourceDF = sourceDF, // etl step 1
       transform = someTransform(), // etl step 2
       write = someWriter(), // etl step 3
      hidden = false
    )


      val etls = scala.collection.mutable.Map[String, EtlDefinition]("example" -> etlDefinition)

      etls += ("ex2" -> etlDefinition)

      etls("example").process()

    }

}

Другим вариантом может быть eventually из scalatest. Небольшой пример для:

 Post("/something", body) ~> routes ~> check {
      response should be a pendingResponse

      eventually {
        Post("/something", body) ~> routes ~> check {
          response should be a expectedResponse
        }
      }
    }

И вместо Post вы можете вызвать какой-нибудь метод.

Вы можете здесь здесь и scalatest

ОБНОВЛЕНИЕ:

it ("your definition") {
   eventually { Thread.sleep(50); step1() should be A // assertion }
   eventually { Thread.sleep(50); step2() should be B }
   eventually { Thread.sleep(50); step3() should be C }
}

вы можете сделать их вложенными, если вы sh

...