任何 camunda bpmn 流程的动态测试

Dynamic testing for any camunda bpmn process

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

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

Mohammad,你的问题很有意思——这个目标是可以实现的(在bpmn上测试可以是动态的),如果我们谈的不是很详细的测试。 看看我下面的代码,按照你对这种常见测试的想法编写的(当然是我的理解) 我在其中使用 camunda-bpm-assert-scenario and camunda-bpm-assert 库。

首先,您在测试过程中向您提供有关 "wait states" 的测试信息(这可以通过 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();
    }

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