在哪里部署大量数据进行单元测试?

时间:2012-03-11 18:11:27

标签: c# visual-studio-2010 unit-testing

在测试配置中使用Deployment会在每次运行单元测试时生成副本,这非常耗时。数据是一堆位图,只有在构建之后才会改变。

部署如此庞大的测试数据的惯例是什么?

1 个答案:

答案 0 :(得分:1)

我刚刚写了一篇关于文件依赖关系和测试的博客文章。

http://tsells.wordpress.com/2012/03/06/how-to-run-integration-tests-with-file-dependencies/

您正在执行的测试是集成测试,因为您要访问文件系统。我会在帖子中使用每个类方法的示例来实现您想要实现的目标。

发布内容

声明

在许多情况下,开发人员测试需要使用需要在文件系统上的特定文件/文件集执行。许多“纯粹主义者”认为这是一个坏主意,你应该以一种不需要的方式“模拟”你的系统。在某些情况下可能是真的 - 但我是一个“现实主义者”,并且明白围绕这样做的复杂性要求可以多次远远超过仅利用文件系统进行测试的好处。然而,这确实将测试从真正的“单元”测试转移到“集成”测试。我对此感到满意,因为我也相信集成测试比单元测试提供更多价值。如果以正确的方式设置和运行 - 此测试可以在Visual Studio中本地运行,通过MS构建和命令行,或运行构建代理程序(如Team City)的构建服务器上运行。

您可以在此处下载源代码:TestClass.zip

此测试的要求

Test Runner(我喜欢使用TestDriven.Net,因为它允许我在线执行以及调试)。 一个文件类,它包含一些允许您实现IDisposable的system.IO函数。这对于创建曾经超出范围的“沙箱”非常有用 - 它会删除所有使用的临时文件,因此清理是自动完成的(示例类附加在示例中)。 NUnit或MSTest。我还是喜欢NUnit。 使用选项 使用测试文件的要求将决定如何以及何时设置和清理(删除)。

Per Test - 每次测试运行时都会重新生成文件 每个测试类 - 每个测试类生成一次文件 在这两个实例中,FileSandBox类用于创建文件的临时位置,然后在测试完成后删除。

每班用法

[的TestFixture]     公共类PerClass     {         私有FileSandbox _sandbox;         private string _tempFileLocation;

    public PerClass() {}

    /// <summary>
    /// Setup class - runs once per class
    /// </summary>
    [TestFixtureSetUp]
    public void SetupClass()
    {
        _sandbox = new FileSandbox();

        // Getting Temp file name to use
        _tempFileLocation = _sandbox.GetTempFileName("txt");
        // Get the current executing assembly (in this case it's the test dll)
        Assembly myassembly = Assembly.GetExecutingAssembly();
        // Get the stream (embedded resource) - be sure to wrap in a using block
        using (Stream stream = myassembly.GetManifestResourceStream("TestClass.TestFiles.TextFile1.txt"))
        {
            // In this case using an external method to write the stream to the file system
            _tempFileLocation = TestHelper.StreamToFile(stream, _tempFileLocation);
        }
    }

    /// <summary>
    /// Tear down class (cleanup)
    /// </summary>
    [TestFixtureTearDown]
    public void TearDownClass()
    {
        _sandbox.Dispose();
    }

    [Test, Description("Testing doing something with files on the filesystem")]
    public void MyFileSystemTest()
    {
        string[] lines = File.ReadAllLines(_tempFileLocation);
        Assert.IsTrue(lines.Length > 0);
    }
}

每次测试用法(选项1)

 [TestFixture]
public class PerTest
{
    public PerTest(){}

    /// <summary>
    /// Setup class - runs once per class
    /// </summary>
    [TestFixtureSetUp]
    public void SetupClass()
    {
        // NOOP
    }

    /// <summary>
    /// Tear down class (cleanup)
    /// </summary>
    [TestFixtureTearDown]
    public void TearDownClass()
    {
        // NOOP
    }

    [Test, Description("Testing doing something with files on the filesystem")]
    public void MyFileSystemTest()
    {
        using (FileSandbox sandbox = new FileSandbox())
        {
            // Getting Temp file name to use
            string tempfile = sandbox.GetTempFileName("txt");
            // Get the current executing assembly (in this case it's the test dll)
            Assembly myassembly = Assembly.GetExecutingAssembly();
            // Get the stream (embedded resource) - be sure to wrap in a using block
            using (Stream stream = myassembly.GetManifestResourceStream("TestClass.TestFiles.TextFile1.txt"))
            {
                // In this case using an external method to write the stream to the file system
                tempfile = TestHelper.StreamToFile(stream, tempfile);
                string[] lines = File.ReadAllLines(tempfile);
                Assert.IsTrue(lines.Length > 0);
            }
        }
    }
}

每次测试用法(选项2)

[的TestFixture]     公共类PerEachTest     {         私有FileSandbox _sandbox;         private string _tempFileLocation;

    public PerEachTest() { }

    /// <summary>
    /// Setup class - runs once per class
    /// </summary>
    [TestFixtureSetUp]
    public void SetupClass()
    {
        // NOOP
    }

    /// <summary>
    /// Tear down class (cleanup)
    /// </summary>
    [TestFixtureTearDown]
    public void TearDownClass()
    {
        // NOOP
    }

    [SetUp]
    public void Setup()
    {
        _sandbox = new FileSandbox();

        // Getting Temp file name to use
        _tempFileLocation = _sandbox.GetTempFileName("txt");
        // Get the current executing assembly (in this case it's the test dll)
        Assembly myassembly = Assembly.GetExecutingAssembly();
        // Get the stream (embedded resource) - be sure to wrap in a using block
        using (Stream stream = myassembly.GetManifestResourceStream("TestClass.TestFiles.TextFile1.txt"))
        {
            // In this case using an external method to write the stream to the file system
            _tempFileLocation = TestHelper.StreamToFile(stream, _tempFileLocation);
        }
    }

    [TearDown]
    public void Teardown()
    {
        _sandbox.Dispose();
    }

    [Test, Description("Testing doing something with files on the filesystem")]
    public void MyFileSystemTest()
    {
        string[] lines = File.ReadAllLines(_tempFileLocation);
        Assert.IsTrue(lines.Length > 0);
    }
}

您可以在此处下载源代码:Source Code