我正在用Java编写一个将文件上传到AWS S3的应用程序。该文件将以参数形式提供给应用程序,而不是硬编码。我想编写测试以确保文件实际上传到S3。测试将在TDD代码之前编写。 (我实际上已经编写了代码,但我想将TDD实践纳入我的所有工作习惯中)
我到底该怎么做呢?我将使用JUnit,因为这是我最熟悉的。
提前感谢您的帮助。
答案 0 :(得分:20)
实际上传和正在进行的测试是集成测试的一部分,而不是单元测试。如果您将S3 API包装在一个非常薄的类中,您将模拟该类以进行业务类的单元测试,并且您将使用真正的实现进行集成测试。
如果您决定将业务类直接用于 AmazonS3接口,那么对于单元测试,您必须模拟那个。
实际探索性测试(学习和验证)亚马逊s3是否以及如何工作是您在单独的实验设置中实际做的事情。
P.S。我不建议直接在您的业务类中使用AmazonS3接口,而是将其包装在您的瘦接口中,这样如果您决定更改“后端存储”,您可以轻松更改它。
答案 1 :(得分:4)
我不是Java程序员,但你可能想看看mocking。有一个名为MockService的SoapUI工具似乎允许模拟AWS提供的外部服务。
答案 2 :(得分:3)
Op De Cirkel在单元测试范围内的答案很好,但如果您正在编写框架支持或只是需要在测试期间运行AWS S3调用,则可以运行任何提供AWS兼容API的服务。 OpenStack是其中之一,可以在虚拟机中运行(请参阅DevStack)。
或者您可以从提供AWS兼容API的各种面向测试的工具中进行选择。
以下是一些暴露S3服务的内容:
答案 3 :(得分:2)
您可以查看LocalStack,这个框架可以提升功能齐全的本地云环境以进行集成测试。
LocalStack提供AWS云服务的子集,包括S3,Kinesis,Lambda,DynamoDB等。
答案 4 :(得分:2)
如上所述,回答更好的方法是模拟AWS API响应。获得API动作错觉的另一种方法是,使用干运行模式/参数调用AWS SDK或API。 但是在执行测试时可能需要访问Internet。
答案 5 :(得分:1)
很久以前就回答了这个问题,但我想评论另一种方法。
在我测试不同的Python项目时,我一直在使用this library。我发现它非常有用,即使您正在使用其他语言(如Java或Scala)进行开发,因为您可以设置后台服务器并模拟所有AWS调用。
您可以在自述文件末尾找到有关“独立服务器模式”的更多信息。