通用技术 一次简单的测试探索与思考

企鹅 · 2019年09月04日 · 最后由 gggyy3 回复于 2019年09月11日 · 1644 次阅读

想了好久,不知道取什么标题,姑且暂时定这个标题吧。
在笔者的测试经历中,曾遇到过这样一个案例 身份证校验 输入 15 个 1 能校验通过。笔者曾经试图打算当 bug 反馈给研发,但凭借着职业敏感,决定尝试输入其他的测试条件 18 个 1 ,15 个 2 进行尝试, 结果在我的预料之中,这 2 次的输入测试是不合法的。那么问题来了,这 15 个 1 是否属于合法身份证? 带着这些疑问,笔者开始寻找真相。
首先在网上的一些身份证校验的网站上,大多数是认可 15 个 1 是合法的,少部分网站认为不合法,然而网上的一些技术党们争论不休。 回到这,我们不妨看一下身份证的验证规则 前 6 位 地区码 以此代表省 市 区 (县) 。中间 8(6) 位 是我们的出生年月日,剩下的是 3 位为顺序码 。其中 18 位身份证中的最后一位为校验码。倒数第二位为性别,这里对这个不在阐述。由于顺序码的产生是随机的,所以也不做讨论。
回到正题 15 位的身份证号(15 个 1)是否合法呢?接下来给大家看一张图:

看到这,可能很多朋友明白了,自己的身份证的最后一位是怎么来的了,不妨自己可以对照这张表,自己计算试试。 以本文的例子来说通过计算得到最后的和为 108 除以 11 得到的余数为 9.8 那么对应的数为 3 那么这个 15 位号码转换为 18 为既为: 11111119111111113 单从计算规则来看 ,那么这个在理论上是成立(合法)的, 我们现在把这个放到部分查询网站上去验证,得到的结果是通过的,但也有部分是不通过的,那么剩下的唯一可能性就是地区码的可能性了。 下一步笔者找了一些地区的地区码做进一步的验证。
北京 11、天津 12、河北 13、山西 14、内蒙古 15、辽宁 21、吉林 22、黑龙江 23、上海 31、江苏 32、浙江 33、安徽 34、福建 35、江西 36、山东 37、河南 41、湖北 42、湖南 43、广东 44、广西 45、海南 46、重庆 50、四川 51、贵州 52、云南 53、西藏 54、陕西 61、甘肃 62、青海 63、宁夏 64、新疆 65、台湾 (886) 71、香港 (852) 81、澳门 (853) 82。(这些只是省份代码)
下面我以北京以及湖南怀化的二个地区码为例由于受到地区码的影响故末尾的效验码随之做出改变:
110101 19111111 111X 、 431281 19111111 1112 在各大查询网站均查询通过。由于 6 个 1 的地区码并未在度娘中查到,因此如果严格按照身份验证的规则来说的话,本案例所说的 15 个 1 这条身份证号码是不存在的了。当然并不排除老的地区码的存在。
接下来我想讨论的是,需求是否一定要求严格的身份校验。 其次如果判断前面的地区码的话,如果有的县升级为市,部分区合并等等,可能会使用新的地区码,那么这个时候,是否在对程序进行判断,更改呢? 这样岂不是更麻烦? 其次这样带来的好处,以及做这个功能所带来的开发代码以及测试成本,整个之间的关系值得思考。

共收到 11 条回复 时间 点赞

如有不足之处,欢迎各位交流与讨论。

企鹅 关闭了讨论 09月04日 02:48
企鹅 重新开启了讨论 09月04日 02:49

https://github.com/jxlwqq/id-validator.py
一般的项目只验证号码是否符合规范吧,需要验证真实性的,可以对接第三方的接口,可以验证身份证和姓名是否匹配。

程序校验可以再严谨些,前六位是区号,跟着后面的 8/6 位是 4/2 位年 2 位月 2 位日,15/18 个 2 可以通过说明这 8/6 位没有做校验.因为月的取值范围是 [1,12]

一般要做写的简单的校验:是否纯数字、位数、前六位区号、出生年月日、性别位以及最后一位,这些我觉得作为一个正规的开发,都应该考虑的到。
再高级点的,对接第三方接口验证,比如 p2p,贷款等行业。
而且这些验证代码百度很多吧。

我觉得从常识性来判断,1111 年这个人存在么?那时候还没有身份证这一说吧,这明显就是一个 bug

kevin 回复

如果 15 位的话,那么他的出生年月日则为1911年11月11日,而 18 位的话 1111 年从常识判断确实可以判定为 bug ,而按照图中的列表结算,也是错的,末尾数也不应该为 1,而是 0

企鹅 回复

恩 严谨。

个人觉得需要看业务场景,比如金融行业的网站、需要校验严格。比如一些需求场景,比如一个注册网站,其实没必要校验的很细致。代码逻辑约复杂,其实后期的维护成本会越高。可以慢慢优化也是可以的

企鹅 #11 · 2019年09月09日 Author
minling2019 回复

所以我在 文末也提到了,需求是否严格要求效验? 与之带来的测试与开发 包括后期的维护成本....

企鹅 #12 · 2019年09月10日 Author

如各位所说的,如果不是需要严格实名的地方,其实很多时候只效验最后一位,和中间的年 月日 部分, 如果真的有必要,可以接入公安的系统进行验证了

学习了,之前在写测试用例的时候遇到身份证这个问题,也是很苦恼😂

企鹅 想请教一下怎么才能写出高质量的测试用例 中提及了此贴 04月13日 17:33
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册