【问题标题】:Getting the current Experiment instance at runtime在运行时获取当前 Experiment 实例
【发布时间】:2015-01-12 06:48:31
【问题描述】:

我正在运行带有 AnyLogic 的 JUnit 4。在我的一项测试中,我需要访问运行测试的Experiment。有什么干净的方法可以在运行时访问它吗?例如,是否有类似于Experiment.getRunningExperiment() 的静态方法?

【问题讨论】:

    标签: anylogic


    【解决方案1】:

    我不知道有什么静态方法(如果有的话,它可能会因为允许并行执行的多次运行实验而变得复杂,尽管可能不是,因为仍然有一个实验,尽管会有线程安全问题)。

    但是,您可以在模型使用getEngine().getExperiment()。您可能需要更多地解释您的使用上下文。如果您使用 AnyLogic Pro 并导出模型以独立运行,那么无论如何您都应该可以访问实验实例(如帮助“在没有 UI 的情况下从外部运行模型”中)。

    您是否尝试在实验运行 JUnit 测试?如果是这样,您的总体设计是什么?显然,JUnit 在这种情况下表现不佳,因为它“期望”实例化并运行要测试的东西。对于我的自动化测试(我不能独立导出它,因为我不使用 AnyLogic Pro),我认为避免 JUnit(毕竟它只是一个框架)并“直接”实现测试(通过我的模型组件写入输出,并在实验运行结束时,让实验将输出与预先准备好的预期输出进行比较,并标记测试是通过还是失败)。使用 AnyLogic Pro,您仍然可以独立导出并使用 JUnit 运行“已经测试”的实验(JUnit 测试检查实验是否在末尾设置了 testPassed 布尔值或其他)。

    您希望运行实验这一事实表明,您可能正在执行此操作,而运行可能正在执行。如果是这样,你能解释一下你的要求吗?

    【讨论】:

    • 我在实验中运行 JUnit 测试,是的。我不是用它来测试整个模型:我用它来测试模型组件。(毕竟这就是 JUnit 和单元测试的重点。)我的测试断开连接从模型的其余部分中提取人员、建筑物、子系统等,并分别对其进行测试。对于非代理,这很容易。对于特工来说,这需要一些时间。我会在他们身上使用getEngine(),但问题是我必须首先给他们一个Engine,这就是我需要打电话的原因。现在我有一个可行的“解决方案”,但它肯定是一个 hack。
    • 好的;我假设你是单元测试组件。但是您可以设置仅组成被测组件的顶级代理(如果需要,可以使用假/模拟代理/对象),并且由于它们在实验中运行,因此它们可以访问引擎实例。然后让它们根据您的测试需要输出文件(例如,使用 Java 日志记录)和/或使用普通的 Java 断言。
    • 但我同意如果你能让 JUnit 在 Experiment 中工作会很酷,这只是一个调用它的“shell”。你可能需要更多地解释你的设计来思考什么是可能的;例如,如果代理不直接包含在另一个代理中,您将如何实例化它们?无论如何,我对你的架构非常感兴趣,所以请随时单独给我发消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2023-03-26
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多