Я написал код, часть которого, как показано ниже
Object Cal{
def mergedatasets(df: Dataset[Row], df1: Dataset[Row],df2: Dataset[Row]):Dataset[Row]={
df.union(df1).union(df2)
//other logic
}
}
object readDataframes{
def readFirstDF(spark:SparkSession):Dataset[Row]={
spark.read.json(somefile)
}
def readSecondDF(spark:SparkSession):Dataset[Row]={
spark.read.json(somefile)
}
def readThirdDF(spark:SparkSession):Dataset[Row]={
spark.read.json(somefile)
}
}
В приведенном выше коде я читаю 3 файла и затем объединяю их в один, который я использую для дальнейшей обработки.Исходя из описанного выше сценария, мои вопросы таковы:
- Имеет ли смысл юнит-тестирование функции mergdatasets?Если да, Какие основные / минимальные вещи нужно проверить? Как проверить угловые случаи, если таковые имеются?
- Имеет ли смысл провести модульное тестирование readDataframes? Если да, то для чего нужно проверять?проверить, соответствует ли предполагаемая схема ожидаемой?и еще что-нибудь?
Я хотел бы также расширить вышеупомянутые вопросы для следующих функций
def timeIntervalAgg(df: Dataset[Row]): Dataset[Row] = {
val timeInterval = df
.groupBy("id","page_number")
.agg(sum("timeInterval").alias("timeInterval"))
timeIntervalAgg
}
def timeInterval(df: Dataset[Row]): Dataset[Row] ={
val windowSpec = Window.partitionBy("id").orderBy("date_time")
val timeFmt = "yyyy-MM-dd'T'HH:mm:ss"
val endTime = lead(col("date_time"),1).over(windowSpec)
val startTime = col("date_time")
val timeDiff = (unix_timestamp(endTime, timeFmt)
- unix_timestamp(startTime, timeFmt))
val timeInterval = df
.withColumn("timeInterval", lit(when(col("event") === "this_event",lit(null)
.cast("long"))
.otherwise(timeDiff)))
.where("""event != "this_event" """)
timeInterval
}
def addOddpages(df: Dataset[Row]) :Dataset[Row] = {
val odd = df
.where("""view_mode = "twin" """)
.withColumn("page_odd", col("page") + 1)
.drop("page")
.select(col("id"), col("date_time")
.cast("timestamp"),col("page_odd")
.alias("page"), col("page_view_mode"),
col("event"),col("timeInterval"))
val timeIntervalWithoddPage = df.union(odd)
timeIntervalWithoddPage
}
Пожалуйста, предложите, если это необходимо для рефакторингалучший способ для лучшего тестирования.
Моя цель - понять, для чего тестировать?на что обратить внимание при написании теста для кода, как указано выше?Все эти вопросы относятся к тестированию Spark-кода, а не к тестированию кода на других языках.
- Как выполнить модульное тестирование без избыточного тестирования искры, которая уже проверена?
- Нужно ли тестировать каждую функцию?как это (так как логика / код не очень сложный) или лучше всего протестировать функцию, которая объединяет вышеупомянутые функции в правильном порядке. При этом это можно назвать модульным тестированием?
- Пожалуйста, не стесняйтесь поделитьсянекоторые примеры модульных тестов, которые вы можете написать для приведенного выше кода.