0

我正在为我们的核心库编写单元测试。

其中一个类测量计算机性能随时间的工作量(作为平均值),应用一些权重并可以输出一个数字。

现在,它用来进行平均和应用权重的类很容易进行单元测试。(加入一些平均值,与已知结果进行比较)。不太容易测试的是课程本身的目的Workload因为这将涉及强制机器处于例如 50% 的利用率,然后检查已知的 50% 的重量调整平均值。

当然,我知道我可以“假装”机器处于 50% 的利用率并以这种方式比较结果,但单元测试实际上并没有针对 50% 的实际利用率进行测试。

您还遇到过哪些其他“困难”的测试用例,如果它们不是不可能的,您采用了哪些创造性的方法来解决它?

4

1 回答 1

1

您是否尝试过测试一个简单的MsgBox(或任何模式窗口,就此而言)显示在 WinForms 应用程序中?在最近的一个项目中,我们花了一段时间与 Win32 句柄和多线程测试用例作斗争,试图一致地验证屏幕上显示的对话框(因为它是模态的,你不能只从主测试线程执行它)。测试有时会起作用,但很容易出现间歇性故障,因为没有“好”的原因(例如,由于某些后台进程,窗口在测试期间失去了焦点)。

在这种情况下,我们使用 C# 委托的强大功能来模拟对MsgBox.Show(). 通过声明一个委托,例如

public delegate DialogResult ShowDelegate(string text, string caption);

我们可以new ErrorMessageHelper(MsgBox.Show)在生产中使用,测试看起来像

[TestFixture]
public class ErrorDialogHelperTest
{
    [Test]
    public void UsesShowDelegateToDisplayMessage()
    {
        bool delegateWasCalled = false;
        ShowDelegate mockShowDelegate = delegate(string text, string caption)
        {
            Assert.AreEqual("the expected message", text);
            Assert.AreEqual("the expected title", caption);
            delegateWasCalled = true;
        };

        ErrorDialogHelper helper = new ErrorDialogHelper(showDelegate);

        helper.ShowErrorMessage("the expected message", "the expected title");
        Assert.IsTrue(delegateWasCalled);
    }
}

我们当然有进一步的测试来验证我们确实使用MsgBox.Show. 我MsgBox在这个例子中使用,但我们使用了类似的技术来测试我们所有模态窗口的显示。

另一个经典的难以测试的例子是你的代码需要使用挂钟日期和时间。同样,解决方案是引入一个可以从测试中控制的假时钟。在这两种情况下,您都依赖底层框架或系统实现来正常工作,并且只测试一切是否正确连接。这是否是一个合理的风险应根据具体情况确定。

于 2013-04-24T05:57:48.640 回答