在内存数据库中测试 Oracle SQL 对开源的查询

Test Oracle SQL query against open source in memory database

我正在使用 NUnit 作为我的测试框架,我想测试针对特定测试数据的 oracle 查询。我想从 nuget 和 运行 内存数据库中提取依赖项来测试我的查询。 我假设我的查询是 sql 兼容的,所以我认为我不需要直接针对 oracle 进行测试。

到目前为止,我的搜索结果是 wiki entry 内存数据库中似乎没有合适的内容。

我还发现 "Microsoft.EntityFrameworkCore.InMemory" 可以用于某些场景,我认为我的不是其中之一。

为了提供一些背景信息 - 这是一个会遗漏数据库的测试实现。

using NUnit.Framework;
using System.Linq;
using System.Collections.Generic;

[TestFixture]
public class ExampleFixture
{
    public class JobData { public string Name { get; set; } }
    public string queryUnderTest = "select j.name, j.updated from T_JOB j where j.name like '%TEST%'";

    [Test]
    public void TestQuery()
    {
        var expected = new[] { new JobData { Name = "-TEST-" } };
        var Data = expected.Concat(new[] { new JobData { Name = "OTHER" } });

        var dataBase = MakeInMemoryDataBase();
        WriteTable(dataBase, "T_JOB", Data);

        var actual = QueryAndMakeJobs(dataBase, queryUnderTest);

        CollectionAssert.AreEquivalent(expected, actual);
    }

    private IEnumerable<JobData> QueryAndMakeJobs(object dataBase, string queryUnderTest) => Enumerable.Empty<JobData>();
    private void WriteTable(object imdb, string tablename, IEnumerable<JobData> data) {}
    private object MakeInMemoryDataBase() => null;
}

我只能使用可以从 nuget.org 中提取的开源依赖项。 我唯一的其他选择是 运行 来自 hub.docker.com 的开源数据库。

坦率地说,这作为 unit 测试没有用;这是一项 集成 测试,因为它从根本上 需要 适当的服务器。针对完全不同的 in-memory 实现来测试它 不是一个有用的测试 - 它不会告诉你它是否真的有效,除非你正在使用 in-memory在您的应用程序的某些场景中实现真实。 RDBMS 实现是敏感的。

IMO,您应该专注于以某种可重现的方式在您的测试环境中获得适当的实际 RDBMS 运行。