您如何测试针对AWS API编写的代码

我正在用Java编写一个将文件上传到AWS S3的应用程序。 该文件将以参数forms提供给应用程序,而不是硬编码。 我想编写测试以确保文件实际上传到S3。 测试将在TDD代码之前编写。 (我实际上已经编写了代码,但我想将TDD实践纳入我的所有工作习惯中)

我到底该怎么做呢? 我将使用JUnit,因为这是我最熟悉的。

在此先感谢您的帮助。

实际上传和正在进行的测试是集成测试的一部分,而不是unit testing 。 如果您将S3 API包装在一个非常薄的类中,您将模拟该类以进行业务类的unit testing,并且您将使用真正的实现进行集成测试。
如果您已经决定,您的业务类直接采用AmazonS3接口 ,那么对于unit testing,您必须模拟那个。

amazon s3是否以及如何工作的实际探索性测试 (学习和validation)是您在单独的实验设置中实际执行的操作。

PS我不建议直接在您的业务类中使用AmazonS3接口,而是将其包装在您的瘦接口中,这样如果您决定更改“后端存储”,您可以轻松更改它。

我不是Java程序员,但你可能想看看嘲笑 。 有一个名为MockService的SoapUI工具似乎允许模拟AWS提供的外部服务。

Op De Cirkel的答案在unit testing范围方面很好,但如果您正在编写框架支持或只是需要在测试期间运行AWS S3调用,则可以运行任何提供AWS兼容API的服务。 OpenStack就是其中之一,可以在虚拟机中运行(参见DevStack )。

或者,您可以从提供AWS兼容API的各种面向测试的工具中进行选择。

以下是一些暴露S3服务:

  • S3Ninja (实际用Java编写)
  • FakeS3 (ruby)
  • s3mock (使用Java API的Scala)

您可以查看LocalStack ,这是一个框架,可以实现function齐全的本地云环境以进行集成测试。

LocalStack提供AWS云服务的子集,包括S3,Kinesis,Lambda,DynamoDB等。

如上所述,回答更好的方法是模拟AWS API响应。 获取API操作错觉的另一种方法是,使用干运行模式/参数调用AWS SDK或API。 但是在执行测试时可能需要访问Internet。

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/DryRunResult.html

很久以前就回答了这个问题,但我想评论另一种方法。

在我测试不同的Python项目期间,我一直在使用这个库 。 我发现它非常有用,即使您正在使用其他语言(如Java或Scala)进行开发,因为您可以设置后台服务器并模拟所有AWS调用。

您可以在自述文件末尾找到有关“独立服务器模式”的更多信息。