【问题标题】:Mock a TSV source with Scalding JobTest使用 Scalding JobTest 模拟 TSV 源
【发布时间】:2014-04-14 21:47:51
【问题描述】:

我很难为我的烫手工作进行单元测试。

我的工作需要一个包含三个字段的文件:

  TextLine(args("input"))
    .map('url -> ('fetchedUrl,'date,'info)){
  ...

我天真地以为 fields 会被映射为 nTuple,而不需要任何进一步的设置。但从我的测试中我了解到情况并非如此,需要签订一些进一步的合同:

JobTest[com.kohls.crawler.Miner]
  .arg("input", "inputFile")
  .arg("output", "outputFile")
  .source(TextLine("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
  .sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }

当前失败,cascading.tuple.FieldsResolverException: could not select fields: [{1}:'url'], from: [{2}:'offset', 'line']。所以我我需要以某种方式声明 TSV 字段,然后再将其作为 TextLine 的输入。

我发现的大多数文档在这方面都参差不齐。 定义此测试的正确原因是什么?

【问题讨论】:

    标签: scala mocking tsv scalding


    【解决方案1】:

    您应该使用Tsv 而不是TextLineTsv 将声明的字段作为第二个输入参数。你的工作应该是这样的:

    Tsv(args("input"), ('fetchedUrl,'date,'info), skipHeader = false/true).read
      .map(...)
      .write(Tsv(args("output"), writeHeader = false/true)
    

    你的工作测试是这样的:

    JobTest[com.kohls.crawler.Miner]
      .arg("input", "inputFile")
      .arg("output", "outputFile")
      .source(Tsv("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
      .sink[(String,Date,Array[Byte])](Tsv("outputFile")) { ... }
      .run
      .finish
    

    【讨论】:

    • 好的。到了那里。但是消费者部分(测试执行的代码抛出关键错误):by: java.util.NoSuchElementException: key not found: Tsv(inputFile,'fetchedUrl', 'date', 'info',false,false)
    • 嗯,不应该......这个论点不只是将数据映射到某个符号的一种方式吗?为什么重要的是它的名字?
    • 啊,好的...是的,这些是追溯格式问题。该代码仅使用符号...
    • 那么错误一定在你的工作中。我建议先做一个非常简单的工作,以确保不是导致问题的测试用例。
    【解决方案2】:

    当然,您可以在测试中模拟 TextLine。诀窍是提供隐藏的'line 字段。

        JobTest[com.kohls.crawler.Miner]
          .arg("input", "inputFile")
          .arg("output", "outputFile")
          .source(TextLine("inputFile"), List((
            0 -> "https://en.wikipedia.org/wiki/Test" , 
            1 -> "Mon Apr 14 15:08:11 CDT 2014", 
            2 -> "extra info")))
          .sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }
    

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2016-05-06
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2023-01-17
      • 2021-12-28
      相关资源
      最近更新 更多