【问题标题】:Creating test that depends on another test case创建依赖于另一个测试用例的测试
【发布时间】:2015-10-27 04:43:01
【问题描述】:

我目前正在开发一个将文件上传到 Web 服务的应用程序(使用 spring resttemplate)。这个上传函数返回一个id,以后可以用来下载上传的文件。

我希望这个场景被测试覆盖(我不是在谈论单元测试——可能是集成或功能测试,以合适的为准)。

我想要做的是下载测试用例将取决于上传测试的结果(因为 id 将来自上传功能) - 这将针对实际的 Web 服务进行测试,以确认是否上传和下载功能正常工作。

我不确定我想要做的这种方法是否正确,所以如果有人能提出一个如何实现它的好方法,将不胜感激。

提前致谢!

【问题讨论】:

    标签: spring unit-testing testing tdd integration-testing


    【解决方案1】:

    由于此上传/下载功能已在单元级别上涵盖

    我希望这个场景被测试覆盖(我不是在谈论单元测试——可能是集成或功能测试,以合适的为准)。

    我知道Test chaining 被认为是有害的

    下载测试用例取决于上传测试的结果(因为id来自上传函数)

    并且可能会导致测试之间出现大量重叠,因此对一个测试的更改可能会向外级联并导致各处失败。此外,测试应该具有原子性(隔离)。但是,如果您的案例中的权衡适合您,我的建议是使用它。

    您可以看到的是正确的Test Fixture 策略。其他Fixture Setup 模式可以帮助您解决这个问题。

    【讨论】:

      【解决方案2】:

      听起来需要进行“验收测试”。这基本上是对所需功能的子系统的集成测试。 看看Cucumber 是一个很好的简单入门框架。

      在这里您可以定义您的步骤 鉴于: 什么时候: 那么:

      然后您可以整体测试该功能。

      【讨论】:

        【解决方案3】:

        必须模拟您的应用程序的外部服务(您无法控制),即使在 e2e 测试中也是如此。

        这意味着您上传文件的服务应该是伪造的。只需设置伪装成真实服务的虚拟 http 服务器即可。

        使用这种虚假服务,您可以为每个测试设置它的行为,例如,您可以准备要使用给定 id 下载的文件。

        伪代码:

        // given
        file = File(id, content);
        fakeFileService.addFile(file);
        
        // when
        applicationRunner.downloadFile(file.id());
        
        // then
        assertThatFileWasDownloaded(file);
        

        这是一个检查应用程序是否可以下载给定文件的测试。

        • File 类是您的应用程序中的某个域对象,而不是系统 归档!
        • fakeFileService 是控制虚拟文件服务的实例。
        • applicationRunner 是您的应用程序的包装器,它使 它做你想做的事。

        我建议您阅读“以测试为指导的不断发展的面向对象软件”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-12
          • 1970-01-01
          • 2016-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多