具有 TestCase() 属性的 C# 单元测试不清理数据库/缓存?
Posted
技术标签:
【中文标题】具有 TestCase() 属性的 C# 单元测试不清理数据库/缓存?【英文标题】:C# unit test with TestCase() attribute doesn't clean database/cache? 【发布时间】:2018-12-03 12:57:38 【问题描述】:奇怪的事情,希望你能帮忙。
[TestFixture]
public class TestClass
[TestCase(Size.Big, Color.Blue)]
[TestCase(Size.Big, Color.Red)]
[TestCase(Size.Small, Color.Blue)]
[TestCase(Size.Small, Color.Red)]
public void TestChunkAndRun(Size a, Color b)
using (new TransactionScope())
try
//Data generation + test
finally
//manually rollbacking, disposing objects
使用此代码,我使用不同的参数执行了 4 次单元测试。单元测试会为测试本身生成一些数据。在数据库中,“大小”是唯一索引的一部分,因此它必须是唯一的。
问题是(无论以什么顺序执行测试)第三和第四个测试用例总是由于数据库中的重复行而失败。
如果我一个一个地分别执行测试,它们就会通过。只有当我将它们作为一组执行(无论哪个顺序)时,最后两个才会失败。即使我手动回滚事务。 奇怪的是,在每次测试之前,表格确实是空的。不知何故,数据被保存在测试用例之间,所以我得到重复错误
知道发生了什么吗?
附加问题:选择多个测试与单击“全部运行”并逐个运行测试有什么区别
【问题讨论】:
我正在使用 resharper(使用 Nunit)在 VS 内部进行测试。可能是代码并发,因为测试很大) 我误解了“并发”这个词。测试不是并发的。我只是想知道当单独选择并执行每个测试时,测试如何成功运行。但是作为一个组顺序运行时会失败。 关于--process=Single
的评论不正确。 --process
选项与多个测试程序集的运行方式和位置有关,与单个测试程序集中的线程无关。
为了得到一个好的答案,我们需要更多关于您的测试在做什么的信息......这些 cmets 中发生了什么,您的夹具是否有任何状态,您是否使用 SetUp、OneTimeSetUp 等。
【参考方案1】:
This post 帮助我解决了我的问题。
在方法之外初始化了一些只读字段。将初始化移动到 [TestInitialize]/[SetUp] 方法后,它就像一个魅力。
【讨论】:
以上是关于具有 TestCase() 属性的 C# 单元测试不清理数据库/缓存?的主要内容,如果未能解决你的问题,请参考以下文章