Testing 持久化复杂测试数据

Testing 持久化复杂测试数据,testing,persistence,fluent-interface,test-data,Testing,Persistence,Fluent Interface,Test Data,我们使用构建器模式来生成测试数据。这些域对象之间有关系。我们的功能测试要求这些对象被持久化 想想这个模型: 如果我想要一个普通的C实例,我会重新创建().C().build() 如果我想将其持久化,我会重新设置().c().saveIn(会话) 如果我想要一个具有已知B的C实例,我会使用(B.build() 好吧,你知道了。我的问题是,如果我想保持a C,它应该保持B吗?还是应该在手前坚持?如果我想要一个合理的违约率呢?如果我想坚持D怎么办?它应该持续所有的A,B,C吗 当然,实际系统要复杂

我们使用构建器模式来生成测试数据。这些域对象之间有关系。我们的功能测试要求这些对象被持久化

想想这个模型:

如果我想要一个普通的C实例,我会重新创建().C().build()

如果我想将其持久化,我会重新设置().c().saveIn(会话)

如果我想要一个具有已知B的C实例,我会使用(B.build()

好吧,你知道了。我的问题是,如果我想保持a C,它应该保持B吗?还是应该在手前坚持?如果我想要一个合理的违约率呢?如果我想坚持D怎么办?它应该持续所有的A,B,C吗

当然,实际系统要复杂得多(有时带有循环引用)。我正在寻找保存复杂测试数据的最佳实践

编辑:看来我遇到了语言障碍,我的母语不是英语,所以我很抱歉我的默默无闻。详情如下:

  • 我尝试测试的不是遗留代码
  • 我试图编写一个覆盖率测试,而不是单元测试(因此我不会嘲笑任何东西)
  • 如果数据库填充到一定程度(它不使用所有实体),我尝试测试的软件就可以工作
请不要犹豫询问更多信息,因为我一直在努力寻找可能的最佳实践。我想到的最接近的事情是:

  • 在构建实体时,跟踪已显式设置的内容
  • 假设显式设置的实体已经被持久化,不要持久化它们
  • 坚持其他一切(用他们自己的坚持者)
  • 这会起作用,但我的蜘蛛感觉很刺痛,我认为我做错了什么,因为测试代码中会涉及逻辑,在没有测试的情况下处理它会非常复杂

    编辑2:我会尽量让自己更清楚。当我编写/运行我的单元和一些集成测试时,我没有问题,因为测试数据没有持久化,它存在于内存中

    但是当我试图持久化测试数据时,hibernate不允许我保存没有关系的实体


    如何克服这个问题?

    您可能应该更详细地描述您的测试设置。特别是,为什么功能测试需要持久化这些对象?您正在测试实际的持久性操作吗?或者这只是运行测试的副作用?是否要加载持久化对象作为测试的一部分

    我的问题是,如果我想保持a C,它应该保持B吗?还是应该在手前坚持

    这将取决于你为什么坚持在第一位。如果您正在对持久层进行集成测试,那么您应该只使用应用程序本身使用的逻辑。如果这只是测试的副作用,那么您可能需要模拟持久层等等。

    • 你的测试告诉你什么
    • 听起来像是在测试遗留应用程序
    • 那么,您正在使用代码库中已经编写的功能并尝试创建覆盖率测试

    请给我们更多反馈

    您需要更好地定义域上的级联。如果您无法测试它,您希望它在实际应用程序中的性能如何

    例如:

    谁是这段关系的主人?您想将B添加到A,还是相反?这可以是一个实现细节,其中您可以同时拥有B.SetParent(A)和A.Children.Add(B),并且在A.Children.Add(B)的情况下,您可以将B的父项设置为A(类似地,反过来)。如果您执行以下操作,会发生什么情况:

    A a1 = new A();
    A a2 = new A();
    B b = new B();
    a1.Children.Add(b);
    b.SetParent(a);
    
    你需要在这里下决心。没有一个解决方案是完美的,所以这里应用的基本上是个人偏好和应用程序一致性

    和ORMS一起工作,你可以用简单的SQL(或者像XML或你自己的数据源之类的任何其他数据源)更快地进入这些约束问题,但是如果你要写普通的SQL,你也需要考虑这些问题。 对不起,我没有一个明确的答案给你,但对我来说,看起来你需要考虑一些约束(我想)你还没有做。 我个人喜欢在DAL中使用NHibernate时的存储库模式。我让我的存储库从IDisposable实现,并让它们每个都有一个会话。这样,您就可以在设计中使用“工作单元”模式


    祝你好运:)

    我将你的答案按主题分开

    我的问题是,如果我想保持aC,它是否应该保持它的B?如果我想坚持D怎么办?它应该持续所有的A,B,C吗

    这完全取决于您选择实施的域约束。例如,C是一个实体,而B是一个值对象吗?换句话说,C是否有自己独特的身份和生命?B是否主要通过其价值及其生命周期与其亲本C紧密耦合来确定

    问这些类型的问题应该有助于指导你决定坚持什么、何时坚持、由谁坚持

    例如,如果CB都是仅共享关系的实体,您可能会决定独立地保留它们,因为可以想象每个实体都有自己有意义的生活和身份。如果B是一个值对象,您可能会选择让其父实体C控制其生命周期,包括对象的创建/检索/更新/删除。这很可能包括C持续B

    还是应该在手前坚持

    要回答这个问题,您可能必须映射出您的对象依赖关系。这些依赖关系通常由外键构造表示