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

Joh*_*n V 1 theory testing unit-testing

阅读文章Evil单元测试,我不确定为什么单元测试永远不要使用DB,网络或文件系统。如果是网络应用程序怎么办?

Din*_*esh 8

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

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

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);
}
Run Code Online (Sandbox Code Playgroud)

今天开始运行。太酷了。

假设明天您来更改Add方法的功能。现在,您应该能够运行测试并且应该可以通过了。但是,让我们假设数据库服务器(或外部资源)已关闭。然后测试失败。

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

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

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

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

  • @ValentinRusk 在这种情况下是集成测试 - 而不是单元测试。 (4认同)

hva*_*rug 5

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

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