【问题标题】:How to configure unit testing for AnyLogic agent code?如何为 AnyLogic 代理代码配置单元测试?
【发布时间】:2021-10-30 10:51:31
【问题描述】:

您如何配置单元测试框架来帮助开发属于 AnyLogic 代理的代码?

要拥有合适的测试驱动开发节奏,我需要能够在几秒钟内运行所有测试。我想每次都将项目导出为独立的应用程序(jar),但这很慢。

我曾想过尝试将 AnyLogic 之外的所有代码写在单独的类中,但是有很多对内置 AnyLogic 类以及各种代理的引用。我的代码需要以某种方式引用这些,我不知道该怎么做,除非在 AnyLogic 中编写代码。

我想知道是否有办法将测试运行程序添加为依赖项,并从 AnyLogic 中执行该测试运行程序。

有没有人有一个很好用的设置?

【问题讨论】:

    标签: unit-testing junit simulation anylogic


    【解决方案1】:

    这肯定需要一些高级 Java,但是在构建良好的健壮模型时,测试,尤其是单元测试经常被忽视。我希望这个简单的示例足以让您(以及许多其他建模者)继续前进。

    对于 Junit 测试,我们使用了两个库,您可以将它们作为依赖项添加到您的模型中。

    现在您需要在仿真模型中测试两种主要类型的逻辑。

    1. Java 类中的函数
    2. 模型执行

    类型 1:假设我有一个非常简单的 Java 类

    public class MyClass {
    
        public MyClass() {
        }
        
        public boolean getResult() {
            return true;
        }
    }
    
    

    我想测试getResult()函数

    我可以简单地创建一个新类并创建一个我用 @Test 修饰符注释的函数,然后还可以使用 assertEquals() 方法,这是 junit 测试中的标准方法

    import org.junit.Test;
    import static org.junit.Assert.assertEquals;
        
    public class MyTestClass{
    
        @Test
        public void testMyClassFunction1() {
            boolean result = new MyClass().getResult();
            assertEquals("The value of the test class 1", result, true);
        }
    
    

    现在是 AnyLogic 特定的实现(还有其他方法可以做到这一点,但这是最简单/最有用的,稍后您会看到)

    您需要创建一个自定义实验

    现在,如果您从“运行模型”按钮运行它,您将获得此输出

    SUCCESS
    
    Run: 1
    Failed: 0
    
    
    

    您显然可以根据自己的喜好更新和更改输出

    类型 2:假设我们有这个非常简单的模型

    而函数getResult() 只返回一个int 2。

    现在我们需要创建另一个自定义实验来运行这个模型

    然后我们可以编写一个测试来运行这个自定义实验并检查结果

    只需将以下内容添加到您的MyTestClass

    @Test
        public void testMyClassFunction2() {
            int result = new SingleRun(null).runExperiment();
            assertEquals("Value of a single run", result, 2);
        }
    
    

    现在,如果您运行 RunAllTests 客户实验,它将为您提供此输出

    SUCCESS
    
    Run: 2
    Failed: 0
    
    

    这只是一个开始,你可以阅读大量关于使用 junit 来发挥你的优势

    【讨论】:

    • 感谢 Jaco-Ben 非常详细的回复。我认为第二个示例更像是端到端测试而不是单元测试,但仍然重要且有用,而且 JUnit 仍然是一个合适的框架。
    • 是的,您是对的,虽然不是真正的单元测试,但根据您的模型,这可能是一个非常非常小的测试。我们有高度可配置的模型,其中使用该模型的测试仅运行 1 台机器和 1 个产品或 1 个维护事件 1 天,并检查输出和统计数据。 IMO 这可以看作是一个单元测试(尽管不是一个单一的功能),它仍然只测试你模型的一个单一的功能。我认为术语单元测试取决于模型中的抽象级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多