【发布时间】:2013-11-19 23:42:58
【问题描述】:
首先,我是测试新手,所以这可能是一个愚蠢的问题。我目前正在为我的课程创建单元测试。我有一个属性,它依赖于可为空的属性将向数据库发送一个新的 Comment 对象。通常通过单元测试我会确保一个对象被发送到我的模拟服务,并称之为好。但是,测试 Comment Object 上的值以确保它沿着正确的路径前进,而不是仅仅假设它是不是更有意义。这是我正在测试的代码示例:
if (DeliveryDate != null)
{
AddPartHistory("Delivery Date Changed from " + ((DateTime)DeliveryDate).ToShortDateString() + " to " + ((DateTime)value).ToShortDateString());
}
else
{
AddPartHistory("Delivered Date of " + ((DateTime)value).ToShortDateString() + " was added.");
}
AddPartHistory 函数将 Comment 对象(将文本保存在名为 Entry 的属性中)发送到数据库(或在测试期间发送到模拟服务),并将其存储在名为 NewPartHistory 的属性中。以下是我认为可能更像是集成测试的代码:
vm.DeliveryDate = DateTime.UtcNow;
Assert.AreEqual("Delivered Date of " + ((DateTime)vm.DeliveryDate).ToShortDateString() + " was added.", vm.NewPartHistory.Entry);
OldDeliveryDate = vm.DeliveryDate;
vm.DeliveryDate = DateTime.UtcNow;
Assert.AreEqual("Delivery Date Changed from " + ((DateTime)OldDeliveryDate).ToShortDateString() + " to " + ((DateTime)vm.DeliveryDate).ToShortDateString(), vm.NewPartHistory.Entry);
那么,回到这个问题,我应该把这段代码留在单元测试中,还是转移到集成测试中。
更新:
由于有很多关于我的AddPartHistory 方法的讨论,所以在这里。它只是为PartHistory 填写标准数据(始终相同),添加条目,然后用新数据更新Listview:
private void AddPartHistory(string historyText)
{
NewPartHistory = new CdaService.PartHistory();
NewPartHistory.EnteredBy = User.Current.UID;
NewPartHistory.Entry = historyText;
NewPartHistory.EntryDate = DateTime.UtcNow;
NewPartHistory.PartId = ThisPart.Id;
webService.Insert(NewPartHistory);
GetPartHistory();
}
【问题讨论】:
-
在我看来,你两者都做,不是吗?你是在断言你的预期和实际是他们应该的,不是吗?对我来说,断言是一种罕见的情况,它不仅可以是单元测试,还可以是集成测试。单元 - 因为您是一个级别的单元测试代码,而集成 - 因为您正在将单元测试与返回的数据进行更深层次的比较。
-
我明白你在说什么,但在真正的集成测试中,我实际上会发送到数据库,然后正确检索回来?
-
在大多数情况下,是的。但是,并非在所有情况下。我认为您实施的机制非常可靠。但是,如果您对此有点紧张,您可以随时将您的评论对象传递给
AddPartHistory,然后看看它是如何构造的,也许? -
我已将 AddPartHistory 方法添加到问题中。让我知道你的想法。我想我对单元测试和集成测试之间的区别有点困惑。
-
在 50,000 英尺的视野中(这非常主观),单元测试会测试代码块(通常是函数/方法)。另一方面,集成测试不仅测试函数/方法,还测试该方法接受的内容(如果重载)以及它如何与上面、下面和周围的层交互。
标签: c# unit-testing testing integration-testing