为什么单元测试不应该使用数据库?

时间:2013-03-16 15:19:19

标签: unit-testing testing theory

阅读文章Evil Unit testing,我不确定为什么单元测试不应该使用数据库,网络或文件系统。如果它是网络应用程序怎么办?

2 个答案:

答案 0 :(得分:5)

单元测试用于测试代码中最小单元的功能。它们不应该依赖于将来可能发生变化的任何外部资源。

举一个例子,让我们说今天你编写一个单元测试来测试一个执行两个数字相加的方法。

public void AddNumberTest()
{
    int a = 4; // Assume 4 coming from a database.
    int b = 5; // Assume 5 coming from a database.

    int c = a + b;
    Assert.True(9, c);
}

这将于今天开始。那太酷了。

让我们说明天你来改变Add方法的功能。 现在你应该能够运行测试,它应该通过。但是我们假设某种程度上数据库服务器(或外部资源)已关闭。然后测试失败。

即使有人更改了数据库中的值,您也需要了解对测试所做的更改。

这就是你想要的???绝对不。右

这就是我们编写应该独立于外部资源的单元测试用例的原因。我们使用模拟和存根的地方。

您应该能够进行一次单位测试,并且应该始终给出相同的结果。

答案 1 :(得分:2)

单元测试不是为了测试应用程序的完整功能。它旨在确保可定义的代码模块按预期工作。要测试应用程序,使用单元测试是不够的。您还必须执行功能测试和回归测试。数据库访问不属于单元测试范围,因此您不会编写包含数据库访问权限的单元测试。您将在功能测试中包含数据库访问测试。同样,如果您有网络应用程序,则不会在单元测试中包含网络访问权限。在这两种情况下,您都可以使用模拟已知数据对从数据库或网络中获取的数据进行单元测试,并将实际访问权限保留在其中。

重申一下,仅对单元测试应用程序是不够的。