单测原则

为何使用单元测试

它可以测试现有以及未来的功能模块,保证了代码质量。它强制你书写具有可测性,低耦合的代码。这比手工回归测试廉价的多。如果测试不匹配,可以考虑修改单元测试或者修改代码结构,这可以帮助判断合理性,而不是直接让不合理的代码上线。它将提高代码可行度,协助团队工作

测试原则

  1. 不应该编写成功通过的单元测试:它们应该被写成不通过的。你可以在几分钟内让任何一组测试通过,但这只是在欺骗你自己
  2. 测试类应该只测试一个功能:你应该用一个功能去测试一个方法。否则,你会违反了单一职责原则
  3. 测试类具备可读性:确保测试类标有注释并且容易理解,就像其他的代码一样。以后的维护者会在阅读实现前去阅读你的测试,这将帮助他们在调试前理解被测类的逻辑
  4. 良好的命名规范:测试用例的变量和方法都要有明确的含义。比如,将预期结果保存到 expectedFoo 变量而不是只保存到 foo。如果要测试很多复合结果,可使用组合变量名称诸如:inputValue_NotNull, inputValue_ZeroData, inputValue_PastDate等等。再次测试时应该像其他代码一样,便于人们理解
  5. 把断言从行为中分离出来:你的断言应该用来检验结果,而不是执行逻辑操作的
  6. 使用具体的输入:不要使用任何的自动化测试数据来输入,像 date() 这些产生的数据会引入差异
  7. 把测试类分类,放在不同的地方:从逻辑的角度看,当没有错误指向特定的问题时这更容易去查找
  8. 好的测试都是一些独立的测试类:你应该让测试类与其他的测试、环境设置等没有任何依赖。这利于创建多个测试点
  9. 不要包含私有的方法:他们都是一些具体的实现,是被封装起来的,并不是 API,不应该包含在单元测试里
  10. 不要连接数据库或者数据源:如果测试中需要连接数据库操作,必须使用 mock,每个新的测试方法都自主引导到临时数据库
  11. 测试用例不要连接网络资源:测试某个方法时无法确保第三方诸如网络和设备的有效性(使用mocks)
  12. 一个测试不要超过一个模拟(mock对象):我们努力去消除错误和不一致性
  13. 单元测试不是集成测试:如果你想测试结果,不要使用单元测试
  14. 测试必须具有确定性:你需要一个确定的预测结果,所以,如果有时候测试通过了,但是不意味着完成测试了
  15. 保持你的测试是幂等的:你应该能够运行你的测试多次而不改变它的输出结果,并且测试也不应该改变任何的数据或者添加任何东西。无论是运行一次还是一百万次,它的效果都应该是一样的
  16. 测试类一次仅测试一个类,测试方法一次仅测试一个方法:组织方法能够在问题出现时检测出来,并帮你确定测试依赖
  17. 测试用例要验证预期的异常:Java 中使用 @Test(expected = MyException.class)
  18. 不要使用你自己的测试类去测试第三方库的功能:大多数好的库都应该有它们自己的测试,如果没考虑用 mocks 去产生一致性的结果的话
  19. 限制规则:当在一些规则下写测试时,记住你的限制和它们(最小和最大)设置成最大的一致性
  20. 测试类不应该需要配置或者自定义安装:测试用例在任何情况下都可运行,并且不需要配置和人工干预
  21. 测试用例干净整洁:程序中不要有流程控制语句(switch,if 等)。一个好的测试用例处理顺序简单直接,准备数据,验证结果顺序,如有必要,使用子方法分解结构,让测试用例更加易读。如果是多场景,使用多个方法测试;一个测试用例的方法代码长度最多满屏,不要有滚动条,大概在 1 到 20 行左右。如果测试代码太长,考虑拆开成多个方法,以避免混在一起相互干扰
  22. 测试用例通过当前测试,并且易于改进:测试用例要能够支持代码的演变,如果很难维护或者代码太轻而不能细化,那就成了负担(很多人不写单元测试用例就是这个原因)
  23. 测试用例帮我验证了代码架构:如果你不能测试某个方法或者类,那么你的设计就不够灵活
  24. 测试用例运行速度快:慢的测试会把你拖垮,快的速度会鼓励你经常运行他们,它还能帮助你减少持续集成系统上的构建时间
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,080评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,714评论 2 59
  • “朦胧的街灯,静静躺在小雨中。往事又掠过我心头……今宵微寒,路上行人匆匆,朦胧的街灯孤立在小雨中,远处传来悠悠的歌...
    千千千山阅读 834评论 0 1
  • 他喜欢赌球,逢赌必输。 和所有赌徒一样,每一次赌,都下定决心是最后一次,同样,永远不会是最后一次。 精准的预测还是...
    俗人杂文阅读 274评论 0 2