新人在学习egg.js 中,一些关单元测试的疑惑,请前辈们指导一下。
发布于 6 年前 作者 hopperhuang 7889 次预览 最后一次回复是 6 年前 来自 问答
我的疑惑是,涉及单元测试在涉及数据库的部分应该怎么处理? 最近在学习node.js 和 egg框架。看到了关于单元测试的部分。就是对单元测试的时候,涉及网络io 和数据库的部分逻辑我们应该怎么处理呢?
我看到的文章的大概方案有两种。 第一种是: 通过单元测试框架的相关钩子,在启动测试前,连接到相应的测试数据库(测试数据库预先写入好需要的数据)中,然后再进行相应的测试。
第二种方法是: 关于数据库和网络io的,都使用mock方法。将数据库和网络io的相应测试分离。
我是认同第二种方法的。因为涉及到外部的东西,就应该放到集成测试中去,这并不是单元测试的目标。所以,应该用mock方法去模拟相应的操作。 但是,我又没找到可以mock数据库操作的库。google过了,好像也没找到相应的方法。
不知道前辈们在单元测试时,是如果测试这部分(涉及数据库和网络io)的逻辑的。请给后辈一些指点,谢谢各位了!!
10 回复
从来没写过单元测试,我们团队也是,都是直接在开发环境跑一下,没啥问题直接发测试环境,让测试测,有bug再改。至今没有理解单元测试的意义。
2个方案并没有冲突,涉及到DB你可以使用方案1,在setup中建立测试库,填充必要数据,在teardown中拆除测试库。每次运行用例都应该保证测试库是全新的。 涉及三方服务的,你可以以mock为主
@wuyugege 你这有点猛啊,重构的时候怎么办,改动一点的时候,怎么保证其他的都是OK的,测试在全测一遍吗
@dengnan123 重构是不可能重构的。有改动的话,全回归,人工测。这应该是小团队的现状吧,外包没见过写单元测试的,虽然我们不是外包,但只有几个人。
在我的实际运用中,只有一个方案:
没有会搞单元测试的人带,新人搞的话,覆盖率和测试用例都是一个问题 我们之前也搞,但是现在业务压力上来了,感觉搞不动了 写功能的时间都不够了,写测试的精力相对就少了很多
不写用例,这个项目只会越做越痛苦。然后就会出现各种 bug,有些是新写的,有些是改动导致的。最后没人敢接盘。 大型项目只所以稳定就是有比较完备测试用例,保证有问题代码第一时间发现并改掉。说单元测试没用的,可能并不关注代码质量和项目的稳定性。
@hopperhuang 数据库的测试,你可以在 ci 机器上起测试数据库。推荐使用 sequelize 这类 orm 吧,已经把 mock 什么的方法都做好了~
@okoala 确实,看到orm 的文档了,可以用egg-sequelize 来跑单元测试。
首先还是推荐用 fake date 测一下数据库 sql 部分的, 如果你想 mock, 可以重写 mode 里的方法