有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试、打包到最后的投产上线。
  
  开发阶段
  
  单元测试
  
  在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了。
  
  1、在pom包中添加spring-boot-starter-test包引用
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-test</artifactId>
  
  <scope>test</scope>
  
  </dependency>
  
  2、开发测试类
  
  以最简单的helloworld为例,在测试类的类头部需要添加:@RunWith(SpringRunner.class)和@SpringBootTest注解,在测试方法的顶端添加@Test即可,最后在方法上点击右键run就可以运行。
  
  @RunWith(SpringRunner.class)
  
  @SpringBootTest
  
  public class ApplicationTests {
  
  @Test
  
  public void hello() {
  
  System.out.println("hello world");
  
  }
  
  }
  
  实际使用中,可以按照项目的正常使用去注入dao层代码或者是service层代码进行测试验证,spring-boot-starter-test提供很多基础用法,更难得的是增加了对Controller层测试的支持。
  
  //简单验证结果集是否正确
  
  Assert.assertEquals(3, userMapper.getAll().size());
  
  //验证结果集,提示
  
  Assert.assertTrue("错误,正确的返回值为200", status == 200);
  
  Assert.assertFalse("错误,正确的返回值为200", status != 200);
  
  引入了MockMvc支持了对Controller层的测试,简单示例如下:
  
  public class HelloControlerTests {
  
  private MockMvc mvc;
  
  //初始化执行
  
  @Before
  
  public void setUp() throws Exception {
  
  mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
  
  }
  
  //验证controller是否正常响应并打印返回结果
  
  @Test
  
  public void getHello() throws Exception {
  
  mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
  
  .andExpect(MockMvcResultMatchers.status().isOk(www.027yeshenghuowang.com/))
  
  .andDo(MockMvcResultHandlers.print())
  
  .andReturn();
  
  }
  
  //验证controller是否正常响应并判断返回结果是否正确
  
  @Test
  
  public void testHello() throws Exception {
  
  mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
  
  .andExpect(status().isOk(http://xucaizxyl.com/))
  
  .andExpect(content().string(equalTo("Hello World")http://www.wbjyl.cn/));
  
  }
  
  }
  
  单元测试是验证你代码第一道屏障,要养成每写一部分代码就进行单元测试的习惯,不要等到全部集成后再进行测试,集成后因为更关注整体运行效果,很容易遗漏掉代码底层的bug.
  
  集成测试
  
  整体开发完成之后进入集成测试,spring boot项目的启动入口在 Application类中,直接运行run方法就可以启动项目,但是在调试的过程中我们肯定需要不断的去调试代码,如果每修改一次代码就需要手动重启一次服务就很麻烦,spring boot非常贴心的给出了热部署的支持,很方便在web项目中调试使用。
  
  pom需要添加以下的配置:
  
  <dependencies>
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-devtools<http://www.yigouyule2.cn/ /artifactId>
  
  <optional>true</optional>
  
  </dependency>
  
  </dependencies>
  
  <build>
  
  <plugins>
  
  <plugin>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-maven-plugin</artifactId>
  
  <configuration>
  
  <fork>true</fork>
  
  </configuration>
  
  </plugin>
  
  </plugins>
  
  </build>
  
  添加以上配置后,项目就支持了热部署,非常方便集成测试。
  
  投产上线
  
  其实我觉得这个阶段,应该还是比较简单一般分为两种;一种是打包成jar包直接执行,另一种是打包成war包放到tomcat服务器下。
  
  打成jar包
  
  如果你使用的是maven来管理项目,执行以下命令既可以
  
  cd 项目跟目录(和pom.xml同级)
  
  mvn clean package
  
  ## 或者执行下面的命令
  
  ## 排除测试代码后进行打包
  
  mvn clean package -Dmaven.test.skip=true
  
  打包完成后jar包会生成到target目录下,命名一般是 项目名+版本号.jar
  
  启动jar包命令
  
  java -jar target/spring-boot-scheduler-1.0.0.jar
  
  这种方式,只要控制台关闭,服务就不能访问了。下面我们使用在后台运行的方式来启动:
  
  nohup java -jar target/spring-boot-scheduler-1.0.0.jar &
  
  也可以在启动的时候选择读取不同的配置文件
  
  java -jar app.jar --spring.profiles.active=dev
  
  gradle
  
  如果使用的是gradle,使用下面命令打包
  
  gradle build
  
  java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
  
  打成war包
  
  打成war包一般可以分两种方式来实现,第一种可以通过eclipse这种开发工具来导出war包,另外一种是使用命令来完成,这里主要介绍后一种
  
  1、maven项目,修改pom包
  
  将
  
  <packaging>jar</packaging>
  
  改为
  
  <packaging>war</packaging>
  
  2、打包时排除tomcat.
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-web</artifactId>
  
  </dependency>
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-tomcat</artifactId>
  
  <scope>provided</scope>
  
  </dependency>
  
  在这里将scope属性设置为provided,这样在最终形成的WAR中不会包含这个JAR包,因为Tomcat或Jetty等服务器在运行时将会提供相关的API类。
  
  3、注册启动类
  
  创建ServletInitializer.java,继承SpringBootServletInitializer ,覆盖configure(),把启动类Application注册进去。外部web应用服务器构建Web Application Context的时候,会把启动类添加进去。
  
  public class ServletInitializer extends SpringBootServletInitializer {
  
  @Override
  
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  
  return application.sources(Application.class);
  
  }
  
  }
  
  最后执行
  
  mvn clean package -Dmaven.test.skip=true
  
  会在target目录下生成:项目名+版本号.war文件,拷贝到tomcat服务器中启动即可。
  
  gradle
  
  如果使用的是gradle,基本步奏一样,build.gradle中添加war的支持,排除spring-boot-starter-tomcat:
  
  ...
  
  apply plugin: 'war'
  
  ...
  
  dependencies {
  
  compile("org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE"){
  
  exclude mymodule:"spring-boot-starter-tomcat"
  
  }
  
  }
  
  ...
  
  再使用构建命令
  
  gradle build
  
  war会生成在build\libs 目录下。
  
  生产运维
  
  查看JVM参数的值
  
  可以根据java自带的jinfo命令:
  
  jinfo -flags pid
  
  来查看jar 启动后使用的是什么gc、新生代、老年代分批的内存都是多少,示例如下:
  
  -XX:CICompilerCount=3 -XX:InitialHeapSize=234881024 -XX:MaxHeapSize=3743416320 -XX:MaxNewSize=1247805440 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=78118912 -XX:OldSize=156762112 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
  
  -XX:CICompilerCount :最大的并行编译数
  
  -XX:InitialHeapSize 和 -XX:MaxHeapSize :指定JVM的初始和最大堆内存大小
  
  -XX:MaxNewSize : JVM堆区域新生代内存的最大可分配大小
  
  ...
  
  -XX:+UseParallelGC :垃圾回收使用Parallel收集器

在pom包中添加spring-boot-starter-test包引用的更多相关文章

  1. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  2. step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework

    文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...

  3. 在pom.xml中添加Spring依赖

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  4. 在Docker容器中运行Spring Boot的jar包 jar外的配置文件无法生效

    Spring Boot加载配置文件,默认会从几个固定位置搜索一下看看有没有配置文件 ——application.properties或者bootstrap.properties(如果你使用了sprin ...

  5. SpringBoot 之Spring Boot Starter依赖包及作用(自己还没有看)

    spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spring-boot-starter-amqp 通过spring-rabbit来支持 ...

  6. Spring Boot Starter 开发指南

    Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...

  7. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  8. (转)如何在maven的pom.xml中添加本地jar包

    1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将 ...

  9. (转)如何在maven的pom.xml中添加本地jar包

    转载自: https://www.cnblogs.com/lixuwu/p/5855031.html 1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下 ...

随机推荐

  1. 一文读懂所有的编码方式(UTF-8、GBK、Unicode、宽字节...)

    编码方式就分两类:ANSI编码.Unicode编码.这两类编码都兼容ASC码. ------------------------------------------------------------ ...

  2. IpIImage -> CvMat 转换方法

    Ipl转为CvMat 一般为这两种方法: 1: /*cvGetMat*/ CvMat matheader; CvMat * mat = cvGetMat(img, &matheader); 2 ...

  3. Android: 利用SurfaceView绘制股票滑动直线解决延迟问题

    1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...

  4. Debian for ARM

    /************************************************************************* * Debian for ARM * 说明: * ...

  5. C语言小程序(六)、数组操作

    对数组进行操作,查找.插入.删除. #include <stdio.h> #include <stdlib.h> #include <time.h> int siz ...

  6. u盘安装ubuntu 12.04 server问题解决

    问题: 使用UltraISO 9.5.3制作U盘启动盘,ISO文件使用ubuntu-12.04.2-server-i386.iso,ISO文件经过MD5验证是正确的. 将U盘查到计算机上,进bios选 ...

  7. freeMarker(七)——程序开发指南之数据模型

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 在入门章节中, 我们已经知道如何使用基本的Java类(M ...

  8. windows 7下mingw+msys编译ffmpeg

      windows 7下mingw+msys编译ffmpeg   1-->下载安装MingW,mingw-get-inst-20120426.exe  http://sourceforge.ne ...

  9. 第 1 课 Go 简介

    (课程地址: http://study.163.com/course/courseLearn.htm?courseId=306002&from=study#/learn/video?lesso ...

  10. Python模块-logging模块(一)

    logging模块用来写日志文件 有5个级别,debug(),info(),warning(),error()和critical(),级别最高的为critical() debug()为调试模式,inf ...