【问题标题】:Generate Unit Test Code from Swagger API for Java REST从 Swagger API for Java REST 生成单元测试代码
【发布时间】:2016-09-21 15:19:09
【问题描述】:

我尝试使用 Swagger 测试模板,发现这是一个有趣的工具,可以为我的控制器生成测试文件,但它似乎只适用于 NodeJs 项目,因为 Java 平台没有类似的工具。

有人知道如何通过对 Spring Boot 项目使用 swagger 文件从我的控制器生成这些测试文件吗?

警察局:

我曾尝试使用 RepreZen 和 SwaggerHub 等商业工具,但它们不会为我生成测试文件。

我也尝试过使用 swagger-generator jar 工具来生成这类文件,但是这个工具只为客户端生成代码,而不为服务器生成代码。

非常感谢你!

【问题讨论】:

  • 您好,您找到适合您的情况了吗? swagger-test-templates 之类的东西,但对于 java?

标签: java spring-boot automated-tests swagger swagger-2.0


【解决方案1】:

为了测试 Spring 系列项目的 API,您可以使用 Springfox + AssertJ Swagger 库。您还需要一个带有 API 规范的 YAML 文件。该解决方案的主要思想是将合约优先的 Swagger YAML 文件与 SpringFox 生成的代码优先的 Swagger JSON 进行比较。

Springfox 与 Spring MVC 集成,支持 Swagger 1.2 和 Swagger 2.0 规范。 Springfox 能够在运行时为使用 Spring 构建的 API 自动生成 JSON API 文档。

Assertj-Swagger 是一个库,它将设计优先的 Swagger YAML 与实现优先的 Swagger JSON 输出(例如来自 springfox)进行比较。 assertj-swagger 允许验证实现是否符合设计规范。

项目设置示例

pom.xml

<!-- http://springfox.io -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.6.1</version>
</dependency>

<dependency>
    <groupId>io.github.robwin</groupId>
    <artifactId>assertj-swagger</artifactId>
    <version>0.6.0</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.8.0</version>
    <scope>test</scope>
</dependency>

测试代码:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AssertJSwaggerConsumerDrivenTest {

    @LocalServerPort
    int randomPort;

    @Test
    public void validateThatImplementationSatisfiesConsumerSpecification() {
        File designFirstSwagger = new File(AssertJSwaggerConsumerDrivenTest.class.getResource("/swagger.yaml").getFile());
        SwaggerAssertions.assertThat("http://localhost:" + randomPort + "/v2/api-docs")
                .satisfiesContract(designFirstSwagger.getAbsolutePath());
    }    
}

疑难解答

  • 异常java.lang.UnsupportedClassVersionError: io/github/robwin/swagger/test/SwaggerAssertions : Unsupported major.minor version 52.0
    解决方案:使用 JRE 1.8+
  • 异常java.lang.NoSuchMethodError: io.swagger.models.parameters.AbstractSerializableParameter.setMaximum(Ljava/lang/Double;)V
    在用最新的 SpringFox 版本编写 AssertJ-Swagger 库 is incompatible 时,我建议使用 SpringFox v2.6.1。
  • 警告! 我发现消费者驱动合同测试对我的项目来说过于严格,它会给出很多错误错误,例如如果实际 DTO 名称与规范中的名称不同。
    我不知道如何解决这个问题。欢迎所有建议!

【讨论】:

  • 你好。用 swagger-codegen 生成你的 api 怎么样?
  • @AlexPo swagger-codegen 需要模板。在研究这个话题时,我没有找到任何好的 java 单元测试模板。
【解决方案2】:

埃里克森,

虽然 RepreZen API Studio 当前不包含用于单元测试的生成器模板,但您可以使用内置工具和代码生成框架为此编写自定义代码生成器。

更多信息在这里:http://docs.reprezen.com/#code-gen

如果您想在这方面进行合作,请随时与我们联系。

首席执行官特德·爱泼斯坦 |代表

【讨论】:

    【解决方案3】:

    埃里克森,

    嗨!我是 swagger-test-templates 的贡献者之一。这个问题也被here问过,我answered it there,但我会在这里复制。

    简单的回答:不,它不仅适用于 Node.js API 或 swagger-node。

    更长的答案:您可以像 Node.js 项目中的任何其他 Node.js 模块一样使用 STT,完全独立。有关如何独立运行它的示例,请参阅Readme 或测试文件。此外,API 不必在 Node.js 中实现,以便 STT 生成的测试以 HTTP 请求为目标。您必须使用 Node.js 来利用此模块的功能,但只要您将测试指向正在运行的服务器(localhost:1337,my.api.test.net),后端实现并不重要。这里需要注意的是,该模块设计为与 mocha 一起运行,这是一个 Node.js 测试运行器/框架。所以测试必须在 Node.js 项目中,但服务器实现不需要。

    编辑: 话虽如此,它确实会生成 Node.js 代码,而不是 Java 代码,如果那是您正在寻找的。如果我能回答更多,请跟进。

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多