【问题标题】:Can you unit test s3 writes?您可以对 s3 写入进行单元测试吗?
【发布时间】:2018-02-01 22:16:15
【问题描述】:

单元测试验证特定 s3 存储桶存在的方法很简单,因为单元测试不会改变 s3 的状态。但是,对写入 s3 存储桶的方法进行单元测试会带来更多问题,因为它实际上会在每次运行单元测试时更改 s3 的状态。例如使用rdd.saveAsTextFile(path)的方法。

是否可以为写入 s3 的方法编写单元测试,但仍允许您验证文件是否已写入?

注意:我考虑过使用模拟对象,但不确定如何实现。

编辑:我可能应该注意到我正在使用 Scala

【问题讨论】:

    标签: scala unit-testing testing amazon-s3 junit


    【解决方案1】:

    您可能想查看mockito

    您要做的是创建 s3 客户端的模拟(使用 mock),存根 put 方法(使用 when.thenReturn),然后验证 s3 put 是否使用正确的数据到正确的存储桶和密钥(使用verify)。

    val s3 = org.scalatest.mock.MockitoSugar.mock[AmazonS3]
    when(s3.putObject(any[String], any[String], any[String]).thenReturn(new PutObjectResult)
    
    -- execute the code under test here --
    
    verify(s3).putObject(theExpectedBucket, theExpectedKey, theExpectedData)
    

    【讨论】:

      【解决方案2】:

      通常在编写单元测试时,建议您“模拟”或“存根”对外部 API 的任何调用。这允许您仅测试给定的工作单元,在这种情况下,您的代码写入 s3。

      在您的情况下,您将模拟用于与 s3 通信的 aws sdk 对象之类的东西,并指定调用的预期返回值。

      http://www.baeldung.com/mockito-annotations

      【讨论】:

      • 不过,在这种情况下,我实际上想检查写入 s3 的内容。如果我嘲笑/存根它,它不会只是返回我告诉它的任何内容,而不是向我展示实际写入 s3 的内容吗?
      【解决方案3】:

      严格来说,这不是一个 unit 测试,但我很幸运能够完成以下类似的测试

      describe ('s3', () => {
        const contents = uuid.v4()
        const key = uuid.v4()
      
        it('should write to s3', () => {
          const result = write(key, contents)
          assertSuccess(result)
        }
      
        it('should read from s3', () => {
          const result = read(key)
          assertSuccess(read, contents)
        }
      
        it('should clear from s3', () => {
          const result = clear(key)
          assertSuccess(result)
        }
      
        it('should no longer have the value', () => {
          const result = read(key)
          assertFailure(result) // or maybe assertSuccess(result, empty), depending on your requirements
        }
      
      })
      

      根据我的经验,这满足了单元测试的松散要求(快速、可靠),但没有 100% 满足测试独立性和解耦的硬性要求。

      【讨论】:

      • 那么您的意思是,既然测试将按照规定的顺序运行,那么它们将始终使 s3 保持与找到它时相同的状态?
      • 可以,只要所有测试代码都能正常工作。例如,如果 clear() 尚未实现,您最终会在 s3 上存储一些作为测试结果的内容。但是由于我们使用 uuid.v4() 作为 key,所以每次都是新东西,不应该干扰其他东西。
      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多