我正在处理一个非常奇怪的问题。最初,我认为这是清理测试数据的问题......但是在完全重构了我的测试数据清理代码并且仍然看到完全相同的行为之后......我不知所措。
我在各个类中有 245 种单元测试方法。每个类都有自己独特的测试数据,我初始化这些对象,然后在每个测试方法中,通常将数据插入数据库,然后通过测试进行操作。每个测试类都有一个 ClassCleanup 方法,该方法从数据库中清除所有测试数据,并且 ClassCleanup 也在 TestInitialize 上运行,以确保在运行任何其他测试方法之前清除所有内容。
当我使用 VS 2012 测试资源管理器“全部运行”时,有 22 个测试失败。它们都因违反主键约束的一些变化而失败。这意味着,当他们为这些测试初始化数据时,并未从该类中的先前测试方法中清除数据。如果我重新运行所有测试,我每次都会遇到相同的测试失败。这是相当可重现的。无论我运行多少次所有测试。同样的 27 个测试因主键违规而失败。
然而,奇怪的是,如果我只重新运行那些失败的测试,只有 9 个测试失败。这也是可重现的,这意味着无论我只运行这 27 个先前失败的测试多少次,14 个将失败,其余的将通过。当我只运行失败的测试时,这种情况会继续下去,直到我达到没有一个测试失败的地步。还应该注意的是,如果我单独运行每个测试类,一切都会通过。
我知道这看起来如何。
“你显然没有清理你的测试数据。” 如果是这种情况,那么我应该看到每次运行时相同的测试都会失败,无论如何。这 27 个测试应该在每次运行时都失败,而不仅仅是在我运行其他所有测试时。
“你不能在类之间有唯一的主键,并且事情没有被清理。” 看上面。即使我在我的类中重复了主键(我没有,因为我亲自对各个类中测试数据的主键的唯一性进行了三次检查),因为这些测试不是在单独的线程上同时运行的(已通过记录 ThreadId 进行了验证),任何给定测试的清理代码都将清除重复的数据,无论如何。
“你不能使用连接池。” 不,其实我是。而且我已经使用 SQL Profiler 验证了请求肯定是合并的。此外,因为这些测试不是并行运行的,所以只有一个连接线程。
“你不应该使用连接池。” 嗯,是的,我应该,因为底层代码库支持各种 Web 项目,但为了论证,我尝试在禁用连接池的情况下运行所有测试(在连接字符串中使用 Pooling=false),我得到了完全相同的结果。行为上没有任何变化。
“你当地的环境肯定有问题。” 我在其他同事的开发箱(偶然使用 SQL 2012)上运行这些测试也得到了相同的结果。这不是我的环境所独有的,甚至不是我的 SQL Server 版本所独有的。
“您应该尝试从命令行运行 mstest。” 已经这样做了。结果相同。
如果有人遇到过这样的事情,请告诉我。我知道我一定缺少一些简单的东西,因为这类问题通常就是这种情况,但我已经尽可能多地尝试解决这个问题。