首页 文章

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

提问于
浏览
4

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

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

PD:

我尝试使用像RepreZen和SwaggerHub这样的商业工具,但它们不会为我生成测试文件 .

我也试过使用swagger-generator jar工具来生成那种文件,但是这个工具只为Client生成代码但是没有为Server生成代码 .

你好多了!

3 回答

  • 1

    埃里克森,

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

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

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

    首席执行官Ted Epstein RepreZen

  • 2

    要测试Spring-family项目的API,可以使用Springfox AssertJ Swagger库 . 您还需要一个包含API规范的YAML文件 . 此解决方案的主要思想是将 Contract 优先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 .

    • Warning! 我发现消费者驱动 Contract 测试对我的项目来说太严格了,它会产生很多错误,例如:如果实际DTO名称与规范中的名称不同 .
      我不知道如何解决这个问题 . 欢迎所有建议!

  • 1

    埃里克森,

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

    简单回答:不,它不仅仅适用于Node.js API或swagger-node . 更长的答案:您可以像Node.js项目中的任何其他Node.js模块一样使用STT,完全靠它自己 . 有关如何独立运行它的示例,请参阅自述文件或测试文件 . 此外,不必在Node.js中实现API,以便STT生成的测试使用HTTP请求来定位它 . 您必须使用Node.js来利用此模块的功能,但只要您将测试指向正在运行的服务器(localhost:1337,my.api.test.net),后端实现就无关紧要了 . 需要注意的是,此模块设计为使用mocha运行,mocha是Node.js测试运行器/框架 . 因此测试必须在Node.js项目中,但服务器实现不是 .

    编辑:那就是说,它确实生成了Node.js代码,而不是Java代码,如果那是你想要的 . 如果我能回答更多问题,请跟进 .

相关问题