任何卡蒙达 bpmn 过程的动态测试



我正在研究Camunda java代码,我正在寻找一种可以用来测试任何bpmn进程的测试方法。

我已经进行了一些谷歌搜索,并在Camunda文档中发现了一些关于单元测试的想法,但它是针对特定BPMN模型进行测试的。我需要一个来测试任何 BPMN 模型(只需传递 BPMN 文件的名称和进程的 ID 等(该策略应考虑与数据库的集成,以获得任何预期路径的候选(用户和组(.我知道也许我不能这样做,但我有一个大型模型,以传统方式测试所有这些模型将浪费时间。

穆罕默德

,你的问题很有趣——如果我们谈论不是很详细的测试,这个目标是可以实现的(在 bpmn 上的测试可以是动态的(。看看我下面的代码,由你对这种常见测试的想法编写(当然,正如我所理解的那样(我在其中使用了camunda-bpm-assert-scenario和camunda-bpm-assert libs。

首先,您向测试过程中提供有关"等待状态"的测试信息(这可以通过json文件来完成 - 不要更改代码(

    // optional - for mocking services for http-connector call, et.c.
    private Map<String, Object> configs = withVariables(
            "URL_TO_SERVICE", "http://mock-url.com/service"
    );
    private Map<String, Map<String, Object>> userTaskIdToResultVars = new LinkedHashMap<String, Map<String, Object>>() {{
        put("user_task_0", withVariables(
                "a", 0
        ));
        put("user_task_1", withVariables(
                "var0", "var0Value",
                "var1", "var1Value"));
    }};
    // optional - if you want to check vars during process execution
    private Map<String, Map<String, Object>> userTaskIdToAssertVars = new LinkedHashMap<String, Map<String, Object>>() {{
        put("user_task_1", withVariables(
                "a", 0
        ));
    }};

然后,使用给定的信息模拟用户任务(和其他等待状态(:

@Mock
    private ProcessScenario processScenario;
    @Before
    public void defineHappyScenario() {
        MockitoAnnotations.initMocks(this);
        for (String taskId : userTaskIdToResultVars.keySet()) {
            when(processScenario.waitsAtUserTask(taskId)).thenReturn(
                    (task) -> {
                        // optional - if you want to check vars during process execution
                        Map<String, Object> varsToCheck = userTaskIdToAssertVars.get(taskId);
                        if (varsToCheck != null) {
                            assertThat(task.getProcessInstance())
                                    .variables().containsAllEntriesOf(varsToCheck);
                        }
                        task.complete(userTaskIdToResultVars.get(taskId));
                    });
        }
        // If it needs, we describe mocks for other wait states in same way, 
        // when(processScenario.waitsAtSignalIntermediateCatchEvent(signalCatchId).thenReturn(...);
    }

您的测试将是这样的:

@Test
    @Deployment(resources = "diagram_2.bpmn")
    public void testHappyPath() {
        Scenario scenario = Scenario.run(processScenario).startByKey(PROCESS_DEFINITION_KEY, configs).execute();
        ProcessInstance process = scenario.instance(processScenario);
        assertThat(process).isStarted();
        assertThat(process).hasPassedInOrder(     //  or check execution order of all elements -- not only wait-states (give them in additional file)
                userTaskIdToResultVars.keySet().toArray(new String[0])     //   user_task_0, user_task_1
        );
        assertThat(process).isEnded();
    }

希望这对您的工作有所帮助。

最新更新