1. 引言
近期遇到部分Java后端团队使用NodeJS做单元测试,由此产生疑问用NodeJS更优吗?Java自己不香了吗?本文在此做初步的分析和探讨。
2. 分析过程
2.1. Java
2.1.1 框架选型
- 除了常规的JUnit外,目前比较火热的就是TestNG(用例管理、并行执行、自动生成HTML测试报告、端到端/集成测试)。
- 丰富的Mock工具传送门>>:
- 基于动态代理的 Mokito。
- 基于自定义类加载器的 PowerMock。
- 基于动态字节码修改的 JMockit。
- 阿里基于动态字节码修改的 TestableMock (推荐)。
2.1.2 优点
- 多线程,充分利用多核CPU运算能力。
- 可调用本地Java代码,进行“贴身”的测试,比如:mock本地方法。
- 跨平台。
2.1.3 缺点
- 体量大。
2.2. NodeJS
2.2.1. 框架选型
2021 年,除了mocha(测试运行工具需搭配其他库),比较火热的是Facebook的JEST(全家桶)选型参考>>。
2.2.2. 优点
- 轻便。
- NodeJS EventLoop(V8引擎 提供默认实现) 虽然只有一个主线程,但其下的I/O处理是一个线程池,默认4并发,可通过变量调整,适合运用在高并发、I/O密集、少量业务逻辑的场景。
- 跨平台。
- 相较于java容易上手。
2.2.3. 缺点
- 无法直接调用本地Java代码。
- NodeJS 的异步/非阻塞特性,对纯Java的开发来说较难理解。
- NodeJS 执行js代码时,只有一个主线程(EventLoop),只占用一个CPU内核, 不适合做CPU密集型任务。
- 同js,存在大数处理精度丢失问题。(比如:原值200000436035958034,被转为200000436035958050;解决方法>>)
3. 总结
- 与具体测试框架无太大关系,本质上是Java 和 NodeJS 平台之间的PK。
- 建议:
- 如果你是前端,NodeJS当然是你的菜;
- 如果你是纯Java后端,为了更好的做白盒测试,Java平台当仁不让;
- 如果你是全栈开发,可根据实际场景自行选择。
- 冷知识:HotSpot JVM 的作者和Google v8引擎作者是同一人“lars bak”。