如何将样本(虚拟)数据添加到单元测试中?

Mic*_*hal 10 c# testing nunit unit-testing

在较大的项目中,我的单元测试通常需要一些"虚拟"(样本)数据来运行.一些默认客户,用户等.我想知道你的设置是怎样的.

  1. 您如何组织/维护这些数据?
  2. 如何将其应用于单元测试(任何自动化工具)?
  3. 你真的需要测试数据还是认为它没用?

我目前的解决方案

我区分主数据样本数据,其中前者在系统投入生产时可用(第一次安装),后者是我运行测试所需的典型用例(以及在开发期间播放).

我将所有这些存储在一个Excel文件中(因为它很容易维护),其中每个工作表包含一个特定的实体(例如用户,客户等),并标记为主文件或样本.

我有2个测试用例,我(想念)用它来导入必要的数据:

  1. InitForDevelopment(创建架构,导入主数据,导入样本数据)
  2. InitForProduction(创建架构,导入主数据)

Laz*_*rus 13

我使用存储库模式并拥有一个由相关单元测试实例化的虚拟存储库,它提供了一组已知数据,其中包含各种字段范围内和范围外的示例.

这意味着我可以通过从测试单元提供实例化的存储库来测试我的代码,或者在运行时提供生产存储库(通过依赖注入(Castle)).

我不知道这是一个很好的网络参考,但我从Apress出版的Steven Sanderson的Professional ASP.NET MVC 1.0书中学到了很多东西.MVC方法自然地提供了关注点的分离,这是使测试以较少的依赖性运行所必需的.

基本元素是您的存储库实现了一个数据访问接口,然后由您在测试项目中构建的虚拟存储库实现相同的接口.

在我目前的项目中,我有一个界面:

namespace myProject.Abstract
{
    public interface ISeriesRepository
    {
        IQueryable<Series> Series { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是作为我的实时数据存储库(使用Linq到SQL)以及虚拟存储库实现的:

namespace myProject.Tests.Respository
{
    class FakeRepository : ISeriesRepository
    {
        private static IQueryable<Series> fakeSeries = new List<Series> {
            new Series { id = 1, name = "Series1", openingDate = new DateTime(2001,1,1) },
            new Series { id = 2, name = "Series2", openingDate = new DateTime(2002,1,30),
            ...
            new Series { id = 10, name = "Series10", openingDate = new DateTime(2001,5,5)
        }.AsQueryable();

        public IQueryable<Series> Series
        {
            get { return fakeSeries; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后实例化消耗数据的类,将存储库引用传递给构造函数:

namespace myProject
{
    public class SeriesProcessor
    {
        private ISeriesRepository seriesRepository;

        public void SeriesProcessor(ISeriesRepository seriesRepository)
        {
            this.seriesRepository = seriesRepository;
        }

        public IQueryable<Series> GetCurrentSeries()
        {
            return from s in seriesRepository.Series
                   where s.openingDate.Date <= DateTime.Now.Date
                   select s;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的测试中我可以接近它:

namespace myProject.Tests
{
    [TestClass]
    public class SeriesTests
    {
        [TestMethod]
        public void Meaningful_Test_Name()
        {
            // Arrange
            SeriesProcessor processor = new SeriesProcessor(new FakeRepository());

            // Act
            IQueryable<Series> currentSeries = processor.GetCurrentSeries();

            // Assert
            Assert.AreEqual(currentSeries.Count(), 10);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后查看CastleWindsor,了解实时项目的反转控制方法,以允许生产代码通过依赖注入自动实例化您的实时存储库.这应该让你更接近你需要的地方.