【问题标题】:Should Code Be in Unit Test or Integration Test代码应该在单元测试还是集成测试中
【发布时间】: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


【解决方案1】:

我会将其更改为将新的 Comment 对象传递给 AddPartHistory 方法 - 而不是传递值来构建对象。这样您就可以对包括注释对象的构造在内的逻辑进行单元测试。从 AddPartHistory 返回评论对象以使其更容易断言也会很有帮助。

像这样把它移出方法:

   NewPartHistory = new CdaService.PartHistory();
   NewPartHistory.EnteredBy = User.Current.UID;
   NewPartHistory.EntryDate = DateTime.UtcNow;
   NewPartHistory.PartId = ThisPart.Id;

   if()
   {  
      NewPartHistory.Entry = "Delivered Date of"......;
      return AddPartHistory(NewPartHistory );
   }
   else
   {
       NewPartHistory.Entry = "Delivery Date Changed from".....;
       return AddPartHistory(NewPartHistory );
   }

   //return comment object from AddPartHistory so that you can call this entire method and assert all properties

【讨论】:

  • 你的回答反映了我的 cmets,+1 :)
  • 我已经添加了我的 AddPartHistory 方法并解释了我为什么拥有它,如果你能详细一点,我将不胜感激,因为我不完全理解如何实现你所说的.
  • @DarylBehrens 我建议您将评论对象的构造从 AddPartHistory 方法中取出,以更好地测试构造。
  • 然后您可以将方法传递给函数,甚至将其返回
  • 我真的很抱歉,我只是不明白这会有什么帮助,无意冒犯。我在视图模型中使用该代码块大约 15 次。我曾经在每个属性设置器中对其进行硬编码,但为了代码重用,最好转移到方法中。这对我的单元测试有什么帮助,无论我把语句放在哪里,最终结果都是一样的。再次抱歉,我真的不明白(我的错不是你的)。
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 2021-12-19
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多