从 Swagger API for Java REST 生成单元测试代码

Eri*_*rra 8 java automated-tests swagger spring-boot swagger-2.0

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

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

PD:

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

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

Thx你很多!

naX*_*aXa 5

为了测试 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>
Run Code Online (Sandbox Code Playgroud)

测试代码:

@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());
    }    
}
Run Code Online (Sandbox Code Playgroud)

故障排除

  • 异常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
    在编写时 AssertJ-Swagger 库与最新的 SpringFox 版本不兼容,因此我建议使用 SpringFox v2.6.1。
  • 警告!我发现消费者驱动契约测试对我的项目来说太严格了,它给出了很多错误的错误,例如,如果实际的 DTO 名称与规范中的名称不同。
    我不知道如何解决这个问题。欢迎所有建议!


Ted*_*ein 4

埃里克森,

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

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

如果您想就此进行合作,请随时与我们联系。

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