【问题标题】:Are there any .net equivalents to Rails fixtures?Rails 固定装置是否有任何 .net 等价物?
【发布时间】:2009-02-24 14:52:11
【问题描述】:

我正在寻找一个可以在测试之前将数据插入数据库并在测试运行后回滚的项目/工具。

我知道 ruby​​ on rails 有 yaml 固定装置,所以我希望有一个针对 .net 项目的项目。

【问题讨论】:

  • Fixtures 是 Rails 添加的功能。也不同于术语“测试夹具”,它表示一组共享通用设置或拆卸代码的 xUnit 测试。
  • 没错。由于 .net 中如何使用“fixture”这个词,我发现很难搜索到这个

标签: .net unit-testing yaml fixture


【解决方案1】:

有几种好方法可以为 .NET 中的测试提供数据。一种是使用 NUnit 内置的特性,例如参数化测试和理论。

参数化测试:

TestCaseAttribute 允许您轻松地将硬编码数据提供给测试,如下面的 nunit.org 示例所示:

[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
  return( n / d );
}

TestCaseDataAttribute 让您在提供数据(例如从数据库中返回数据)方面更加花哨。

回滚事务

另一个经常使用的技巧是依赖交易。基本上,在测试之前启动一个事务,然后回滚。这甚至可以使用基类自动化,因此您的测试根本不处理事务本身。例如,您的测试夹具可能有一个基类,如下所示:

public class TestBase
{
    private TransactionScope _transacation;

    [SetUp]
    public virtual void InitializeTest()
    {
        //NOTE: Base class TestInitialize methods are called before test Initialize methods in derived class.

        // Setup a DB transcation to roll everything back after the tests.
        if (_transacation != null)
            throw new Exception("old transacation still exists");
        // Give a long timeout on this transacation for debugging...
        _transacation = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(60));   
    }

    [TearDown]
    public virtual void CleanupTest()
    {

        // Roll all the changes made during the test back.
        _transacation.Dispose();
        _transacation = null;
    }
}

由于基类上的TestInitialize修饰方法在派生类的TestInitialize方法之前被调用,因此您甚至可以在父类的TestInitialize方法中将一些数据添加到数据库中。

父类可能如下所示:

[TestFixture]
public class MyClassTests : TestBase
{
    [TestFixtureSetUp]
    public void InitializeUnit()
    {
            //Setup mocks...
    }

    [SetUp]
    public override void InitializeTest()
    {   
            base.InitializeTest();
            // Add test data to database
    }

    [Test]
    public void RealTest()
    {
            ...
    }
}

【讨论】:

    【解决方案2】:

    我使用 Sql Server Compact Edition 并且每次都重新生成一个新的数据库副本(只需复制一个初始数据库就可以了),如果在只读模式下使用多个测试可以共享同一个数据库文件。

    有一些问题,不支持可编程性,但它适用于我需要的基础知识。它的速度也出奇的快。

    【讨论】:

    • 我过去做过类似的事情,但是这个项目的数据库可能太大而无法每次都分离并附加一个新副本。
    • 好吧,如果测试在 db 上是只读的,那么您只需要执行一次。您将序列化所有依赖于数据库的单元测试,否则(除非您喜欢多个单元测试环境)更不用说与多个用户打交道了。
    • 但这可能只是你不能真正对数据库层进行单元测试,发生这种情况,这不是世界末日而是一种耻辱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-01-17
    • 2014-02-26
    • 2018-07-06
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多