
做 Java 开发 3 年了, 每次想要测试开发完的接口总是有点头疼, 要复制 url, 又要写测试参数, 为了解决这些烦恼, 我开发了一个快速测试的工具, 直接面向 controller 测试. 项目地址 https://github.com/cweijan/http-test
example:
<dependency> <groupId>io.github.cweijan</groupId> <artifactId>http-test</artifactId> <version>0.0.3</version> <scope>test</scope> </dependency> @RestController @RequestMapping("/user") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @PostMapping("/save") public UserVo saveUser(@RequestBody SaveUserDTO saveuserDTO) { return userService.saveUser(saveuserDTO); } @PostMapping("/update") public UserVo updateUser(@RequestBody UpdateUserDTO updateuserDTO) { return userService.updateUser(updateuserDTO); } @GetMapping("/{userId}") public UserVO getUser(@PathVariable Integer userId) { return userService.getUser(userId); } @DeleteMapping("/{userId}") public void deleteByUserId(@PathVariable Integer userId) { userService.deleteByUserId(userId); } } import io.github.cweijan.mock.Asserter; import io.github.cweijan.mock.jupiter.HttpTest; import io.github.cweijan.mock.request.Generator; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeAll; import javax.annotation.Resource; @HttpTest(host = "localhost",port = 8080) public class UserControllerTest { //仅支持注入 controller 和 feignClient @Resource private UserController userController; @BeforeAll public static void addToken(){ //配置全局拦截器 Mocker.addRequestInterceptor(template -> { template.header("token","c2f678d4873c472c8f99940e8cf39fe4"); }); } // 注意, 必须使用 junit5: org.junit.jupiter.api.Test @Test void saveUser() { //创建 mock 数据 SaveUserDTO saveUserDTO = Generator.request(SaveUserDTO.class); // 当调用方法时会直接发送 http 请求 UserVo userVo=userController.saveUser(saveUserDTO); UserVO user = userController.getUser(userVo.getId()); Asserter.assertSame(userVo,user); userController.deleteByUserId(userVo.getId()); } } SpringBootTest 也可以实现该测试, 但需要启动 spring 容器, 耗时实在太久, 该方式毫秒级即可运行完测试.
1 zoharSoul 2020-06-01 15:09:04 +08:00 感觉挺有意思的... |
2 gengz 2020-06-01 15:11:10 +08:00 我选择 swagger |
3 zhazi 2020-06-01 15:13:00 +08:00 via Android 这东西需要启动项目,就是个 httpclient,完全没达到测试的目的,不能保证可重复性,测试完数据库一堆脏数据,那你这就是不合格的测试工具啊 |
4 cweijan OP @gengz 我们公司现在是有用 yapi 搭建文档, 存在以下问题: 1. 无法快速定位到接口进行调用 2. 创建测试用例组太麻烦, 比如我要保存用户后立刻测试更新用户 3. 对接口结果进行断言验证 你可以试下, 很方便的 |
5 zhazi 2020-06-01 15:15:50 +08:00 via Android 如果在服务已经启动的情况下 mockmvc 就可以提供 api 访问了,不需要对 spring 容器初始化 |
8 chendy 2020-06-01 15:19:18 +08:00 因为要拉应用起来,然后跑测试去调用,所以已经不是单元测试而是集成测试了… 当然如果 lz 是针对自己的使用场景开发的工具,那也是极好的,就是不一定适合别人了 |
9 cweijan OP @chendy 确实属于集成测试, 主要是没有更好的接口自测方案, 都是人肉调用 http, 而这个可以让后端人员直接面向 controller 进行测试 |
10 efaun 2020-06-01 16:17:33 +08:00 JB 有个插件更方便,RestfulToolkit |
11 hantsy 2020-06-01 17:03:10 +08:00 一年到头,难得 V 站上有人讨论测试。 Spring Boot 默认 test-starter 除了自己提供对 JUnit 等集成外,还包括大量第三方测试工具。 用于 REST APIs 的 包括 MockMVc,TestRestTemplate,WebTestClient,这个 starter 加入流行的测试工具的 Dep,Mockito, AssertJ,JSONPath 等,另外自己可以添加 RestAssured 提供 REST APIs 的 BDD 测试体验。 对于环境依赖,Spring 提供一系列 @AutoConfigure/@DataJpaTest 等测试 Slices 等,不必加载个 Context 。对于外部数据库等依赖,现在 TestContainers 是不错的选择,将来 Spring Boot 会它代替 embedded mongo 等。 对于服务与之间测试,Spring WebMvc 提供了 MockServer ( Mock 远程服务),另外 Spring Cloud Contract 提供了 CDC 模式测试。 不得不说 Spring Security 5 在测试 OAuth2,Oidc 很大的改进,现在 resource server 可以在 Mock 环境下测试。 @cweijan 如果说速度,集成环境加载的资源太多, 什么方法快不了(跑整个集成测试的任务,应该在 CI 上进行)。只有 Mock 环境可以加快测试运行速度。 集成测试: https://github.com/hantsy/spring-reactive-jwt-sample/blob/master/src/test/java/com/example/demo/IntegrationTests.java 单独测试 Controller ( Mock 环境): https://github.com/hantsy/spring-reactive-jwt-sample/blob/master/src/test/java/com/example/demo/PostControllerTest.java 从你的代码片断,我没看出来你这个项目有多少实用性。当然任何创作值得鼓励。 |
12 hantsy 2020-06-01 17:07:51 +08:00 https://github.com/hantsy/spring-microservice-sample/tree/master/post-service/src/test/java/com/hantsylabs/sample/springmicroservice/post 提供了传统 Spring WebMvc 的测试,包括大部分 Spring Boot 提供的测试工具。 |
13 hantsy 2020-06-01 17:18:13 +08:00 你这个项目 https://github.com/cweijan/http-test 的测试代码呢?没有提交? |
14 cweijan OP @hantsy 看来你对测试研究的很深, 佩服, 我的目的很简单, 想要快速测试我写的 controller, 我使用 @SpringBootTest 之后, 启动太久, 没法快速测试我的接口, 而公司也没有要求要写测试用例, 测试用例仅仅是用来自测的, 这个库其实就是个 http client, 用来替换 postman 和 yapi. |
17 hantsy 2020-06-01 20:48:11 +08:00 @cweijan 你这个只是 Client View 来测试,仅仅测试功能而已。从测试金字塔来看,在最顶端。没有大量的基础单元测试,代码质量同样很脆弱。 https://martinfowler.com/bliki/TestPyramid.html |
18 CoderGeek 2020-06-01 20:52:53 +08:00 从体来说 内部测试与 postman 这种还是不大一样 本身 postman 这种也有扩展工具 |
19 JarvisRay 2020-06-02 16:15:52 +08:00 还是 postman 吧,swagger 也集成了 |