在Visual Studio中,能否优雅地中止一次单元测试的执行?
我知道,理想情况下,单元测试应该是自包含的,并且对数据库及其他外部依赖进行模拟。
然而,出于各种原因,我们也有一些自动化的 mstest 测试,需要修改环境(例如,在中心化的开发/测试数据库中修改某些值),然后在 finally 子句或 [TestCleanup] 过程中重置这些修改。
正如我所说,这显然并非理想,也会引发其他各种问题(与并行化等不太兼容)。
一个特别恼人的问题是,在Visual Studio Test Explorer中点击红色停止按钮停止一个单元测试时,似乎会终止单元测试的执行进程,导致 finally 子句或 [TestCleanup] 方法无法运行。
有没有办法让Visual Studio以“优雅”的方式停止单元测试执行?例如,在当前测试完成后再停止,或者在当前测试中注入一个 ThreadAbortException?
解决方案
我的建议是在测试之前运行清理脚本,而不是试图确保清理总是在测试之后执行。总会存在清理未执行的情形,比如电脑突然断电,或者被测试的代码有缺陷,导致数据库处于未知状态。
我们对数据库测试的方法是:
- 生成一个计算机唯一的数据库名称。这使多台计算机能够在同一数据库主机上并发运行测试。
- 尝试删除同名的任何现有数据库。
- 创建一个新数据库
- 运行数据库初始化脚本,将数据库填充到一个已知的初始状态
- 运行测试
- 在清理方法中删除数据库
这可以确保测试不会因为存在处于未知状态的数据库而失败。虽然并非完美,因为旧数据库可能会一直存在,直到下一次计算机运行测试时才会被清理;如果你尝试在同一台计算机上并发运行测试,仍然可能存在并发问题,但对我们而言已经足够好用。
确实需要你具备自动创建和初始化数据库的能力,但这对其他用途也非常有用。若对此有顾虑,同样的方法也应该可以应用于临时文件或其他持久化状态。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。