有很多网友会时不时的问我,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. jenkins-小知识点

    如果想停止jenkins运行 控制面板-服务-查看本地服务-选中jenkins 1.启动类型改为手动 2.改为禁止 使用的时候,每次都改一下状态

  2. 8 Python 数据类型—元祖

    Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 创建空元组 tup1 = () 元组中只 ...

  3. Git_学习_01_ 常用 Git 命令清单

    我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...

  4. java - BigDecimal的format()方法和setScale()方法格式字符串

    1.BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删 ...

  5. C++STL(vector,map,set,list,bitset,deque)成员函数整理

    补充: vector 删除指定元素: vec.erase(remove(vec.begin(), vec.end(), val),           vec.end());remove()返回的是删 ...

  6. 关于ATML信号定义的理解-1

    1.XML中的类型标签: <xs:complexType>复合类型和<xs:simpleTyle>简单类型是数据结构类型,包含了各种类型的属性.可以被子类型继承,继承方式为&l ...

  7. linux命令学习笔记(9):touch 命令

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. .命令格式: touch [选项]... 文件... .命令参数: -a 或--t ...

  8. AtCoder Grand Contest 015 题解

    A - A+...+B Problem 常识 Problem Statement Snuke has N integers. Among them, the smallest is A, and th ...

  9. uoj problem 31 猪猪侠再战括号序列

    题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...

  10. C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

    如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array. ...