【问题标题】:How to mock a gremlin server or create in-memory graph for unit testing?如何模拟 gremlin 服务器或为单元测试创​​建内存图?
【发布时间】:2020-07-05 12:09:59
【问题描述】:

我正在使用 Gremlin.Net,我想为查询数据库的函数编写单元测试。我希望查询在模拟数据上运行,以查看结果是否正确转换为我想要的格式,尤其是 Traverser.Object 具有 dynamic 类型。

有什么方法可以实现吗?可能在代码中运行服务器或在内存中拥有图形实例。

这是一个玩具示例:

var query = graphTraversalSource.V(leafIds).As("leaf")
                .Emit(__.HasLabel("root"))
                .As("root")
                .Repeat(
                    __.InE("related_to").OtherV()
                    .SimplePath())
                .Dedup()
                .Select<Vertex>("leaf", "root")
                .By(__.ValueMap<string, string>(true));

var res = new List<MyFormat>();
foreach (var t in query.Traversers)
{
    var leafInfo = t.Object["leaf"];
    var rootInfo = t.Object["root"];

    var tmp = new MyFormat
    {
        LeafId = leafInfo[T.Id],
        LeafLabel = leafInfo[T.Label],
        LeafProperty = leafInfo["some_property"][0],
        RootId = rootInfo[T.Id],
        RootProperty = rootInfo["some_other_propert"][0]
    };

    res.Add(tmp);
}

return res;

在上面的示例中,leafInforootInfo 具有 dynamic 类型,因此针对测试图运行此函数可以断言这些变量已正确使用,例如leafInfo["some_property"][0] 可分配给 MyFormat.LeafProperty

【问题讨论】:

  • 这个问题不应该被关闭。熟悉 Gremlin 和 Apache TinkerPop 的人很清楚。事实上,有趣的是,我认为我以前从未见过公开提出过这个问题。

标签: c# .net .net-core gremlin


【解决方案1】:

我不确定是否有在 .NET 应用程序中模拟 Gremlin Server 的好方法。我想您可以尝试编写IRemoteConnection 的某种实现并将其提供为:

var g = Traversal().WithRemote(new MyRemoteConnection());

但这可能并非易事,具体取决于您希望测试的内容以及您希望如何进行测试。

我想说的是,.NET(和其他非 JVM 语言)开发人员经常将 Gremlin Server 与 Docker 结合使用。在单元测试开始之前启动它(使用 TinkerGraph 进行快速但可能不是完美的测试)并在它们结束时关闭它。我想这不是经典意义上的真正的“单元测试”,但它可以工作并且速度很快。我们在 TinkerPop 中为 .NET 以及其他 GLV 使用的单元测试就是采用这种方法。我们与 Maven 集成并配置 Gremlin Server 以在其标准生命周期内启动/停止。该配置的主要部分可以在here找到。

如果我们对 .NET 等 GLV 有更好的测试支持,那就太好了,但是当我到这个答案的结尾时,我想知道你是否不能用IRemoteConnection 做一些整洁的事情。也许如果有更好的测试支持,它会以某种方式从那个界面中出来。

【讨论】:

  • 感谢 Stephen,对我来说,使用 docker 听起来比实现 IRemoteConnection 更好,因为它可以为任何查询提供来自数据库的真实结果。我对另一个选项的理解是我必须定义 IRemoteConnection.SubmitAsync 以便它会以模拟结果响应,每次向程序中添加新查询时都需要更新。
  • 是的 - 你必须模拟结果。我描绘了某种库,它可以帮助轻松地完成测试,但这并不是一项微不足道的工作。我想这种东西的确切要求取决于测试期望是什么,因此在这个意义上很难产生一个好的通用模拟框架。
  • 作为补充一点,Gremlin.NET 的主要贡献者 Florian Hockmann 在其他地方写道:“除了模拟 IRemoteConnection,还可以模拟 IRemlinClient,它只有一个方法。接口。我认为,如果 Gremlin.NET 抛出异常,模拟对于测试应用程序的行为是有意义的。在所有其他情况下,我真的会使用 Docker 容器,最好是应用程序在生产中使用的数据库。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2015-11-29
  • 2021-02-13
  • 2014-01-16
相关资源
最近更新 更多