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

10

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

是否有人知道如何通过使用spring boot项目的swagger文件来生成这些控制器测试文件?

附言:

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

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

非常感谢!


你好,你有找到适合你情况的东西吗?类似于“swagger-test-templates”,但是针对Java的? - suit
3个回答

7

您可以使用Springfox + AssertJ Swagger库测试Spring家族项目的API。此外,您还需要一个包含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
    在编写本文时,AssertJ-Swagger库与最新的SpringFox版本不兼容,因此我建议使用SpringFox v2.6.1。
  • 警告!我发现消费者驱动的合同测试对我的项目太严格了,会出现很多错误,例如实际DTO名称与规范中的名称不同。
    我不知道如何解决这个问题。欢迎提出所有建议!

你好。使用Swagger-Codegen生成API如何? - Alex Po
@AlexPo swagger-codegen需要模板。在我研究这个主题时,我没有找到任何好的Java单元测试模板。 - naXa stands with Ukraine

4

Erikson,

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

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

如果您想要合作,请随时与我们联系。

Ted Epstein,CEO | RepreZen


2

Erikson,

你好!我是swagger-test-templates的贡献者之一。这个问题也在这里被问到了,我在那里回答了,但我会把回答复制在这里。

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

更长的答案:您可以像在Node.js项目中使用任何其他Node.js模块一样使用STT。请参阅自述文件或测试文件以获取如何独立运行的示例。此外,即使STT生成的测试针对的后端实现不是基于Node.js,也可以使用HTTP请求将其定位到运行服务器(localhost:1337,my.api.test.net)。这里的警告是,此模块是为mocha设计的,这是一个Node.js测试运行器/框架。因此,测试必须在Node.js项目中进行,但服务器实现不需要。

编辑: 话虽如此,它确实生成Node.js代码,而不是Java代码,如果这就是你要找的。如果还有任何问题,请随时与我联系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接