具有 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# 单元测试不清理数据库/缓存?的主要内容,如果未能解决你的问题,请参考以下文章

python中的单元测试模块unittest

unittest

单元测试:unittest.TestCase

4.写测试用例Testcase

单元测试--unittest

Spring—— Junit框架单元测试