如何编写模拟数据

1. 为什么要编写模拟数据?

肯定会有不少同事疑惑,为什么要编写模拟数据?编写和维护模拟数据都会增加工作量。但是请想想你有没有遇到过以下情形:

任务工期太短,立马去做,再加加班,应该还能完成。但是后端还在设计数据库表结构,接口还没有动工呢,怎么办?

时间紧,不能等,这个就不要多说了吧,相信大家不止一次遇到这种情况。即便时间比较宽裕,也不能等后端开发完成才开始,还要考虑后端延期的风险。否则到了上线前天晚上,后端跑来告诉你说他接口开发好了,你就懵逼了。

后端接口终于好了,我可以安心些 Bug 了。。。503。。。哎哎哎,XXX,怎么503了?。。。哎呦卧槽,你这服务太不稳定了,能不能上线啊?。。。

后端服务不稳定,恭喜你成为后端接口的第一个用户,实际上就是个小白鼠。在掘金上有人开玩笑说“不要叫我前端了,叫我后端API测试工程师算了”,以此来吐槽后端接口的不稳定。

测试今天给我报了一个 Bug,说是用户名大于20个字符时截断了,但是没有显示点点点。老子不服,还不是因为联调时后端给我的用户名都很短,本来我也想到了,但是用户名来自单点登录系统,改起来很麻烦,后来一忙就忘了。

边界条件覆盖少,导致很多问题要到测试环境甚至生产环境才被发现。庆幸测试发现了,不然被用户发现那就是线上故障了。

2. 编写模拟数据的最佳实践

相信你看完以上几个案例之后,也会认为模拟数据很有必要。那好,我们来看看应该怎样编写模拟数据。

2.1 模拟后端接口

确认需求之后,首先和后端定义接口,然后两边同事开工。我们创建一个 mock server,其规格和前后端接口完全一致,只是它的逻辑是简化后的,甚至是写死的。

2.2 手动编写数据

网上有不少生成模拟数据的第三方库,为什么还要手动编写呢?原因如下:

  1. 学习成本低

    你不需要学习和使用第三方库的 DSL ,也不受限第三方库的 DSL 的表达能力。你编写的就是普通代码。

  2. 数据有意义

    试想在页面中看到 bW9kdWxlPXNoYXJl 你能知道他代表什么吗?如果看到 Steve Jobs 呢?

  3. 边界覆盖高

    假设用户名长度在1-6之间,那么我们在编写用户列表数据时,就可以写三条数据,用户名分别是AAbelAlbert,我们刻意有针对性编写的模拟数据在很大程度上起到单元测试的功能。

  4. 流程更完整

    必要时我们可以实现一些简单的逻辑,让操作流程更加流畅。比如在用户新增了一个用户之后,用户列表中就真的多了这个用户。

2.3 代码版本管理

模拟数据本质上就是代码,也需要你不断维护,也就产生了不同版本,加入代码版本管理以后,你就不用担心数据丢失,无法恢复的问题了。