测试执行时间,Visual Studio

时间:2015-01-14 14:59:05

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

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

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

enter image description here

TestAddStudentTestAddStudent2 完全相同,但第一个要执行 1秒,而第二个更快。

当我尝试单独执行测试时,所有集成测试大约需要1秒(单位测试时间保持不变)。

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

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

您是否有任何想法正在发生的事情以及我是否可以做些什么来阻止它?

1 个答案:

答案 0 :(得分:0)

您是正确的,大部分时间都将用于设置与数据库的连接。这必须在AppDomain第一次连接到数据库时完成。当您单独运行测试时,每次都需要这样做,因为app域是在每次测试运行开始时加载的。

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

您还没有说过您正在使用哪个数据库,但有关SQL Server连接池的摘要已涵盖here。如果您想强制测试在每个测试中都经过此命中,那么一个选项可能是在测试设置阶段调用ClearAllPools来清除连接池。

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

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

但是,您仍然可能会发现不同时间的异常情况因运行而异,如果您以不同的顺序运行测试,则可能会有所不同。如果你反复点击某个特定的表,那么你的数据库可能会在内存中保存更多来自该表的信息,因此可以更容易地获取等等。