测试并不能改进产品质量
今天看到了有人给出了这样的观点,那就是测试并不能改进产品质量,觉得挺有意思的,所以把作者的原文翻译一下,希望对大家有所裨益。
在世界上有一种天经地义的看法,那就是在软件开发过程的早期预防问题会比在测试后期发现问题带来更高质量的产品,但那不是真的。
这是不真实的,但不是因为大多数人可能首先想到的原因。问题不在于尽早解决问题是个坏主意。这通常是一个非常好的主意。
问题是,测试自身不会导致更高质量的产品,在所有。问题预防和测试是不同的追求。测试不能预防问题,测试不能改进产品。
对我而已——一名教师和熟练测试的倡导者——这可能看起来很疯狂,但这是真的。称体重不会让你减肥。验血不会让你更健康。学校的标准化考试不会让孩子更聪明,当然也不会提高教育质量。
测试可以做的是通过质疑产品以对其进行评估来提高我们对可能摆在我们面前的事物的理解和意识。测试——通过体验、探索和试验了解产品来评估产品的过程——帮助我们意识到可能需要解决的问题。
在日常生活中,浴室秤上的某个特定读数可能会促使我们更加谨慎地进食,或者进行更多的锻炼。验血可能会促使医生开抗疟疾药物。这些标准化的学校考试可能会建议改变课程、教育资金或教师培训。但在有人采取行动之前,测试只会提高对现状的认识,而不是情况本身。
在软件开发中,除非有人解决测试帮助我们发现的问题,否则改进不会发生。当然,如果问题没有被发现,改进的可能性就会大大降低——这就是测试如此重要的原因。测试帮助我们了解我们拥有的产品,因此我们可以判断是否是我们想要的产品。在需要改进的地方,测试揭示了改进的必要性。
有些人认为测试要求我们操作产品,这是软件开发流程的一部分。确实这是是一种非常重要的测试,但也只是产品测试的一种方式而已。
将产品更广泛地理解为某人生产的东西会很有帮助。这意味着我们可以有单元,模块,原型等多种手段的测试。
尽管我们通常将其称为审查,但我们确实可以在产品开发之前就进行全方位的思考,在这种情况下,产品其实就是之前所有的讨论,设计和思考的产出物,测试其实在产品的研发的初期就开始了。
测试的结果是通过这些活动进行的评估和学习。这种学习可以应用于产品——但它是响应测试而发生的事情,而不是测试本身,这是可以改进产品。
正如测试不能改进产品一样,测试也不能防止问题。作为测试人员,我们有一个持久的信念,即我们被要求测试的任何东西都已经存在问题。也就是说,产品中的问题在我们遇到之前就已经存在。
那么,如果测试不能预防问题,那又有什么用呢?测试可以帮助我们意识到存在的问题,然后人们可以进行更改以防止这些问题进一步发展。
在开发早期尝试预防问题是一个好主意。如果尝试能够成功,我们就更有可能开发出高质量的产品。尽管如此,即使是高度规范的开发过程也可能会出现问题。至少有两种方法可以确定是否发生了这种情况。
第一种方法是全程测试产品。通过与一系列客户互动并了解他们所做的事情,确定我们开发的东西就是客户想要的。通过检查和讨论,测试那些最初模糊然后却越来越清晰的设计。
另一种方式是在代码开发的初级就做单元测试,然后在后续的构建步骤里进行集成测试,code review,静态代码扫描和自动化测试,从而找出组件自身的问题或者是配置的问题。这些形式的测试通常不是很深入——这是一件好事,因为深度测试可能需要时间、精力和准备,这可能会对开发人员造成更多负担。
在开发人员测试的同时,测试人员专注于并执行深度测试。深度测试的目标是测试少见的、隐藏的、微妙的、偶尔发生的、紧急的错误,这些错误可以通过手工测试或者探索性测试来发现。
如果您的问题预防和问题缓解策略是成功的,并且你的代码和产品是可测试的,那你不太可能在测试后期遇到一些显而易见的低级问题。如果您不需要测试和报告这些问题,那么后续的深度测试会相对更快、更容易。
如果您的问题预防和问题缓解策略不成功,全面和深入测试是找出问题的一种方法。您发现的问题可以解决;可以改进产品,并且可以在产品交付之前防止业务和客户出现问题。
当人们面临损失、伤害、不良情绪或价值降低的风险时,最好在为时已晚之前意识到问题,这就是测试的终极意义之所在。
测试本身既不能防止问题也不能改进产品。但是测试确实可以预测需要预防的问题,并且测试可以照亮产品需要改进的地方。
因为全文大部分是机翻,所以行文肯定有不流畅的地方,另外加上作者本身的笔法比较曲折,有一些点机器翻译可能难以驾驭,因此全文可能看起来观点比较分散,没有强一致性,不过大家可以简单的意会,忽略那些遣词造句里的机器感。
总而言之作者的观点其实并不离经叛道,而且还是有一定的道理的,比如癌症筛查并不能治疗癌症,不过如果你尽可能早的可以通过筛查确定自身的风险,提前治疗和预防,那么癌症很有可能将不会发生。测试也是如此,测的再多开发和产品不去修改,那么产品本身的质量也不会得到改进,但是如果我们频繁的提前的进行测试,那么我们就可以尽早的暴露问题,我们的开发和产品也就会有足够的时间去进行修复工作。这也是为什么我们总强调bug生命周期的原因,测试并不只是简单的提bug,而是要尽早提bug,并保证bug得到及时修复并得到验证。