3

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

4

2 回答 2

13

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

举个例子,假设今天你编写了一个单元测试来测试一个执行两个数字相加的方法。

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 方法的功能。现在您应该能够运行测试并且它应该通过了。但是让我们假设数据库服务器(或外部资源)以某种方式关闭。然后测试失败。

即使有人更改了数据库中的值,您也需要注意要对测试进行的更改。

那是你要的吗???绝对不。正确的

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

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

于 2013-03-16T15:31:21.670 回答
3

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

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

于 2013-03-16T15:31:12.520 回答