题
我这种混乱所有的时间。如果我写代码,它使用的假码断言一些操作,我怎么信任我的真正执行时,它是开始真正采用真正的对象,而不是假的。
例如,我们这代码--
[Test]
public void CanCreateContactsWithData()
{
using(ISession session = factory.OpenSession())
using (ITransaction trans = session.BeginTransaction())
{
_contactId = (long) session.Save(contact);
trans.Commit();
}
Assert.AreNotEqual(0, _contactId);
}
这个代码测试实施"接触"的对象是否得到保存入数据库或没有。如果我发生了使用存根,而不是一个真正的数据库连接,我需要有独立的测试对于其储存在数据库?和你们叫这作一体化测试?
答案都是真诚的赞赏。
解决方案
马丁*福勒有一个良好的讨论 在这里,.
从他的文章:
梅萨罗斯使用的术语测试的双重作用的通用术语对于任何一种假装的目中使用的地方的一个真正对象的用于测试目的。这个名字来自这一概念的一个特技双在电影。(他的一个目标是避免使用任何名称已经广泛使用。) 梅萨罗斯然后再定义的四个特定种类的双:
- 虚设的对象是传递,但实际上从未使用。通常他们只是用于填写参数清单。
- 假象实际上有工作实现,但通常需要一些快捷方式,这使得它们不适合用于生产(在存储器数据库是一个很好的例子)。
- 桩提供罐头的答案呼吁在试验期间,通常不应在所有到任何东西之外的编程在进行测试。存根还可以记录有关信息的呼吁,例如一个电子邮件网关stub记得的消息,它"送出",或者也许只有多少消息"送出".
- 嘲笑我们是什么这里所说的:目前编有望形成一种规范的呼叫他们预计可以收到。
这些种类的两倍,仅嘲笑坚持要求行为的核查。
其他提示
您应该测试你所编写的代码。如果你写的数据库连接对象代码,然后对其进行测试。否则,如果它是有它自己的测试库的一部分,你可以模拟/存根,并假设,如果连接对象通过它自己的测试套件,那么它的工作原理。
例如,我不考调用休眠方法,我假设休眠开发者已经彻底的测试已经。但我的将的测试我打电话了正确的方法,使用模拟设置一个期望。
您使用存根当你只是想要一个函数返回某个值(或者什么都不做)。你真的不关心,如果调用函数或没有,你只是想孤立的事情。
嘲笑更强大,你也可以跟踪,如果函数被调用,多少次,连做的事值的函数得到。
在你的情况下,如果要嘲笑数据库(所以它成为一个单元测试,而不是功能性的),则可以模拟的ISession和ITransaction。然后,您可以存储在内存中的这个值,并检查是否正确的价值观都得救了。
是,使用一个真正的数据库将更多的功能或集成测试,这取决于你的定义。就个人而言,我觉得单元测试应该只测试正是这样的方法,在一切的隔离。所以无论会议或交易是否工作,你的单元测试必须保证这些对象的将会的被要求做他们的工作时,并根据需要 - 这就是嘲弄和存根进来你。用它们来确保单元测试作为来自外部的功能解耦,以便它可以作为一个基本单元进行测试;理想地反正。
大多数种的单元测试的是关于测试的代码单独的块,并且存根和模拟的功能仅仅是帮助您试片逐片工具。通过测试件单独你可能测试中更详细地每一块,但你不能保证有关的全貌什么。各种集成测试的将这样做。
在测试更大件的功能,我经常发现数据库逻辑的实际集成测试是最有价值的测试工件,因为你往往会在UI水平测试这些相同的操作。