首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任意凸模bpmn过程的动态测试

任意凸模bpmn过程的动态测试
EN

Stack Overflow用户
提问于 2019-07-17 11:42:52
回答 1查看 896关注 0票数 1

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

我做了一些谷歌搜索,我在Camunda文档中找到了一些关于单元测试的想法,但它是对特定bpmn模型的测试。我需要一个测试任何bpmn模型(只是通过传递bpmn文件的名称和进程id等),策略应该考虑到与DB的集成,以获得任何预期路径的候选(用户和组)。我知道我可能做不到,但我有一个大的模型,这将是浪费时间来测试所有的传统方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 20:23:41

Mohammad,你的问题很有趣--这个目标是可以实现的( bpmn上的测试可以是动态的),如果我们谈论的不是很详细的测试。请看下面的代码,它是由您的想法编写的(当然,据我所理解),我在其中使用了camunda-bpm-断言-场景卡蒙达-bpm-断言库。

首先,您可以在测试过程中提供关于“等待状态”的测试信息(这可以由json文件完成--以避免更改代码)

代码语言:javascript
复制
    // 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
        ));
    }};

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

代码语言:javascript
复制
@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(...);

    }

你的测试会是这样的:

代码语言:javascript
复制
@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();
    }

希望这对你的工作有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57075027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档