Drools用户手册翻译——第二章 入门(下)测试和评估

news2024/12/28 19:10:43

因为篇幅原因,所以分为上下两个部分,主要就是通过一个交通违章项目的例子,带你先粗略感受一下决策模型的使用流程,总体来说有详细,也有没说清的地方,如果想要了解一下决策模型,可以进来了解一下。

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。

测试场景

Drools中的测试场景使您能够在将业务规则和业务规则数据(用于基于规则的测试场景)或DMN模型(用于基于DMN的测试方案)部署到生产环境之前验证它们的功能。 在测试场景中,您可以使用项目中的数据,基于定义好的业务规则设置给定条件和期望结果。当你运行场景的时候,规则实例的期望结果和实际结果会进行比较。如果期望结果和实际结果匹配,则测试成功。如果期望结果和实际结果没有匹配,则测试失败。

你可以用很多种方式运行定义好的测试场景,例如:你可以在项目层次或者内部一个指定测试场景素材中运行可获得的测试场景。特使场景是独立的并且不会影响和修改其他的测试场景。你可以在使用Drools开发项目的任何时间运行测试场景。

你可以将不同包里的数据对象导入到与测试场景相同的项目包里。在同一个包里的素材是被默认导入的。在你创建了需要的数据对象与测试场景之后,你可以使用测试场景设计器的Data Objects tab页去验证,是否列出了所有必需有的数据对象,或者通过添加一个新项目导入其他已经存在的数据对象。

使用测试场景测试交通违章

使用测试场景设计器去测试DMN决策模型需要DRDs,并定义交通违章项目的决策逻辑。

图示12.交通违章的测试场景实例

先决条件

你已经成功的使用Drools构建了交通违章项目

过程

1.在IDE中新建一个测试场景

        a.在测试场景属性里输入 Violation Scenarios。

        b.在包列表中,选择com.myspace.traffic_violation.

        c.选择DMN作为Source type

        d.从Choosen a DMN asset列表里,选择DMN素材的路径

        e.单击OK,打开在Test Scenarios设计器里面的Violation Scenarios测试场景。

2.在列Driver下,右键单击State,City,Age和Name单元格并选择Delete column,从上下文菜单选项中删除它们。

3.在列Violation下,右键单击Date和Code单元格并选择Delete column,从上下文菜单选项中删除它们。

4.在测试场景中的第一行输入下列信息:

  • 场景描述:Above speed limit:10km/h and 30km/h
  • Points(在列Given下):10
  • Type:speed
  • Speed Limit:100
  • Actual Speed:120
  • Points:3
  • Amount:500
  • Should the driver be suspended?:No

        右键第一行选择Insert row below添加另一行。

5.在测试场景中的第二行输入下列信息:

  • 场景描述:Above speed limit:10km/h and 30km/h
  • Points(在列Given下):10
  • Type:speed
  • Speed Limit:100
  • Actual Speed:150
  • Points:7
  • Amount:1000
  • Should the driver be suspended?:No

        右键第二行选择Insert row below添加另一行。

6.在测试场景中的第三行输入下列信息:

  • 场景描述:Parking violation
  • Points(在列Given下):10
  • Type:parking
  • Speed Limit:
  • Actual Speed:
  • Points:1
  • Amount:100
  • Should the driver be suspended?:No

        右键第三行选择Insert row below添加另一行。

7.在测试场景中的第四行输入下列信息:

  • 场景描述:DUI violation
  • Points(在列Given下):10
  • Type:driving under the influence
  • Speed Limit:
  • Actual Speed:
  •  Points:5
  • Amount:1000
  • Should the driver be suspended?:No

        右键第四行选择Insert row below添加另一行。

8.在测试场景中的第五行输入下列信息:

  • 场景描述:Driver suspended
  • Points(在列Given下):15
  • Type:speed
  • Speed Limit:100
  • Actual Speed:140
  • Points:7
  • Amount:1000
  • Should the driver be suspended?:Yes

9.单击Save

10.单击Play图标检测测试场景是否通过。

图示13.测试场景对于交通违章例子的执行结果。

如果失败,就修改错误然后再次运行测试场景。

 

用Drools评价交通违法DMN模型

评估交通违规DMN模型所遵循的说明,取决于从先决条件中选择的部署平台。

根据部署平台评估DMN模型的详细信息,请参见:https://docs.drools.org/8.40.0.Final/drools-docs/drools/getting-started/index.html#dmn-execution-con_dmn-models

例子:DroolsDMN引擎作为嵌入类库使用

之后的例子里假设Drools DMN引擎是被作为嵌入类库使用,例子都是在给出的部署平台中使用。

交通违章的DMN模型的源代码和单元测试代码,在生成Maven元模型时可用。

用下面的命令创建一个项目。

mvn archetype:generate -DarchetypeGroupId=org.kie -DarchetypeArtifactId=kie-drools-dmn-archetype -DarchetypeVersion=8.40.0.Final

在命令执行期间,输入项目的属性值。

现在,你的第一个规则项目建好了,让我们进到项目里面去查看一下。

Define value for property 'groupId': org.example
Define value for property 'artifactId': my-project
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' org.example: :
...
 Y: : Y
...
[INFO] BUILD SUCCESS

首先是Pom文件。

他们是使用DroolsDMN引擎作为嵌入类库必须依赖的jar包。

原型包含src/main/resources/Traffic Violation.DMN文件作为示例,在前面的小节中详细描述了该文件。

最终,src/test/java/org/example/TrafficViolationTest.java是评估DMN模型的测试用例,你可以学习在自己的应用中使用简单的API。

Map<String, ?> driver = of("Points", 2);
Map<String, ?> violation = of("Type", "speed", "Actual Speed", 120, "Speed Limit", 100);

DMNContext dmnContext = dmnRuntime.newContext();
dmnContext.set("Driver", driver);
dmnContext.set("Violation", violation);

在DMN模型中为Driver和Violation输入节点,创建一个带一些测试数据例子的DMNContext;或者,你可以提供你自己的Pojos。

LOG.info("Evaluating DMN model");
DMNResult dmnResult = dmnRuntime.evaluateAll(dmnModelUT, dmnContext);

使用在DMNContext的实际测试数据评估交通违章的DMN模型。

LOG.info("Checking results: {}", dmnResult);
assertFalse(dmnResult.hasErrors());

检查评估Traffic_Violation DMN模型时未报告错误。 

assertEquals(DecisionEvaluationStatus.SUCCEEDED, dmnResult.getDecisionResultByName("Should the driver be suspended?").getEvaluationStatus());
assertEquals("No", dmnResult.getDecisionResultByName("Should the driver be suspended?").getResult());

检查最终决策Should the driver be suspended?的结果是字符串No。让我们运行一下mvn clean verify。

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.example.TrafficViolationTest
2022-08-29 16:11:44,539 [main] INFO  Evaluating DMN model
2022-08-29 16:11:44,540 [main] INFO  Checking results: DMNResultImpl{context={
    Driver: {
        Points: 2
    }
    Violation: {
        Type: speed
        Speed Limit: 100
        Actual Speed: 120
    }
    Fine: {
        Points: 3
        Amount: 500
    }
    Should the driver be suspended?: No
}
, messages=org.kie.dmn.core.util.DefaultDMNMessagesManager@4f89331f}
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in org.example.TrafficViolationTest

通过修改存在的DMN模型或者创建全新的DMN模型,可以随意的使用此原型生成的项目作为基础。这个原型也包括使用SecSim工具的更高级的测试用例。

样例:Kogito作为部署平台

下面的样例假设选择了Kogito作为部署平台。

交通违章例子的源代码和详细运行介绍可以从Kogito上面获得:https://github.com/kiegroup/kogito-examples/tree/stable/kogito-quarkus-examples/dmn-quarkus-example

过程

1.决定访问REST API端点的基础URL,这个请求需要知道下面的这些值:(以默认的本地部署为例)

  • HOST(localhost)
  • Port(8080)
  • Rest path(没有指定)

2.交通违法项目的本地部署中的示例基本URL:http://localhost:8080/TrafficViolation

3.确定用户的身份验证需求

4.如果Kogito的用户和角色配置是在Quarkus应用上,HTTP基础身份验证可能需要用户名和密码。成功的请求需要用户已经被配置的角色。

5.下面的例子演示了如何其去添加证书到一个curl请求上:

curl -u username:password <request>

如果在Quarkus应用上的Kogito配置有Red Hat Single Sign-On,请求中必须包含token

curl -H "Authorization: bearer $TOKEN" <request>

执行DMN模型

[POST] Traffic%20Violation

请求curl示例:

curl -L -X POST 'localhost:8080/Traffic Violation' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
--data-raw '{
    "Driver": {
        "Points": 2
    },
    "Violation": {
        "Type": "speed",
        "Actual Speed": 120,
        "Speed Limit": 100
    }
}'

请求JSON示例:

{
    "Driver": {
        "Points": 2
    },
    "Violation": {
        "Type": "speed",
        "Actual Speed": 120,
        "Speed Limit": 100
    }
}

响应JSON示例:

{
    "Driver": {
        "Points": 2
    },
    "Violation": {
        "Type": "speed",
        "Actual Speed": 120,
        "Speed Limit": 100
    },
    "Fine": {
        "Points": 3,
        "Amount": 500
    },
    "Should the driver be suspended?": "No"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[探地雷达]利用Faster RCNN对B-SCAN探地雷达数据进行目标检测

引用量较高的一篇会议论文。 由于真实雷达图像较少&#xff0c;作者采用了GPR工具箱&#xff0c;使用不同配置&#xff0c;合成了部分模拟雷达图。然后采用Cifar-10数据&#xff08;灰度图&#xff09;对Faster RCNN进行预训练&#xff0c;再采用真实和合成数据进行微调。 论…

(0021) H5-Vuejs配合 mint-ui 开发移动端web

mint-ui 初衷 element-ui主打pcweb&#xff0c;导致移动端上UI适配问题突出&#xff0c;趟了很多坑。这次更加理智些&#xff0c;选择了饿了么团队的主打移动端的mint-ui&#xff0c;目前来说体验很好。 认识Mint-ui 首先在手机上体验其demo&#xff0c;扫描链接&#xff1a;…

双层玻璃门碎了一面怎么更换

更换双层玻璃门的碎片需要按照以下步骤进行&#xff1a; 1. 备齐工具和材料&#xff1a;你需要准备以下工具和材料&#xff1a;安全手套、安全护目镜、扁头螺丝刀、绳子、玻璃胶和新的玻璃门。 2. 移除残存玻璃&#xff1a;首先&#xff0c;将门上的残留玻璃及其框架小心地取下…

12给图片加水印(matlab程序)

代码 clear;clc size512; block8; blocknosize/block; LENGTHsize*size/64; Alpha10.02; Alpha20.02; T1100; Izeros(size,size); Dzeros(size,size); BWzeros(size,size); block_dct1zeros(block,block); iimread(watermark64by64.png); %水印原图 markreshape(i…

springboot 2.6.6接入prometheus

springboot是2.6.6版本&#xff0c;刚开始用的是simpleclient客户端 <dependency><groupId>io.prometheus</groupId><artifactId>simpleclient</artifactId><version>0.16.0</version> </dependency>接入后一直报AbstractEnd…

Linux:CentOS安装Git

报错如下&#xff1a;git: 未找到命令... 这是因为没有安装git。 解决方案 使用yum安装git yum -y install git 查看是否安装git,若出现版本号&#xff0c;则代表已经安装了git git --version

ubuntu18实现QT与ROS通信

背景介绍&#xff1a;老板需求&#xff1a;qt开发ui界面&#xff0c;实现与ros通讯。同伴A已经使用qt开发了部分功能&#xff0c;但是没有弄与ros通讯相关&#xff0c;与A沟通了解项目细节。当前主要任务&#xff1a;先实现ros与qt通讯&#xff0c;实现ros话题发布、接收 经验…

Vue开发记录

文章目录 1、解决表格el-table多出一条横线1.1、现象1.2、解决方案 2、el-row高度问题2.1、现象2.2、解决方案 1、解决表格el-table多出一条横线 1.1、现象 <el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"…

Nginx【Nginx场景实践(什么是限流、限流算法、限流实战 )】(十一)-全面详解(学习总结---从入门到深化)

目录 Nginx场景实践_什么是限流 Nginx场景实践_限流算法 Nginx场景实践_限流实战 Nginx场景实践_什么是限流 生活中的限流 春运&#xff0c;一项全人类历史上最大规模的迁移活动&#xff0c;抢火车票一直是每年跨年以后的热点话题。 为什么需要限流 系统设计时一般会预估…

快速排序的三路划分方法和归并排序的递归和非递归实现

目录 快速排序的三路划分方法 归并排序的递归实现 归并排序的非递归实现 快速排序的三路划分方法 首先快排的时间复杂度为O(N*logN)&#xff0c;空间复杂度O(logN),不稳定。 三路划分&#xff1a;将数据分为三份&#xff1b;可以提高当数据中出现多个重复数字时的效率。 …

青岛大学_王卓老师【数据结构与算法】Week04_03_双向链表_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

2022(特等奖)C2592儿童安全监护与救援指挥系统

作品介绍 1 需求分析 现如今人口拐卖犯罪已成为世界上增长最快、最有利可图的犯罪之一&#xff0c;年利润仅次于毒品和军火&#xff0c;其中儿童拐卖犯罪最为引人注目&#xff0c;且被拐数量惊人&#xff0c;已成为国际社会共同关注的问题。2021年4月&#xff0c;国务院发布了…

Kafka入门, 消费者工作流程

kafka消费方式 pull(拉)模式&#xff1a; consumer采用从broker中主动拉取数据。 Kafka采用这种方式。 push(推)模式&#xff1a; Kafka没有采用这种方式&#xff0c;因为由broker决定消息发送速率&#xff0c;很难适应所有消费者的速率。例如推送速度是50m/s&#xff0c;consu…

云原生时代,如何通过 KubeSphere x 极狐GitLab 构建安全应用?

本文整理自云原生 Meetup 杭州站上&#xff0c;极狐(GitLab) DevOps 技术布道师马景贺的演讲。 当听到云原生的时候&#xff0c;你会想起什么&#xff1f; 可能很多人很自然地就会想到 Kubernetes、容器、微服务、开源等等&#xff0c;这些关键词是我们接触云原生绕不开的话题。…

CleanMyMac X4.13中文版mac电脑优化加速工具

CleanMyMac X 可以卸掉系统的额外负担 让您的电脑明显提速 不要再因为运行缓慢的 Mac 而拖慢您的效率。CleanMyMac X已经正式发布&#xff0c;作为最新的系统清理和应用管理软件&#xff0c;可以让用户一键智能化清理Mac电脑&#xff0c;自动扫描Mac上的所有文件&#xff0c;包…

Day44

思维导图 练习 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&#…

【操作系统】一些重要的概念

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

敏捷开发SCRUM工具

目录 1 Scurm开发工具1.1 白板1.2 PingCode1.3 VersionOne1.4 Atlassian Jira 2 PingCode进行Scurm开发2.1 角色管理2.2 创建敏捷项目2.3 需求管理2.4 迭代2.5 版本管理 1 Scurm开发工具 1.1 白板 上面我们说了Scurm框架的操作流程&#xff0c;下面我们看下支持Scurm开发框架的…

SpringBoot3【③ 数据访问】

整合SSM场景 SpringBoot 整合 Spring、SpringMVC、MyBatis 进行数据访问场景开发 1. 创建SSM整合项目 勾选的情况下会导入这些包 <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency><groupId>…

JMeter进行websocket测试

在做websocket性能测试的时候找了几个测试工具都暂时没有对websocket的支持&#xff0c;发现jmeter好像对websockect支持。但是使用jmeter时需要安装插件&#xff0c;下面一起看一下。 jmeter下载安装&#xff1a; 官网下载 https://jmeter.apache.org/download_jmeter.cgi 也…