我正在尝试对涉及DStreams的Spark Streaming应用程序执行一些单元测试。
我发现下面这套很有用:StreamingSuiteBase。它包含一个名为testOperation的方法,您可以向该方法传递一个输入、一个要测试的操作和一个预期的输出。它将验证您的预期输出是否与实际输出相匹配。
我面临的问题是,在相等验证期间,我确实得到了完全相同的对象,但包装成不同的集合:
测试操作定义如下:
def testOperation[U: ClassTag, V: ClassTag](
input: Seq[Seq[U]],
operation: DStream[U] => DStream[V],
expectedOutput: Seq[Seq[V]],
ordered: Boolean
) (implicit equality: Equality[V]): Unit = {
val numBatches = input.size
withOutputAndStreamingContext(setupStreams[U, V](input, operation)) {
(outputStream, ssc) =>
val output: Seq[Seq[V]] = runStreams[V](
outputStream, ssc, numBatches, expectedOutput.size)
verifyOutput[V](output, expectedOutput, ordered)
}
}
这不允许我按预期输入<code>List(Array(myObject))</code>
所以我的第二个选择是修改方法< code>verifyOutput。我打算从我的代码中重写它,只是添加几行来生成列表(Array(myObject))。像这样(更新):
override def verifyOutput[V](output: Seq[Seq[V]],
expectedOutput: Seq[Seq[V]],
ordered: Boolean)
(implicit evidence$1: ClassTag[V], equality: Equality[V]): Unit = {
super.verifyOutput(output, expectedOutput, ordered)
}
//These three lines is what I am planning to add
val sq = expectedOutput(0)
val ssq = sq(0)
val newOutput = Seq(Array(ssq))
logInfo("--------------------------------")
logInfo("output.size = " + output.size)
logInfo("output")
output.foreach(x => logInfo("[" + x.mkString(",") + "]"))
logInfo("expected output.size = " + expectedOutput.size)
logInfo("expected output")
expectedOutput.foreach(x => logInfo("[" + x.mkString(",") + "]"))
logInfo("--------------------------------")
// Match the output with the expected output
assert(output.size === expectedOutput.size, "Number of outputs do not match")
if (ordered) {
for (i <- output.indices)
equalsOrdered(output(i), expectedOutput(i))
} else {
for (i <- output.indices)
equalsUnordered(output(i), expectedOutput(i))
}
logInfo("Output verified successfully")
}
整个StreamingSuiteBase都可以在这里找到
但我在Eclipse中收到以下错误:
方法验证输出不覆盖任何内容。注意:类 myClass 的超类包含以下名为 verifyOutput 的非最终成员:定义验证输出[V](输出:Seq[Seq[V]],预期输出:Seq[Seq[V]],排序:布尔值)(隐式证据$1: scala.reflect.ClassTag[V],隐式相等:组织.scaical.Equal[V]): 单位
这是我的测试用例的简化版本:
import org.scalatest.FunSuite
class myClass extends StreamingSuiteBase with FunSuite {
test("ExtCustProfileHbaseAPI") {
//Here I would be generating my input and expected output
val inputData = new myInitialObject()
val expOutput = new myFinalObject()
testOperation(inputData, processTest _, expOutput, ordered = false)
}
def processTest(input: DStream[myInitialObject]): DStream[(String,myFinalObject)] = {
//Operation undertes
val result = operation(input)
result
}
//Here I added the override def verifyOutput[V: ClassTag]...
}
我做错了什么?
根据源代码,< code>StreamingSuiteBase特征有一个自身类型< code>org.scalatest.Suite,这意味着你必须扩展Suite类型类(在你的例子中是FunSuite ),否则它将无法编译。
你可以参考这个:https://github.com/holdenk/spark-testing-base/wiki/StreamingSuiteBase
有关Scala Self类型的更多信息,您可以参考:https://docs.scala-lang.org/tour/self-types.html
你不需要一个V:类标签
,我可以看到的基本IDE生成的重写方法是:
override def verifyOutput[V](output: Seq[Seq[V]],
expectedOutput: Seq[Seq[V]],
ordered: Boolean)
(implicit evidence$1: ClassTag[V], equality: Equality[V]): Unit = {
super.verifyOutput(output, expectedOutput, ordered)
}
问题内容: 在UIViewController中,此代码: 给出错误 我正在使用Xcode 8 beta 4,且iOS部署目标是9.0,并且在 如何将上面的代码转换为Swift 3? 问题答案: 像这样: …还有其余的。 一般模式 现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是: 更改为 删除 更改为 之所以可行,是因为计算的变量
问题内容: 我更新到Xcode 8 beta 5,现在在从UIView继承的类上收到以下错误: 有解决方法吗? 问题答案: 请检查最新参考。(您只需在Apple开发者网站的搜索栏中输入“ intrinsicContentSize”,就可以轻松找到它。) 宣言 已成为计算属性,因此您需要以这种方式覆盖它: 或者简单地:
我定义了一个通用的环境特征: 为此,我提供了以下实现: 此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法: 对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。 然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]: 错误:方法e
问题内容: 由于Xcode 6在Swift中仍然存在很多错误,因此我不确定是其中之一还是缺少某些东西。我的班采用协议NSLayoutManagerDelegate。但是似乎无法覆盖我需要的方法。我做的文档描述如下: 但是我在这里遇到错误:方法不会覆盖其超类中的任何方法。我该怎么办? 问题答案: 是的,您正在从协议中实现方法,但这不是替代。只需删除关键字。覆盖是指您的超类也实现该方法,并且您要提供一
问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当
我在我的项目中使用lombok,并在POJO类上使用和注释生成和。我试图重写属性的setters方法,但它不起作用 我想检查JSON属性是空的还是空的,我想在Setter方法中设置默认值 工作场景: 失败的场景: 输出: 我也将此作为参考,但到目前为止运气不佳