核对是证实和确认
核对是我们试图去证实它是存在的,核对是一种证实,确认的过程。当我们已经相信一件事情是存在的,我们通过核对来证实它。当我们修改或者增加程序的代码时,我们想保证原来已有的功能还会正常工作。当我们有一个重要的假设,我们通过核对知道这个假设是正确的。当修改源程序时,编写自动测试的实例时,优秀的程序员做许多核对的工作来保证程序不会瘫痪。通过核对来保证程序会正常运行。
测试是探索和学习
测试是通过做些什么来试图发现新的信息。测试是一种探索,发现,调查和学习的过程。当我们配置,操作和观察一个软件产品的时候,我们想要去评估, 想要发现一些缺点, 我们需要测试它。我们通过测试来发现产品和产品的设计的范围和限制。测试着重在于充分的了解和发现软件产品怎样工作和怎样不工作。
核对是机器决定的,测试需要智慧
核对提供一个二进制的结果,对或错,是或不是。核对就是提问和回答这样的问题,“这个假设或断言是对还是不对?”这些简单的断言是机器决定的,数值中立的。
测试有一个无限的结果。测试就是提问和回答这样的问题,“这里有没有问题?”回答这样的问题需要大量的人类的观察和判断。
当核对通过时,我们不知道程序是否工作。我们只知道它在期望的范围内工作。当所有的核对都通过时,程序也许有很严重地问题。核对能证明缺陷的存在,但不能证明缺陷的不存在。计算机能识别程序让它发现的问题,但是不能发现新的问题。测试也不是告诉我们这个程序是否工作,而是提供大量的参考明证来处理“问题或者不是问题”的答案。
测试部分地是发现我们的核对是否足够的过程。当我们通过测试发现问题的时候,我们的正确反映是在核对问题列表中加上一个或更多的核对来保证这个问题不再出现。
不管我们是否做自动测试,如果我们能够表达我们的问题以至机器能通过断言来提问和回答问题, 那么这个问题就属于核对的问题。如果它需要人的智慧的过程来做,这个问题就应该通过测试来做。
当我们谈论测试,不管在什么级别,如果我们委托机器来做通过或者失败的结论,那么我们在谈论自动核对。所以我们通常所谓的Unit tests, 就是Unit核对。同样的道理,automated acceptance “tests”就是自动接收核对。
测试不是质量保证,但是核对是质量保证
你可以保证你控制产品的质量,就是说,你能提供满足某种级别的,满足某些程度的质量需求的保证,并且你能接收是你的责任问题如果产品没能完成那种需求。如果你没有权利改变一些事情,你就不能保证它的质量,虽然你能评估,你能报告你所发现的问题。测试不是质量保证,它是为质量保证服务的。我们提供信息给有权利做项目决定的经理和程序员。
程序员作的核对,大部分是质量保证的实践。当程序员写代码的时候,他核对他的代码。他可能直接执行他的代码,并且观察执行的结果,也可能在调试时观察代码的行为,但是通常程序员写一些例行程序来调用源代码并且执行一些assertions函数。我们称此为单元测试,但是这确实是核对,因为这是确认已经存在的知识是否正确。在此环境下,发现新的信息会认为是惊奇的事情,并且不是值得高兴的事情。没有通过的核对提示程序员去修改源程序来实现程序应该作的事情。程序员作的核对是质量保证的天使,他们通过核对帮助保证质量。
测试是寻找新的信息,这样说来不是质量保证的实践。应该说测试的结果通知质量保证。测试是为信息的目的而收集信息的决定,是为了评估的目的向产品发问。产品评估不能保证它的质量,但是它通过这种影响来通知决策者。测试也可能包括许多核对。