如何写出具有高鲁棒性的代码?

马不停蹄的做了两周的Android开发.好久没做了,连最基本的内容基本上都已经忘记了.

在做Android开发的过程中,给我们的后台服务提交了大量的issue,这迫使我思考到底怎样才能写出健壮的代码.

在这片文章中,我将会介绍,我想到的方法.

TDD(测试驱动开发)

尽管这个在业界似乎还不是很流行,但是它对于保证代码的健壮性很重要.我们开发人员中的很多人,在开发完成后,不会写测试用例来对代码进行完整的测试.比如说,对于一个修改用户信息的功能,可能只会测试正确的输入.而对于那些异常情况,比如,我们知道,修改用户信息的接口,一定是需要传一个用户的uuid来识别是修改的哪位用户的信息,而用户(这里我们称前台开发人员为用户)在调用的时候,可能并没有传用户的uuid的情况,并不会测试到.对于这种情况,不够健壮的代码会给出500,服务器错误,而健壮的代码会给你一个错误信息,告诉你缺少了必要的参数.在我们的服务中,格式为:

{
    "code": "error_code",
    "data": "error_message"
}

但是如果我们在开发之前,确定下来我们的模块需要拥有的接口,以及接口需要的参数,进一步确定可能会有什么错误发生,并提前写好相应的测试脚本.在开发完成后,执行一下测试脚本,便能发现代码中的错误,代码还会不健壮吗?

还是上面那个例子,修改用户的信息的接口,假设我们允许修改的用户信息有:

  • 用户昵称(长度最长为20个字节,即最长20个英文单词,10个汉字)(必须传入)
  • 用户性别(1代表男,2代表女)(必须传入)
  • 用户出生日期(格式为YYYY-MM-DD)(必须传入)
  • 用户简介(长度最长为40个字节,即最长40个英文单词,20个汉字)(必须传入)

我们可以确定可能有下面的异常情况:

  • 用户没有传入表明用户身份的uuid
  • 用户传入了一个错误的uuid,即不存在的用户
  • 用户没有传入必要的参数,比如缺少用户昵称,用户性别等
  • 用户传了不合法的参数,比如传入了用户的密码
  • 传入的用户昵称为null
  • 传入的用户昵称为""(即空字符串)
  • 传入的用户昵称长度大于20字节
  • 传入的用户昵称为不支持的字符编码
  • 传入的用户性别格式不正确,比如传入'woman'
  • 传入的用户性别的取值不正确,比如传入了'3'
  • 传入的用户出生日期格式不正确,比如传入的格式为'YYYY-MM-DD hh:mm:ss'
  • 传入的用户出生日期取值不正确,比如现在是2017年,他传入的用户年份是2018或者1800,传入的月份是13,等
  • 传入的用户简介为null
  • 传入的用户简介为""(即空字符串)
  • 传入的用户简介长度大于40字节
  • 传入的用户简介为不支持的字符编码
  • 用户传入了正确的数据但是返回的结果不正确

我们根据上面可能的异常情况以及正确输入写一个测试脚本,在Java中,对于Restful接口,我们使用Rest Assured库.开发完成之后,只需执行一下测试脚本,就能发现程序中存在哪些错误.

做回归测试

我们在修复一个issue,或者增加新的接口的时候,并不能确保我们的修改对其他接口没有影响.所以,我们还需要做回归测试.如果上面写了TDD的测试脚本,那这里我们只需要在这个脚本中新增新接口的测试用例,再执行一遍测试就Ok了.如果没有上面的那个脚本,这里你也很可能就会因为嫌麻烦而不做.

我们项目组中的成员,很多次就是因为没有执行回归测试,而导致新接口能用而旧接口失效的问题.

将生产环境下数据库需要的约束同样加在开发环境下

数据库约束其实也是提高我们的代码健壮性的一个好帮手.比如,在新增用户的粉丝接口中(用户和粉丝的关系在一张单独的表中),我们需要用户传入的粉丝id是一个存在的用户的uuid.如果不用约束,我们需要在代码中先遍历数据库来查询用户是否存在,而如果我们直接使用外键约束,让粉丝id是用户id的外键,那么我们只需要查看数据库是否返回违反外键约束的错误就能确定用户是否存在了.

在修改用户信息的那个例子中,如果你没有先写测试脚本,忘了判断用户昵称是否为空,而你数据库中,用户昵称字段有非空约束.通过传入空昵称时这个非空约束报的错误,你就能知道需要先判断用户昵称是否为空.

永远不要认为你依赖的东西会正常工作

作为一个后台微服务,我们一定会用到数据库,会用到缓存.如果你假设数据库不会宕机,并没有处理数据库宕机的代码,那你的代码永远都不够健壮.一旦数据库宕机,前台就会返回大量的500,有心人就会有可乘之机了.

做压力测试

有的错误,如果你不做压力测试,是察觉不到的.比如,不正确的并发处理,死锁等问题.对于一个点赞接口来说,如果你用postman来进行测试,点一次结果正确,点两次结果正确,但是你并发的点一万次,结果可能就会因为并发处理不对而是9990了.

如果你没用数据库连接池,网络带宽足够大,并发执行十万次数据库写操作,数据库可能就会因此宕机(至少会有明显的网路延时),这时候如果你的微服务如果对外提供正确的错误信息,那恭喜,你的代码足够健壮了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,757评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • Java java8 default的用法 join方法和sleep方法 java内存模型 java-co...
    不不与阅读 246评论 0 0
  • 技能的习得需要熟练的技巧,坚持长期的练习以后,就能拥有不用思考也能行动的能力。这种变化需要量变引起质变,需要练习成...
    问天eric阅读 818评论 0 0
  • 2266128abc
    0娜娜子0阅读 149评论 0 0