【发布时间】:2011-03-18 02:26:45
【问题描述】:
我是代码覆盖的新手,我正在尝试让我的单元测试覆盖 %100 的代码。
我的第一个问题是,这可能/可行吗?
我的第二个更具体的问题是,我有以下方法:
/// <summary>
/// Clears frames, control groups, display groups
/// </summary>
public bool Clear()
{
try
{
this.Frames.Clear();
this.ControlGroups.Clear();
this.DisplayGroups.Clear();
return true;
}
catch (Exception ex)
{
Milltown.MTCore.mtException mtEx = new Milltown.MTCore.mtException((int)PFExceptions.Exception_Hidden_FuctionLevel, ex,
PFCommonVariables.ApplicationPlatform, PFCommonVariables.ApplicationDataSource, "PFSystem:Clear");
return false;
}
}
我对这个方法的单元测试是:
//System Clear Test
Assert.IsTrue(MySystem.Clear());
Assert.AreEqual(0,MySystem.Frames.Count);
Assert.AreEqual(0,MySystem.ControlGroups.Count);
Assert.AreEqual(0, MySystem.DisplayGroups.Count);
代码覆盖率表明我覆盖了 try 块内的行,而不是 catch 块。如何覆盖 catch 块中的代码?
【问题讨论】:
-
你打算对
mtException做点什么吗?仅仅创建一个异常不会导致它被抛出、记录或其他任何事情。 -
100% 的代码覆盖率虽然是一个有价值的目标,但随着测试代码的数量和目标流失率越来越接近(例如大约 80-90%),很快就会适得其反收益递减。在某些时候,你不得不说足够好就是足够好。 TMMV
-
@John Saunders:您假设(也许是正确的)mtException 是 Exception 的一个实例。
-
mtException 是我正在使用的一个框架,它将异常记录到 EventLog 中。不幸的是,到目前为止,我还没有一个好的测试方法。有任何想法吗?它有助于不抛出异常,而是记录它们以创造更好的用户体验。
-
@sbenderli:这是非常糟糕的做法,我试图让您怀疑您的真实代码实际上引发了该异常。假装没有发生异常是搞砸系统的好方法。您确定所有调用者都测试返回 false 的方法吗?让一个人错过那个检查,你会希望你让异常传播。此外,使用显式的“LogException”方法会比将日志记录功能放入构造您从未使用过的实例的构造函数中做得更好。
标签: exception visual-studio-2010 code-coverage