关于BIZ层单元测试的一些想法
在进行单元测试的时候,对于Biz层的测试有个难点:Biz层的实现大部分都依赖于Dal层的对象,也依赖于最底层的数据。对于Dal的依赖我们可以通过Dal的单元测试来确保Dal层的实现是正确的。但是,对于数据的依赖,
我们如何来确信我们所依赖的数据是确定的、可信的呢?
问题在于,我们的数据大部分情况下都是通过DBMS来管理的,应用程序通过访问DBMS来操作数据。数据并不由应用程序直接控制,也就是说,我们可以访问、修改数据,但我们无法防止其他人对数据的修改(从程序层面上来讲)。当然,这可以通过我们自己构建一个新的、完全由我们自己操作的数据库来间接实现对数据的完全控制。但是,还有一个问题,在进行单元测试的时候,会有许多类会操作数据,而这些操作可能会改变数据。那么我在实现一个测试的时候,如何保证测试执行之前,测试数据是已知的、确定的。在测试之后,又如何还原到初始状态呢?毕竟,我可不想在写一个单元测试的时候,还要去考虑,其他的测试方法在本方法执行之前执行,数据有什么变化或问题。
所以,我希望有一个组件,能够帮助我固化样本数据,能够模拟数据操作(read、update、delete、insert),能够在运行测试之前装载样本数据并且能够在运行之后将样本数据还原到初试状态。
整个系统分为3部分:以Xml形式存放的样本数据以及相互的关系、一个虚拟数据中心---这个中心能够读取Xml中的样本数据和相互关系、能够模拟数据操作、能够在期望的时候重新初始化样本数据。最后一部分为Dal层对象对应的Mock对象。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif
第一部分:将样本数据以及数据之间的关系Xml化。
对于数据的固化而言,XML是最好的选择。但为了系统的扩展性,设计的时候,还是应该秉持
纯虚构GRASP原则。
这一部分的主要功能是,根据用户提供的连接字符串,读取目标数据库的Schema,并以XML
的形式固化他们。这里的数据库的Schema包括表、字段、视图、主键、外键、唯一约束。为了帮助
用户组织样本数据,系统还应该提供友好的界面来辅助用户组织样本数据并持久化到XML文件中。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif
第二部分:虚拟数据中心
此部分为组件的核心部分,也是编写单元测试时需要调用的部分。作为虚拟数据中心,需要承
担的责任有:
1.
从Xml中装载样本数据以及数据之间的关系。
2.
模拟对样本数据的read、update、insert、delete操作。并且所执行的这些操作不能违背已存在的数据关联。也就是说不能破坏样本数据的完整性。
3.
回滚对样本数据的操作,使得样本数据恢复到初始状态。
4.
当样本数据被破坏时,可以重新装载样本数据以及数据之间的关系。
为了便于管理以及降低复杂度,虚拟数据中心封装装载数据及关系的DataSet(has a 方式),仅
暴露出一些由虚拟数据中心提供的属性和方法来操作数据。同时,因为虚拟数据中心还不够成熟,因此,提供以两个下划线开头的名为__InnerDataSet的属性来直接操作数据,但不建议这么直接操作,除非您十分熟悉框架结构并且虚拟数据中心提供的方法无法实现您的目的的时候才这么做。
所有从虚拟数据中心方法或属性返回的DataTable、DataSet等对象都是虚拟数据中心内部对象的深拷贝对象,也就是说,操作这些返回值对象并不会影响虚拟数据中心中的数据。只有当直接调用虚拟数据中心提供的方法时,才会影响数据。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif
第三部分:Dal层对象的Mock对象。
当我们在写Biz层的单元测试时,并不是直接操作模拟数据中心来进行检验。我们现实中的Biz层的实现是基于Dal之上的。因此,正确的方式是对于每一个Dal层的对象定义一个对应的Mock对象来模拟它。
其实,本部分并不属于数据模拟中心组件。但组件所提供的功能都是为了本部分服务的,所以 也拿出来特别说明一下。
页:
[1]