Динамическое тестирование любого процесса camunda bpmn

Я работаю над Java-кодом Camunda, и я ищу методологию тестирования, которую я могу использовать для тестирования любого из моих процессов bpmn.

Я выполнил поиск в Google и нашел в документации Camunda некоторые идеи о модульном тестировании, но это тест для конкретной модели bpmn. Мне нужен один, чтобы протестировать любую модель bpmn (просто передав имя файла bpmn и идентификатор процесса и т.д.), стратегия должна учитывать интеграцию с БД, чтобы получить кандидата (пользователя и группу) для любого ожидаемого пути. я знаю, может быть, я не могу Сделайте это, но у меня есть большая модель, и я буду тратить время на ее тестирование традиционными способами.


person Mohammad Alkhiyami    schedule 17.07.2019    source источник
comment
Мохаммад, привет. Посмотрите на решение ниже - оно работает и может быть вам полезно. Если будет возможность, дайте отзыв, пожалуйста   -  person Dan Brandt    schedule 20.01.2020


Ответы (1)


Mohammad, у вас интересный вопрос - эта цель достижима (тест на bpmn может быть динамическим), если говорить о не очень подробном тесте. Посмотрите на мой код ниже, написанный на основе вашего представления о таком распространенном тесте (как я, конечно, понял). Я использую camunda-bpm-assert-script и camunda-bpm- assert библиотеки в нем.

Прежде всего, вы даете вашему тесту информацию о "состояниях ожидания" в процессе тестирования (это можно сделать с помощью 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();
    }

Надеюсь, это поможет в вашей работе.

person Dan Brandt    schedule 17.01.2020
comment
спасибо за ответ на мой вопрос, я очень ценю это, это хорошая реализация того, о чем я говорю ???? - person Mohammad Alkhiyami; 20.01.2020