【问题标题】:Test execution time, Visual Studio测试执行时间,Visual Studio
【发布时间】:2015-03-12 19:25:50
【问题描述】:

我正在尝试比较我的 VB.net 项目中集成测试和单元测试的执行速度

看到单元测试需要几毫秒,而集成测试需要更多时间,我并不感到惊讶,有些结果仍然令人惊讶

TestAddStudentTestAddStudent2做同样的事情,但是第一个执行的时间需要 1 秒,而第二个要快得多.

当我尝试单独执行测试时,所有集成测试大约需要 1 秒(单元测试时间大致相同)。

我想这与初始化数据库有关,但每次测试都必须进行初始化,那么为什么第一次测试需要更长的时间?

我无法真正将单个测试的执行时间与这些结果进行比较,因为其中一个测试因外部原因需要更长的时间。

您知道发生了什么,是否有什么我可以做的事情来阻止它?

【问题讨论】:

  • 更改两个TestAddStudent 测试的运行顺序,看看有什么影响。
  • 正如我所说,这是第一次启动需要 1 秒,如果我更改顺序,那么它将是 TestAddStudent2,需要 1 秒
  • 根据我的经验,这只是测试引擎预热。对此无能为力。总体而言,集成测试中的 1 秒将一事无成

标签: .net performance visual-studio unit-testing integration-testing


【解决方案1】:

您说得对,大部分时间都将用于建立与数据库的连接。这必须在 AppDomain 第一次连接到数据库时完成。当您单独运行测试时,每次都需要这样做,因为应用程序域是在每次测试运行开始时加载的。

另一方面,当您同时运行所有测试时,连接到数据库的第一个测试会打开连接。当您的测试关闭数据库连接时,而不是完全关闭连接,而是将其返回到数据库连接池。当您的下一个测试运行时,它不必从头开始重新创建连接,它只需从池中获取一个空闲连接。

您还没有说明您使用的是哪个数据库,但在here 中介绍了 SQL 服务器的连接池摘要。如果您想强制您的测试在每个测试中都经过这个命中,那么一种选择可能是在您的测试设置阶段调用ClearAllPools 来清除连接池。

您说您的目标之一是比较集成测试和单元测试的执行速度。此数据库连接设置时间是集成测试的一部分,但是如果您的目标是比较各个测试(AddStudent、AddStudent2、ModifyStudent)并且您想从您关心的测试中删除此异常,那么一种方法是简单地创建一个测试建立数据库连接并初始化池。

您还没有说您正在使用哪个测试框架,但是 NUnit 例如按字母顺序运行测试。因此,如果您创建了一个带有测试 AAAAAInitialiseDatabase 的类 AAAAAIntegrationInitialiser 以某种方式访问​​数据库,它将首先运行,您可以忽略此测试的时间。

但是,您仍然可能会发现时间异常,这些异常会因运行而异,并且如果您以不同的顺序运行测试,可能会发生变化。如果您反复访问特定表,那么您的数据库可能会在内存中保存该表中的更多信息,因此更容易获取等信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多