3 回答
TA贡献1865条经验 获得超7个赞
根据您的外观,您会得到略有不同的答案。我已经读了很多关于这个主题的内容,这是我的精华; 再次,这些是略微愚蠢的,其他人可能不同意。
单元测试
测试最小的功能单元,通常是方法/函数(例如,给定具有特定状态的类,在类上调用x方法应该导致y发生)。单元测试应该集中在一个特定的功能上(例如,当堆栈为空时调用pop方法应该抛出InvalidOperationException
)。它触及的一切都应该在记忆中完成; 这意味着测试代码和被测代码不应该:
呼唤(非平凡)合作者
访问网络
点击数据库
使用文件系统
旋转一个线程
等等
任何缓慢/难以理解/初始化/操作的依赖都应该使用适当的技术进行存根/模拟/处理,这样您就可以专注于代码单元正在做什么,而不是它的依赖关系。
简而言之,单元测试尽可能简单,易于调试,可靠(由于外部因素减少),执行速度快,有助于证明程序中最小的构建块在组合之前按预期运行。需要注意的是,虽然你可以证明它们完全孤立地工作,但代码单元在组合时可能会爆炸,这使我们...
集成测试
集成测试建立在单元测试的基础上,通过组合代码单元并测试生成的组合正确运行。这可以是一个系统的内部结构,也可以将多个系统组合在一起以做一些有用的事情。此外,将集成测试与单元测试区分开来的另一个因素是环境。集成测试可以并将使用线程,访问数据库或执行所需的任何操作,以确保所有代码和不同的环境更改都能正常工作。
如果您已经构建了一些序列化代码并且单元测试了它的内部而没有触及磁盘,那么当您加载并保存到磁盘时,您怎么知道它可以工作?也许你忘了刷新和处理文件流。也许你的文件权限不正确,你已经在内存流中测试了内部。唯一可以确定的方法是使用最接近生产的环境来测试它“真实”。
主要的优点是,他们会发现单元测试无法发现的错误,例如布线错误(例如A类的实例意外收到B的空实例)和环境错误(它在我的单CPU机器上运行正常,但是我的同事的4核心机无法通过测试)。主要缺点是集成测试会触及更多代码,可靠性降低,故障难以诊断且测试难以维护。
此外,集成测试不一定证明完整的功能有效。用户可能不关心我的程序的内部细节,但我这样做!
功能测试
功能测试通过将给定输入的结果与规范进行比较来检查特定功能的正确性。功能测试不涉及中间结果或副作用,只是结果(他们不关心在执行x之后,对象y具有状态z)。它们被编写为测试规范的一部分,例如“调用函数Square(x),参数为2,返回4”。
验收测试
验收测试似乎分为两种类型:
标准验收测试涉及在整个系统上执行测试(例如,通过Web浏览器使用您的网页),以查看应用程序的功能是否满足规范。例如,“单击缩放图标应将文档视图放大25%。” 没有真正的连续结果,只有通过或失败的结果。
优点是测试用简单的英语描述,并确保整个软件功能完整。缺点是你已经在测试金字塔上移动了另一个级别。验收测试触及大量代码,因此追踪故障可能会非常棘手。
此外,在敏捷软件开发中,用户验收测试涉及创建测试以镜像在开发期间由软件客户创建的用户故事。如果测试通过,则意味着软件应满足客户的要求,并且可以认为故事是完整的。验收测试套件基本上是以域特定语言编写的可执行规范,该语言描述了系统用户使用的语言中的测试。
结论
他们都是互补的。有时,关注一种类型或完全避开它们是有利的。对我来说,主要的区别在于,一些测试从程序员的角度来看待事物,而其他测试则以客户/最终用户为中心。
添加回答
举报