环境
CentOS Linux release 7.6.1810
jdk1.8.0_65
apache-tomcat-8.5.45
Jenkins-2.235.5
apache-maven-3.6.3
git-2.9.5
gradle-6.6.1
SonarQube-6.7.7(LTS)
sonar-scanner-cli-4.2.0.1873
拓扑:
node1:安装GitLab、SonarQube
node2:安装Jenkins、Git、MAVEN
我们开发的软件都需要测试,才能上线,软件测试按阶段划分:
(1)单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
(2)集成测试(integration testing),是单元测试的下一阶段,是指将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部门。
(3)系统测试(system testing),指的是将整个软件系统看做一个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。
(4)验收测试(acceptance testing),指的是在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序。
一般性能测试:指的是让被测系统在正常的软硬件环境下运行,不向其施加任何压力的性能测试。
稳定性测试也叫可靠性测试(reliability testing):是指连续运行被测系统检查系统运行时的稳定程度。
负载测试(load testing):是指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性。
压力测试(stress testing):是指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。
一、单元测试
每种编程语言都有单元测试框架,比如java语言中JUnit,执行单元测试的工作一般由自动化构建工具完成,但是构建工具只是执行了单元测试的命令,将单元测试调用起来,构建工具不会帮我们创建单元测试用例,单元测试都是开发事先写好的。
1、Junit单元测试报告
这里演示一个jenkins使用JUnit插件收集展示单元测试报告的示例:
(1)Jenkins安装JUnit插件
(2)创建一个MultiBranch pipeline 工程
maven项目pom.xml中引入maven-surefire-plugin插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--表示执行任何子目录下所有命名以Tests结尾的java类 -->
<includes>
<include>**/*Tests.java</include>
</includes>
<!--表示不执行任何子目录下所有命名以Test开头的java类 -->
<!--
<excludes>
<exclude>**/Test*.java</exclude>
</excludes>
-->
</configuration>
</plugin>
完整pom示例:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.macro.mall</groupId> <artifactId>mall-tiny</artifactId> <version>1.0.0-SNAPSHOT</version> <name>mall-tiny</name> <description>mall-tiny project</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <skipTests>false</skipTests> <!--该方法有漏洞,容易被黑客远程放入挖矿机镜像,开启需做好防范, 年少无知的我,开放2375,没做ip限制,被拉去挖矿了。。。 推荐使用CA加密端口--> <docker.host>http://192.168.118.106:2375</docker.host> <docker.maven.plugin.version>1.2.2</docker.maven.plugin.version> <druid.version>1.1.10</druid.version> <hutool.version>4.5.7</hutool.version> <swagger2.version>2.9.2</swagger2.version> <swagger-models.version>1.6.0</swagger-models.version> <swagger-annotations.version>1.6.0</swagger-annotations.version> <mysql-connector.version>8.0.16</mysql-connector.version> <jjwt.version>0.9.0</jjwt.version> <mybatis-plus.version>3.3.2</mybatis-plus.version> <velocity.version>2.2</velocity.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--SpringBoot通用依赖模块--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--SpringBoot校验框架--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!--集成druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <!--Mysql数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> </dependency> <!--Swagger-UI API文档生产工具--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger2.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger2.version}</version> </dependency> <!--解决Swagger 2.9.2版本NumberFormatException--> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>${swagger-models.version}</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>${swagger-annotations.version}</version> </dependency> <!--redis依赖配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--SpringSecurity依赖配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!--Hutool Java工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <!--JWT(Json Web Token)登录支持--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--SpringBoot配置处理--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--MyBatis Plus 依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!--MyBatis Plus 代码生成器--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!--Velocity模板引擎--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>${velocity.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <!--表示执行任何子目录下所有命名以Tests结尾的java类 --> <includes> <include>**/*Tests.java</include> </includes> <!--表示不执行任何子目录下所有命名以Test开头的java类 --> <!-- <excludes> <exclude>**/Test*.java</exclude> </excludes> --> </configuration> </plugin> <!-- docker-maven-plugin 插件就是为了帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。 微服务部署有两种方法: (1)手动部署:首先基于源码打包生成jar包(或war包),写个Dockerfile文件,基于基础镜像搞个新镜像,将jar包(或war包)上传至虚拟机并拷贝至JDK容器。(太麻烦了) (2)通过Maven插件自动部署。 这也是企业实际开发中经常使用的方法。 参考: https://blog.csdn.net/weixin_44424668/article/details/104062822 https://www.cnblogs.com/jpfss/p/10945324.html --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${docker.maven.plugin.version}</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,我们要直接传到私服--> <!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本--> <imageName>192.168.82.46:18083/${project.artifactId}:${project.version}</imageName> <dockerHost>${docker.host}</dockerHost> <!--基础镜像,相当于Dockerfile里的from--> <baseImage>ascdc/jdk8</baseImage> <!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,testDocker--> <!--相当于启动容器后,会自动执行java-jar/testDocker.jar--> <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint> <!--是否推送到docker私有仓库 设置为true 每次构建都要推送镜像--> <!--<pushImage>true</pushImage>--> <!-- 要在$MAVEN_HOME/settings.xml中配置对应的serverId才行 否咋报错Fail : no basic auth credentials --> <serverId>cicd-docker-release</serverId> <registryUrl>192.168.82.46:18083</registryUrl> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <!-- 把哪个文件上传到docker,相当于Dockerfile里的add testDocker.jar mvn clean,mvn install一下,先放到本地仓库再说 mvn docker:build命令创建镜像,如果还要上传,加个-DpushImage参数 mvn clean package docker:build 只执行 build 操作 mvn clean package docker:build -DpushImage 执行 build 完成后 push 镜像 mvn clean package docker:build -DpushImageTag 执行 build 并 push 指定 tag 的镜像 --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>