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

时间:2016-09-21 15:19:10

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

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

有人知道如何通过使用swagger文件为我的控制器生成这些Test文件吗?

PD:

我尝试使用像RepreZen和SwaggerHub这样的商业工具,但他们没有为我生成测试文件。

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

你好多了!。

3 个答案:

答案 0 :(得分:2)

为了测试Spring-family项目的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。
  • 警告!我觉得Consumer Driven Contract测试对我的项目来说太严格了,它会产生很多错误,例如:如果实际DTO名称与规范中的名称不同。
    我不知道如何解决这个问题。欢迎所有建议!

答案 1 :(得分:1)

埃里克森,

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

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

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

Ted Epstein,首席执行官| RepreZen

答案 2 :(得分:1)

埃里克森,

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

  

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

     

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

编辑: 那就是说,它确实生成了Node.js代码,而不是Java代码,如果那就是你要找的东西。如果我可以回答任何问题,请跟进。