V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
elgae
V2EX  ›  程序员

基于 Spring、Spring MVC、MyBatis 开发的 restful API 如何进行测试?

  •  1
     
  •   elgae · 2017-09-13 16:34:10 +08:00 · 4452 次点击
    这是一个创建于 2629 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题

    1. 测试覆盖到什么程度?单元测试是不是覆盖到每一层?集成测试是不是覆盖所有流程?
    2. 使用什么技术(测试框架、工具等)?

    不限于上文描述的问题,希望得到大家的帮助、指点。

    第 1 条附言  ·  2017-09-13 22:31:26 +08:00
    17 条回复    2017-09-15 09:52:33 +08:00
    hubert3
        1
    hubert3  
       2017-09-13 16:38:51 +08:00
    postman
    elgae
        2
    elgae  
    OP
       2017-09-13 17:02:34 +08:00
    @hubert3 postman 一直在用。
    willvvvv
        3
    willvvvv  
       2017-09-13 17:03:33 +08:00
    robot,jmeter
    acoder2013
        4
    acoder2013  
       2017-09-13 17:11:24 +08:00
    自带就够用了

    ```java
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    public class RandomPortExampleTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void exampleTest() {
    String body = this.restTemplate.getForObject("/", String.class);
    assertThat(body).isEqualTo("Hello World");
    }

    }
    ```
    mahengyang
        5
    mahengyang  
       2017-09-13 18:07:56 +08:00
    @acoder2013 这种不是单元测试,接口数量多的时候跑一遍测试会卡死的
    mahengyang
        6
    mahengyang  
       2017-09-13 18:08:44 +08:00   ❤️ 4
    看来好多人都不知道 spring mvc + mybatis 的工程怎么写单元测试,回头我写个博客
    elgae
        7
    elgae  
    OP
       2017-09-13 18:55:48 +08:00
    http://www.baeldung.com/integration-testing-in-spring 暂时参考这个解决了,有同样困惑的朋友可以参考一下。不过离理想的模式还差一些,在继续摸索中。
    期待您的博客 @mahengyang
    hantsy
        8
    hantsy  
       2017-09-13 22:40:15 +08:00   ❤️ 1
    https://github.com/hantsy/angularjs-springmvc-sample-boot 不过我的例子是基于 Data JPA 的。

    包括不同层,各种方式的测试,Spring Mvc Test/JUnit,Mockito, JBehave, RestAssured

    文档: https://hantsy.gitbooks.io/build-a-restful-app-with-spring-mvc-and-angularjs/content/testing.html
    hantsy
        9
    hantsy  
       2017-09-13 22:48:04 +08:00   ❤️ 2
    @elgae 总结一下,Spring REST API 测试,
    1. Mock 方式,Spring 提供了 MockServlet 环境,另外可以 @MockBean 可以 Mock 一切依赖,测试 API 内部逻辑比较方便。
    2. 集成测试,以 Client View 测试 API ( API 处理运行状态),Spring 提供了 TestRestTemplate,也可以用第三方 RestAssured (推荐使用,BDD 语义, 现在 Spring Rest Docs 支持这个,可以用生成带实例的 REST API 文档)

    其它的,什么 JBehave,Cucumber 等,老外特别喜欢 BDD,在 Spring 中都不方便。
    hantsy
        10
    hantsy  
       2017-09-13 22:52:35 +08:00
    另外如果熟悉 Groovy, 推荐使用 Spock,Geb,很多项目也完全用这些来写测试,JUnit 5 的一些功能像如 Nested
    ,Repeated,Dynamic 这些功 Spock 早有支持了。

    当然现在 Spring 5 是支持 JUnit 5 的。
    sunzhenyucn
        11
    sunzhenyucn  
       2017-09-14 10:46:31 +08:00
    @acoder2013 又见够用党
    yasin
        12
    yasin  
       2017-09-14 11:45:24 +08:00
    spring ui
    hantsy
        13
    hantsy  
       2017-09-14 14:10:32 +08:00
    @sunzhenyucn 够用比不用好,比用 Postman 来代替测试好。国内几乎没多少公司和程序员关心测试的重要性。
    elgae
        14
    elgae  
    OP
       2017-09-14 16:24:05 +08:00
    @hantsy 4 楼的方式,好像是 3.2 以前的。谢谢你,记得上一个帖,你也给了不少见解。
    mgcnrx11
        15
    mgcnrx11  
       2017-09-14 16:38:17 +08:00
    @hantsy 看完了文档,写得不错,感谢。

    请问有没有关于,如何在单元测试之前,创建数据库 schema,倒入初始化数据,然后执行单元测试,再进行数据删除的实践?目前通过 @Rollback @Sql 注解去实现,但是创建 schema 这一步怎样根据不同数据库去创建 schema 还没有很理想的解决掉。
    qkzeng
        16
    qkzeng  
       2017-09-14 17:38:12 +08:00
    mockMvc
    hantsy
        17
    hantsy  
       2017-09-15 09:52:33 +08:00
    @mgcnrx11 Spring Boot 作了扩展,应该在 classpath 中丢入一定命名规划的 SQL 脚本就行了。
    https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
    hibernate 一直都是支持 import.sql 导入数据, Spring Boot 支持 schema.sql, data.sql 等。

    手动方式 org.springframework.jdbc.datasource.init.DataSourceInitializer, 可以自己在测试中使用。

    另外测试 DataSource 相关的内容时,可以看看 Dbunit。

    生产环境推荐使用 Flyway,Liquebase 等手动创建数据库(脚本全部针对生产环境优化),维护初始数据,支持版本升级,降级。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.