额外的话: 我会非常感激如果您在读本文的时候 Follow 文中的操作步骤在你的环境中实践本文所讲内容, 我保证这个过程不会非常复杂, 即便加上你研究代码的时间也不需要超过 15 分钟

和传统后端页面生成技术相较, RESTful 数据服务专注与数据逻辑, 而将数据呈现完全交给前端应用. 这样做可以让后端开发更加单纯, 而且更容易测试. 本文将讲述如何使用 maven 生成一个支持端到端自动测试的 RESTful 服务的项目脚手架.

1. 准备环境

如果你打算跟随本文在你的开发机上试验, 需要一下环境:Java SDK 1.7+

maven 3.5+

如果有 IDE 就更好. 作者推荐使用 IntelliJ IDEA, 可以使用社区版, 完全免费.

2. 定义项目包和应用名称

项目包 (package) 和应用名称 (artifact) 是你的项目在 Java 依赖体系中的坐标, 即使你的项目无需被其他项目引用, 也应该给出简单明确的包和应用名字, 以便于沟通交流.

这里为我们即将生成的应用给出下面的包名和应用名:包名: demo.restful

应用名: SimpleService

3. 生成项目脚手架

我们使用 actframework 的 archetype-simple-restful-service 来生成项目脚手架. 在命令行下mvn archetype:generate -B \

-DgroupId=demo.restful \    -DartifactId=simple-service \    -DarchetypeGroupId=org.actframework \    -DarchetypeArtifactId=archetype-simple-restful-service \    -DarchetypeVersion=1.8.8.1

运行以上命令大致可以看到下面的 log 信息:[INFO] Scanning for projects...

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] Building Maven Stub Project (No POM) 1[INFO] ------------------------------------------------------------------------

[INFO]

[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>

[INFO]

[INFO] <<

[INFO]

[INFO]

[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---

[INFO] Generating project in Batch mode

[INFO] Archetype repository not defined. Using the one from [org.actframework:archetype-simple-restful-service:1.8.7.3] found in catalog remote

[INFO] ----------------------------------------------------------------------------

[INFO] Using following parameters for creating project from Archetype: archetype-simple-restful-service:1.8.8.0[INFO] ----------------------------------------------------------------------------

[INFO] Parameter: groupId, Value: demo.restful

[INFO] Parameter: artifactId, Value: simple-service

[INFO] Parameter: version, Value: 1.0-SNAPSHOT

[INFO] Parameter: package, Value: demo.restful

[INFO] Parameter: packageInPathFormat, Value: demo/restful

[INFO] Parameter: version, Value: 1.0-SNAPSHOT

[INFO] Parameter: package, Value: demo.restful

[INFO] Parameter: groupId, Value: demo.restful

[INFO] Parameter: artifactId, Value: simple-service

[INFO] Executing META-INF/archetype-post-generate.groovy post-generation script

[INFO] Project created from Archetype in dir: /tmp/1/simple-service

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 10.984 s

[INFO] Finished at: 2018-05-13T22:15:58+10:00[INFO] Final Memory: 25M/305M

[INFO] ------------------------------------------------------------------------

4. 项目结构与内容

使用 tree 命令来查看项目结构:simple-service/

├── pom.xml

├── run_dev

├── run_dev.bat

├── run_e2e

├── run_e2e.bat

├── run_prod

└── src

├── main

│   ├── java

│   │   └── demo

│   │       └── restful

│   │           ├── AppEntry.java

│   │           └── Service.java

│   └── resources

│       ├── conf

│       │   ├── app.properties

│       │   ├── prod

│       │   │   └── app.properties

│       │   └── uat

│       │       └── app.properties

│       ├── demo

│       │   └── restful

│       ├── e2e

│       │   └── scenarios.yml

│       ├── logback.xml

│       └── rythm

│           └── demo

│               └── restful

└── test

└── java

└── demo

4.1 项目启动入口: AppEntry

我们看到生成的项目中有一个 AppEntry.java 文件, 打开该文件, 其内容为:public class AppEntry {    public static void main(String[] args) throws Exception {

Act.start();

}

}

这是一个很简单的 Java 类, 其作用是启动 ActFramework.

4.2 服务类: Service

打开本项目中的另一个 Java 文件 Service.java:public class Service {    @GetAction("hello")    public String hello(@DefaultValue("World") String who) {        return "Hello " + who;

}    @GetAction("date")    public DateTime date() {        return DateTime.parse("2016-03-09");

}

}

代码很简单, 提供了两个 RESTful 数据服务端口:

4.2.1 GET /hello

当访问这个服务端口的时候, 应用返回 "Hello xxx" 形式的内容, 其中 xxx 是通过请求参数 who 传递的, 如果请求没有提供这个参数, 则使用默认值 World, 即, 返回 "Hello World" 字串.

4.2.2 GET /date

这个服务端口不接受参数, 直接返回一个日期数据

4.3 运行脚本

maven 为项目生成了几个可执行脚本文件:run_dev - 以开发模式启动项目

run_dev.bat - run_dev 的 windows 版本

run_e2e - 运行端到端测试

run_e2e.bat - run_e2e 的 windows 版本

run_prod - 以产品模式启动项目

我们没有提供 run_prod 脚本的 windows 版本, 主要原因是 windows 没有默认安装支持解包 tar.gz 文件的命令行应用. 如果需要在 windows 下运行产品模式可以这样做:运行 mvn clean package

到项目的 target/dist 目录下, 找到 tar.gz 文件, 使用第三方工具, 比如 7zip 等解包, 然后运行 run.bat 文件

5. 启动应用

下面我们使用 run_dev 脚本, 或者直接使用 mvn compile act:run 启动应用:__  ___         _        _       __   _   _         ___   _   _

(_    |   |\/|  |_)  |   |_  __  (_   |_  |_)  \  /   |   /   |_

__)  _|_  |  |  |    |_  |_      __)  |_  | \   \/   _|_  \_  |_

powered by ActFramework r1.8.8-RC4-aa2d4

version: v1.0-SNAPSHOT-180513_2237

scan pkg:

base dir: /tmp/1/simple-service

pid: 26126

profile: dev

mode: DEV

zen: Flat is better than nested.

2018-05-13 22:37:47,875 INFO  a.Act@[main] - loading application(s) ...

2018-05-13 22:37:47,885 INFO  a.a.App@[main] - App starting ....

2018-05-13 22:37:48,104 WARN  a.h.b.ResourceGetter@[main] - URL base not exists: META-INF/resources/webjars

2018-05-13 22:37:48,119 WARN  a.a.DbServiceManager@[main] - DB service not initialized: No DB plugin found

2018-05-13 22:37:48,741 WARN  a.m.MailerConfig@[main] - smtp host configuration not found, will use mock smtp to send email2018-05-13 22:37:49,033 INFO  a.a.App@[main] - App[simple-service] loaded in 1148ms2018-05-13 22:37:49,037 INFO  a.a.ApiManager@[jobs-thread-3] - start compiling API book2018-05-13 22:37:49,055 INFO  o.xnio@[main] - XNIO version 3.3.8.Final2018-05-13 22:37:49,143 INFO  o.x.nio@[main] - XNIO NIO Implementation Version 3.3.8.Final2018-05-13 22:37:49,244 INFO  a.Act@[main] - network client hooked on port: 54602018-05-13 22:37:49,245 INFO  a.Act@[main] - CLI server started on port: 54612018-05-13 22:37:49,246 INFO  a.Act@[main] - app is ready at: http://192.168.1.2:54602018-05-13 22:37:49,246 INFO  a.Act@[main] - it takes 2149ms to start the app

项目启动之后可以从浏览器来访问. 首先来看 GET /hello 服务端口的情况:

再请求中加入一个 who 参数再试试:

最后看看 GET /date 服务端口:

6. 测试

我们已经使用浏览器来验证项目可以正常运行, 也能得到期望的结果. 对于简单的应用来讲, 可以使用这种方式进行测试, 但随着项目的开发, 更多的服务端口会加入进来, 每次都这样来运行测试, 对开发测试人员来说是很大的负担. 下面我们先运行一下生成的 run_e2e 脚本, 或者也可以直接使用 maven 命令 mvn compile act:e2e:Listening for transport dt_socket at address: 5005

__  ___         _        _       __   _   _         ___   _   _

(_    |   |\/|  |_)  |   |_  __  (_   |_  |_)  \  /   |   /   |_

__)  _|_  |  |  |    |_  |_      __)  |_  | \   \/   _|_  \_  |_

powered by ActFramework r1.8.8-RC4-aa2d4

version: v1.0-SNAPSHOT-180513_2248

scan pkg:

base dir: /tmp/1/simple-service

pid: 27429

profile: e2e

mode: DEV

zen: Simple things should be simple, complex things should be possible.

2018-05-13 22:48:52,651 INFO  a.Act@[main] - loading application(s) ...

2018-05-13 22:48:52,661 INFO  a.a.App@[main] - App starting ....

2018-05-13 22:48:52,882 WARN  a.h.b.ResourceGetter@[main] - URL base not exists: META-INF/resources/webjars

2018-05-13 22:48:52,895 WARN  a.a.DbServiceManager@[main] - DB service not initialized: No DB plugin found

2018-05-13 22:48:53,580 WARN  a.m.MailerConfig@[main] - smtp host configuration not found, will use mock smtp to send email2018-05-13 22:48:53,910 INFO  a.a.App@[main] - App[simple-service] loaded in 1249ms2018-05-13 22:48:53,914 INFO  a.a.ApiManager@[jobs-thread-2] - start compiling API book2018-05-13 22:48:54,017 INFO  o.xnio@[main] - XNIO version 3.3.8.Final2018-05-13 22:48:54,032 INFO  o.x.nio@[main] - XNIO NIO Implementation Version 3.3.8.Final2018-05-13 22:48:54,130 INFO  a.Act@[main] - network client hooked on port: 54602018-05-13 22:48:54,131 INFO  a.Act@[main] - CLI server started on port: 54612018-05-13 22:48:54,132 INFO  a.Act@[main] - app is ready at: http://192.168.1.2:54602018-05-13 22:48:54,133 INFO  a.Act@[main] - it takes 2332ms to start the appStart running E2E test scenarios

================================================================================

HELLO SERVICE

a service says hello--------------------------------------------------------------------------------[PASS] send request to hello service without parameter

[PASS] send request to hello servcie with parameter specified

[PASS] send request to hello servcie with parameter specified and require JSON response--------------------------------------------------------------------------------It takes 0s to run this scenario.

================================================================================DATE SERVICE

A service returns an important date in the history--------------------------------------------------------------------------------[PASS] send request to the service

[PASS] send request to the service and request response be JSON format--------------------------------------------------------------------------------It takes 0s to run this scenario.2018-05-13 22:48:55,224 INFO  a.a.App@[jobs-thread-4] - App shutting down ....

[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 5.874 s

[INFO] Finished at: 2018-05-13T22:48:55+10:00[INFO] Final Memory: 26M/389M

[INFO] ------------------------------------------------------------------------

我们看到项目启动之后运行了 E2E 测试场景, 包括对 GET /hello 和 GET /date 的 5 个测试用例, 并且都通过了测试. 下面打开 src/main/resources/e2e/scenarios.yml 文件来看看测试场景和用例是如何定义的:Scenario(Hello Service):  description: a service says hello  interactions:    - description: send request to hello service without parameter      request:        method: GET        url: /hello      response:        text: Hello World # response text must be "Hello World"    - description: send request to hello servcie with parameter specified      request:        method: GET        url: /hello?who=ActFramework      response:

# this time we demonstrate how to verify text with a list of verifiers        text:          - eq: Hello ActFramework # value must be equal to "Hello ActFramework"          - contains: ActFramework # value must contains "ActFramework"          - starts: Hello # value must starts with "Hello"          - ends: Framework # value must ends with "Framework"    - description: send request to hello servcie with parameter specified and require JSON response      request:        json: true # specify accept type is application/json        method: GET        url: /hello?who=Java      response:        json: # treat result as a JSON object

# act returns json result in `{"result": ...}` style          result: Hello Java # result property of the JSON object must be "Hello World"# Test Service#date() endpoint, which is available at `GET /date` endpointScenario(Date Service):  description: A service returns an important date in the history  interactions:    - description: send request to the service      request:        method: GET        url: /date      response:        text:          - after: 1997-05-11 # the returned date should be after date 1997-05-11          - before: 13/May/2018 # the returned date should be before date 13/May/2018    - description: send request to the service and request response be JSON format      request:        json: true        method: GET        url: /date      response:        json: # treat result as a JSON object

# act returns json result in `{"result": ...}` style          result:  # thus we will use `result` to fetch the date            - after: 1997-05-11 # the returned date should be after date 1997-05-11            - before: 13/May/2018 # the returned date should be before date 13/May/2018

这个文件还是很容易理解, 其内容基本是按照下面的方式组织的:首先第一层定义测试场景 Scenario, 每个 Scenario 都会给出一个名字放进圆括弧中. 我们在文件中定义了两个 ScenarioHello Service - 测试 GET /hello 端口

Date Service - 测试 GET /date 端口

场景 (Scenario) 下面定义一个或者多个交互 Interactions

对每个交互定义请求 Request 和 响应 Response

请求 Request 的内容包括方法和 URL, 也可以指定是否要求返回 JSON 格式的请求

响应 Response 则定义期望返回内容的验证

针对每个服务端口可以写一个或多个场景, 也可以在一个场景中顺序测试多个服务端口. 完全有应用自己来定义.

7. 总结

本文介绍了如何使用 maven archetype 来生成一个可测试 RESTful 数据服务项目的脚手架, 以及如何通过定义 e2e/scenarios.yml 文件来提供自动测试的功能. 希望能够对大家带来帮助.

参考:

作者:罗格林

来源:https://my.oschina.net/greenlaw110/blog/1811714

java maven restful_使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架...相关推荐

  1. 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)...

    Maven的archetype Plugin可能大家都听过,但不一定都能很好地用好它.缺省地如果你使用 mvn archetype:generate  会从maven的Repository里查找所有支 ...

  2. java 键盘录入猜数,生成一个1-100之间的随机数,用户键盘录入猜数字

    猜数字案例的需求如下: 后台预先生成一个1-100之间的随机数,用户键盘录入猜数字 如果猜对了,打印"恭喜您,答对了" 如果猜错了 猜大了:打印"sorry,您猜大了!& ...

  3. 支持多编程语言的自动测试系统

    源问题地址:http://www.cnblogs.com/xinz/archive/2011/03/20/1989662.html 问题背景 在一座高楼中,我们需要设计一个电梯系统.这个电梯系统中的电 ...

  4. java web编辑器插件_UEditer 是一个富文本编辑器,可以作为 插件放到javaweb项目中使用,很好用~ Develop 238万源代码下载- www.pudn.com...

    文件名称: UEditer下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 19833 KB 上传时间: 2015-03-19 下载次数: 0 提 供 者: 陈琳杰 ...

  5. 【图文详解】在电脑中打开.properties配置文件时会生成一个空的名为Java的文件问题

    问题描述:我们在开发过程中常常需要修改电脑中的.properties配置文件,比如当IDEA控制台出现乱码时我们需要修改tomcat中的logging.properties文件.但当我们打开.prop ...

  6. java gradle maven_java – 如何使gradle在maven用户的项目根目录下生成一个有效的pom.xml文件?...

    在现在只有两天的时间里,我绝对出售了我所有Java项目的毕业生,并从我所有项目的根目录中删除pom.xml. 然而,我想保持与maven兼容,在某种意义上,我希望一个毕业生的任务能够在用户想要的项目根 ...

  7. 使用Maven 实现打包生成一个可执行jar包:附详细配置解释说明

    1. 需求 项目打包,满足以下要求: 1.整个项目打一个Zip包下面包括应用程序.应用程序依赖的jar包.说明文档 2.项目打的jar包可以执行不同类里的Main函数 3.项目源码打的jar包要与依赖 ...

  8. Java学习十五,Maven,Mybatis

    目录 1.Maven 1.1 Maven的概念 1.2 Maven的作用 1.3 Maven的使用 1.3.1 Maven目录 1.3.2 Maven基本命令 1.3.3 Pom.xml的配置 1.3 ...

  9. (转)Maven之自定义archetype生成项目骨架

    背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...

最新文章

  1. 微信小程序架构分析 (上)
  2. 姿态估计算法汇总|基于RGB、RGB-D以及点云数据
  3. 8.Verilog的for循环语句使用
  4. java中有hash集合_Java(1.8)集合类中的HashMap
  5. 【机器学习】特征降维-主成分分析
  6. copy与mutableCopy的区别总结
  7. Linux JDK升级
  8. 认证服务器的搭建_SpringCloud搭建的认证中心和资源服务器的微服务项目源码分享...
  9. python实现决策树数据直接赋值导入_决策树在python中的数据实现
  10. java的继承和访问_Java 继承和访问控制
  11. (5)css样式表特征
  12. 线搜索中有最速下降法、牛顿法、拟牛顿法、共轭梯度法汇总
  13. java线程知识点拾遗(排队CAS)
  14. linux vi字体大小,设置VIM字体大小
  15. 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取
  16. layui表格时间格式化
  17. 网络营销和电子商务傻傻分不清?
  18. arcengine java_浅析 ArcEngine Java - EngineViewer 例子
  19. Python jieba库简介和使用
  20. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘xxx‘ 中的标识列插入显式值。 java解决方案

热门文章

  1. PL/SQL NOCOPY限制模式
  2. 物化视图 sql server 1
  3. PaaS、DevOps、OpenShift与业务中台的实现
  4. 以卖香蕉为例,从4个方面了解SQL的数据汇总
  5. 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
  6. 大数据发展的问题与机遇
  7. 一个HTTP请求,把网站打裂开了!
  8. 顶级分布式开源项目,配上这款可视化工具,真香!
  9. 国产数据库 OceanBase 二次刷榜 TPC-C,7 亿 tpmC!
  10. 2021 年 6 月程序员工资统计,惨不忍睹。。。