开发者测试技术十三问
为什么要做测试?
一个段子:
千万不要跟程序员说,你的代码有bug,他的第一反应是你的环境有问题,第二就是你是傻逼不会用吧?
你要跟他这么说,这个程序运行的怎么运行的跟预期不一样,是我操作有问题吗? 这货就会第一反应,我擦,这是不是出bug了?
所以程序员自己潜意识里还是会认为自己的程序可能有问题的。测试,就是要把问题揪出来!
测试也要讲究经济学?
有关成本的问题:测到什么程度?
有关策略的问题:黑盒测试、白盒测试?
测试还要讲究心理学?
- 应当一开始就假设程序中隐藏着错误
- 人类行为总是倾向于具有高度目标性
- 发现了程序错误的测试是成功的,而没有发现程序错误是失败的
- 如果你在写代码的时候有盲点,测试的时候也会有同样的盲点
为什么我们不喜欢测试?
- 测试的目标就是要找出错误,与其他开发活动背道而驰。
- 测试没有尽头,永远无法彻底证明程序完全正确。
- 测试本身不能改善软件质量。
- 测试要假定能找到错误,否则将是自我实现的预言:想着自己的程序没有错误,将难以设计用例并执行测试出很多存在的问题。
测试有哪些类型、策略?
- 单元测试
- 组件测试
- 集成测试
- 回归测试
- 系统测试
- 黑盒测试
- 白盒测试
- beta 测试、客户验收测试、性能测试、配置测试、平台测试、压力测试、易用性测试等。
测试的类型与开发活动有什么对应关系?

软件测试要遵循什么原则?
- 每个测试用例必须明确定义输入数据与预期输出。
- 避免由开发人员测试自己编写的程序。
- 避免由开发团队测试自己开发的程序。
- 彻底检查每个测试用例的执行结果。
- 测试用例应当覆盖无效的输入和未预料到的输入情况。
- 需要同时检查程序“做了应该做的”和“没做不应该做的”。
- 避免设计的测试用例用完即弃。
- 规划测试工作时不能假定测试不会发现错误。
- 程序多个模块相较而言,某个模块存在的未发现的错误数量,与已发现的错误数量成正比。
- 软件测试是一项极富创造性、极具智力挑战性的工作。
测试与调试有什么区别吗?
测试(Testing)是一种检查错误的方法。而调试(Debugging)意味着错误已经被发现,要做的是诊断错误并消灭造成这些错误的根本原因。
如何设计测试用例?
- 对每一项需求进行测试,确保对应功能都已实现。(“干净测试”,让代码正常工作的测试。
- 在需求阶段就开展测试用例的设计,可以反过来促进对各个方面的需求项的明确。
- 对每一项设计关注点进行测试,确保设计都已经实现。(“白盒测试”,验证实际的代码与设计一致。)同样最好在设计阶段就尽早开展相关测试用例的设计。
- 编码完成后,设计覆盖每一行代码的测试用例;设计所有可能数据流的测试用例。
什么是测试驱动开发?
- TDD(Test Driven Development),也叫测试先行。被称为是最佳实践。
- 提早发现缺陷,从而提早修复,也就降低了巨大的开发成本。
- 提早发现缺陷是因为促使了更加仔细地思考需求和设计。
- 测试先行不是所有事情都是提前做,主要是用例先行设计,具体的执行是后行。
开发者测试有什么局限性?
- 开发者倾向于“干净测试”(clean tests)。只做让代码正常工作的测试,而不是覆盖所有可能让代码失效的测试,也就是“肮脏测试”(dirty tests)。
- 开发者测试往往对覆盖率有过于乐观的估计。
- 开发者测试往往会忽略一些更复杂的测试覆盖类型。比如认为覆盖每一条语句已经达到完美,忽略了对每一个分支的覆盖是更好的标准。
开发者测试到底有什么用?
- 用于评估正在开发的产品的可靠性。即使不进行修复或无法完成修复的情况,依然可以做出评价。
- 用于指导对软件的修正。这是最常见、最基本的利用。
- 用于归纳程序中最常见错误的类型,在以后开发中规避。
开发者测试应该花多少时间?

参考资料
《代码大全》
《软件测试的艺术》
2021-09-16
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
