《测试驱动数据库开发》——1.3 什么是障碍

1.3 什么是障碍

测试驱动数据库开发
那么,真正的问题是什么呢?是什么真正阻碍了测试驱动数据库开发的实现?从根本上讲,上面这个问题的答案就是数据库—单独的服务器和数据库实例,即持久化解决方案的运行平台。与一个用于创建一组最终能够被装载到任何特定会话的应用程序的二进制文件的设计相比,一个单独的数据库更像是一个包含 JVM 和一个应用程序的特定会话的进程。

开发人员需要摆脱不良的做法,转向构建不再绑定任何特定数据库实例的数据库设计。

1.3.1 数据库就是对象

数据库就是对象,从面向对象编程的程序员的角度看,它们是长期存在的对象,即便如此,它们仍然是对象。现如今,许多人对待数据库的方式类似于软件开发早期计算机程序员针对计算机本身编程,而不是针对那些能够运行在计算机上的程序编程。

除了一些遗留系统,上述开发应用程序代码的方式因为一些原因而像渡渡鸟1那样绝迹了。最明显的原因是现代计算机环境的复杂性要求能随时随地新增或移除硬件。另一个原因是很多应用程序不得不运行在多种多样的硬件上,或者运行在物理上与开发软件的程序员分离的环境中。

1.3.2 TDD适用于类,不适用于对象

对于数据库领域中的 TDD 来说,其最大的障碍存在于测试的内在本质中。测试天生就是在对象之上进行操作的。当一个人运行手工测试时,他把大量的对象作为接口并与之打交道,包括正使用的应用程序的一个实例和与之交互的大量业务逻辑对象的实例,这些实例根据它们的输入和/或输入产生的结果来作出决定。

其他产业并不是像上面描述的那样做测试。生产需要长期使用的绝对关键产品的公司,如为替换受损髋关节而生产人工髋关节的公司,是需要测试从生产线下来的每一件产品的。而生产那些不是长期使用或不大可能因为产品失效而造成严重人身伤害的产品的公司,如生产铅笔的公司就通过测试产品在统计学领域的显著部分来近似做到测试他们生产的每一件产品。

为什么软件开发人员能够不用测试每一件产品,而仅仅测试他们所做的一些实例呢?

在软件产业,能够像这样做测试可能是因为同一个类的两个对象能做出完全相同的行为。你能用一个类产生任意数量的对象,所有这些对象都具有完全相同的行为。

软件开发者进行开发的这一独特特性,允许一个类的任一实例能作为该类其他每一个实例的模板。这意味着,仅仅对一个对象进行测试就能获得这些对象的类的情况,并能获得该类已经和即将创建的所有对象的情况。

然而,如果开发人员所处的情况与上述情况不同该怎么办?如果一个类的每一个实例都是通过手工或者通过在另一台计算机上的一个不可靠的过程组装成的,那该怎么办?在这种情况下,测试一个对象就不能获得另一个对象的情况。开发者必须测试所构建系统的有统计学代表性的一个子集,而需要做的测试数量将与可以接受的风险数量相匹配。

这就是在数据库世界中开发者所面临的处境。开发者开发了一个设计,很少能有一个容易的方法来将该设计的变化引入到新的或现存的数据库实例中。更多的时候,开发者会在某类数据库的所有各种重要的实例上手工调节设计的变化,这等同于在每一台需要作出更新的计算机上手工修改和检查汇编代码(或者是一些非常初级的源代码),然后在那台计算机上重新编译二进制代码。

当开发者以上述方式开发时,就近乎于需要测试所创建的每一个产品实例。然而,在软件产业,测试通常需要对所测试的对象大动干戈,而开发者不能让产品实例上的实时数据遭受测试带来的那种危险。一些数据库实例,特别是生产数据库,根本就无法进行测试。

1.3.3 我们需要数据库的类

如果开发者需要了解一个数据库的情况,但是不允许对其进行测试,就需要找到一种方法,通过测试一个代理来了解那个数据库是正常工作的。正如本书已经提到的,在应用程序开发世界中允许我们做此事的机制就是类。

因此,测试驱动数据库开发的基础就是建立数据库的类,而不是建立特定数据库的实例。定义的类负责构建和更新测试实例。在从测试实例中获得足够多的反馈来验证对一个类所做的变化之后,接下来该类就以更新测试实例完全相同的方式来更新生产数据库。

相对于那些开发者不想运行任何测试的产品实例来说,通过这种方式可以确保测试实例是个良好的模板。在本书的整个内容中,读者将看到同样的过程不仅允许检查对数据库的修改做了什么,还能检查修改是如何被引入的。当开发者想要把一个数据库的修改发布到任何一个生产环境中时,你完全有信心相信上述修改“是能够工作”的。

1渡渡鸟,或作嘟嘟鸟(Dodo),又称毛里求斯渡渡鸟、愚鸠、孤鸽,是仅产于印度洋毛里求斯岛上一种不会飞的鸟。在被人类发现后仅仅200年的时间里,这种鸟便由于人类的捕杀和人类活动的影响彻底绝灭,堪称是除恐龙之外最著名的已灭绝动物之一。引自百度百科。—译者注
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-10-28 23:39:07

《测试驱动数据库开发》——1.3 什么是障碍的相关文章

《测试驱动数据库开发》目录—导读

版权声明 测试驱动数据库开发 Authorized translation from the English language edition, entitled Test-Driven Database Development: Unlocking Agility, 9780321784124 by Max Guernsey, III, published by Pearson Education, Inc., publishing as Addison-Wesley, Copyright 2

《测试驱动数据库开发》—第2章2.1节TDD中类的角色

第 2 章 建立数据库的类 测试驱动数据库开发 开始测试驱动数据库时,需要做的第一件事是定义数据库的类,并且不用过多地担心特定的数据库实例.读完本书后,读者将有可能开始从允许任意的手工修改,转变到允许保持任意有意义的数据库实例.为了帮读者达到这个目的,本章将深入讨论什么是类以及类如何能够提供帮助,还将深入探讨在数据库开发中的影响力是如何不同于应用程序开发的影响力的. 在调和了类的本质与在数据库开发中出现的新的影响力之后,本章展现了一个数据库的类的需求,并展示了如何实现该需求.希望能为开发者提供与

《测试驱动数据库开发》——2.1 TDD中类的角色

2.1 TDD中类的角色 测试驱动数据库开发 在测试驱动开发中,一个类的主要作用是提供一种机制,以便许多具有相同行为的对象能够被创建.这一点非常重要,因为测试软件的方式就是通过检查一个单独对象的行为,并据此来预知从该对象的类生成的所有其他实例的行为. 当没有类时,测试仅仅告诉开发者有关某个特定对象的情况.当有了类时,测试会告诉开发者有关对象将如何被创建的情况,并进一步告诉开发者所有其他对象将如何被创建的情况. 2.1.1 可靠的实例化过程 当人们说"我写了一个对象来做X事情"时,事实上

《测试驱动数据库开发》——2.2 面向对象编程语言中的类

2.2 面向对象编程语言中的类 测试驱动数据库开发 为何对象的类来到应用开发世界的时间要远远比数据库的类早呢?首先,与在应用开发世界相比,在数据库世界中能让类成为必要元素的影响力没有那么强大,这一点先暂且不谈.其次,相比创建数据库实例,我们能够更加容易地建立可靠的方法来在应用会话中创建对象. 2.2.1 类的构建很容易:构建新对象即可 在面向对象编程的世界中,类其实仅有两个职责:创建新对象和析构(destroy)被废弃的对象.就本书的目的而言,析构其实并不重要.然而,对象的创建绝对是重要的. 在

《测试驱动数据库开发》—第2章2.2节面向对象编程语言中的类

2.2 面向对象编程语言中的类 测试驱动数据库开发 为何对象的类来到应用开发世界的时间要远远比数据库的类早呢?首先,与在应用开发世界相比,在数据库世界中能让类成为必要元素的影响力没有那么强大,这一点先暂且不谈.其次,相比创建数据库实例,我们能够更加容易地建立可靠的方法来在应用会话中创建对象. 2.2.1 类的构建很容易:构建新对象即可 在面向对象编程的世界中,类其实仅有两个职责:创建新对象和析构(destroy)被废弃的对象.就本书的目的而言,析构其实并不重要.然而,对象的创建绝对是重要的. 在

《测试驱动数据库开发》——2.5 实现

2.5 实现 测试驱动数据库开发至此,前面描述的方式能够让读者初步地刻画和实例化数据库的类.下面将介绍一些实现一个数据库的类的方法.本书先从总体需求入手,然后提供一个数据库类的伪代码实现,可以将其移植到任何平台上. 2.5.1 需求 让我们来看看一个良好的数据库的类的实例化机制应该是什么样子的.了解这些需求能够让你编写自己的机制,或者当你面对的需求明显不同于本书描述的情况时,可以调整本书建议的机制,从而适应你的具体情况. 我已经确定了4个需求,并用4个以字母C开头的单词来分别描述之,称其为"4C

《测试驱动数据库开发》——2.4 增量构建

2.4 增量构建 测试驱动数据库开发那么,该如何与上述机制进行交互呢?最好的方式应该是把数据库的每一次变更当做一个单独的版本用文档记录下来,并找到一个好方式(如版本号)来将这些变更进行排序.只要数据库能够标识已经发生了哪些变更,就能构建一个通用的机制来按正确的顺序实施正确的变更. 2.4.1 用文档记录每一次数据库的变更 开始的时候,只编写涉及一个变更的脚本.只要该脚本没有在重要的数据库上运行,就可以根据开发人员的意图,或者根据需求的变化,来随意地修改这个脚本.此时,该脚本其实是在不久的将来要做

《测试驱动数据库开发》—第1章1.2节谁是目标读者

1.2 谁是目标读者测试驱动数据库开发在讨论问题真正的本质是什么和如何解决问题之前,先谈一下关于本书的目标读者.任何读者都可能从本书获取价值,但在使用这本书之前,读者需要具备一些必备的技能. 1.2.1 TDD和OOP为了运用好本书中涉及的技术,读者需要理解测试驱动开发和面向对象编程的好处,但不必是这两方面的专家,只需要知道实现上述两个方面之后所带来的好处是什么.下面这些论断是有意义的. TDD通过让开发者保持在正确的轨道上,以使你能够快速地开发. OOP通过把不相关的事物进行封装并彼此分离,以

《测试驱动数据库开发》—第1章1.4节小结

1.4 小结测试驱动数据库开发在写本书时,精益和敏捷软件开发正在全球大行其道,但是数据库开发在开发过程中仍然是瓶颈.为了消除阻挡整个组织的障碍,开发人员必须找到如何让数据库快速变化的方法. 然而,不能以牺牲对变化的信心来换取快速的变化,数据库是如此重要,以至于不能容许有任何额外的风险.这里 TDD 就可以派上用场了,与那些没有使用TDD缓慢的最小心翼翼地做出的变化相比,TDD能让开发者冒更小的风险而做出更频繁.快速的变化. 即使这样,开发者还是不能简单地将已经学到的适用于"常规"软件开

《测试驱动数据库开发》—第2章2.3节数据库的类

2.3 数据库的类测试驱动数据库开发尽管事实上,大多数的时候,数据库就是上面保存那些不被使用的对象内容的"其他地方",在数据库开发中运用上述模式一点也不切合实际.与上述描述最接近的做法,应该是当每次想更新对象的行为时,就从旧数据库中迁移数据到新创建的更新后的对象中.对于许多数据库来说,上述做法可能仍然比许多人现在做的方式要快许多,但是因为还有另一种支持比这还要快的开发过程的做法,因此就将上述做法作为一个可选项而不再继续讨论了. 2.3.1 两条途径:创建或改变在许多系统中,创建某&qu