第4章测试环境管理——京东系统质量保障技术实战(3)

发表于:2017-11-09 17:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:商城研发POP平台    来源:51Testing软件测试网原创

  第4 章测试环境管理
  4.1 软件构建工具介绍及使用
  如今的互联网系统,特别是电子商务系统,业务量大、变化快,需要频繁发布,同时又需要保持系统的长期稳定。这就对软件的研发迭代速度和质量保障提出了更高的要求。软件在上线发布前要经过层层测试,需要编译、构建、部署到测试环境。编译、构建是很重要的环节。“工欲善其事,必先利其器”,本节主要介绍常用的构建工具及其使用方法。
  4.1.1 Ant
  Ant 的最早独立发行版于2000 年7 月发布,是一个非常老资格的软件构建工具。Ant 采用Java 语言实现,用于Java 工程构建。目前Ant 有两个并行发行版本1.9.X和1.10.X,分别用于Java5 和Java8 运行环境。两个版本都是基于1.9.7 版本开发的。1.9.X 主要是用于后续的bug 修复,而1.10.X 版本增加了一些新的特性。官方推荐使用1.10.X 版本。
  截至本书完稿时,Ant 最新版本为1.10.1。读者可从ANT 官网http://ant.apache.org下载软件安装包。安装前需先安装Jdk8,其余版本的安装要求请查看官网说明文档。
  安装步骤:
  (1)将Ant 安装包下载到需要安装的目录。
  (2)设置JAVA_HOME 变量。
  (3)设置ANT_HOME 变量,将变量值设置为Ant 安装的目录。
  (4)将Ant 启动程序所在的bin 目录路径加入到path 变量中。
  (5)打开终端执行Ant 命令。如代码示例4.1.1 所示为Ant 安装验证方法,从输
  出内容可以看出已经安装成功。
  代码示例4.1.1
  $ ant
  Buildfile: build.xml does not exist!
  Build failded
  Ant 采用XML 方式定义构建过程,不需要编码,为软件构建工作提供了便利。构建文件默认命名为build.xml,可以在编译时使用-f 选项指定其他文件。每个构建文件有一个Project 根元素,该元素可包含多个target 元素,每个target 代表一个可执行的代码片段。编译工作定义在target 中。可以定义不同构建阶段的target。如代码示例4.1.1 所示为一个标准的Ant build.xml 文件。执行过程包括init.compile.package,各target 之间通过depends 属性设置依赖关系。如代码示例4.1.2 所示为build.xml 的代码示例。
  代码示例4.1.2
  <?xml version="1.0"?>
  <!--定义构建过程,默认执行package target-->
  <project default="package" name="demo Project">
  <description>A demo of Java project</description>
  <!--设置代码源目录-->
  <property name="srcDir" location="src"/>
  <!--设置编译目录-->
  <property name="buildDir" location="build"/>
  <!--设置发布目录-->
  <property name="targetDir" location="target"/>
  <target name="init">
  <!—创建编译、发布目录-->
  <mkdir dir="${buildDir}"/>
  <mkdir dir="${targetDir}"/>
  </target>
  <target name="compile" depends="init">
  <!—执行编译-->
  <javac srcdir="${srcDir}" destdir="${buildDir}"/>
  </target>
  <target name="package" depends="compile">
  <!--打包-->
  <jar destfile="${targetDir}/demo.jar" basedir="${buildDir}">
  <manifest>
  <attribute name="Built-By" value="${user.name}"/>
  <attribute name="Main-Class" value="package.Main"/>
  </manifest>
  </jar>
  <!--打源码包-->
  <jar destfile="${targetDir}/demo-src.jar" basedir="${srcDir}"/>
  </target>
  </project>
  Ant 支持跨平台运行,可通过命令行调用,目前流行的集成开发工具都已提供支持Ant 的集成插件。Jenkins 等持续集成工具也都支持使用Ant。详细的使用说明可以参见Ant 官方文档。
  4.1.2 Maven
  与构建工具Ant 相比,Maven 是一款项目管理工具,除了具备类似Ant 的构建功能,也提供文档、报告功能。Maven 的第一个正式版本1.0 发布于2004 年7 月,Maven 经历了Maven1、Maven2、Maven3 三个主要版本,各版本之间有较大差异。截至本书完稿时,Maven 最新版本为3.5。
  Maven 有以下特点:
  (1)使用POM(Project Object Model)方式管理软件项目;
  (2)通过约定的方式定义了一些内置规则;
  (3)定义了软件项目构建的生命周期,并支持通过插件绑定生命周期,方便扩展;
  (4)支持软件模块和类库的依赖管理;
  (5)支持依赖软件自动导入,可以从本地仓库和远程仓库下载软件类库。
  每个通过Maven 管理的工程,至少需要一个pom.xml 文件。如果是多模块工程一般每个模块都需要包含一个pom.xml 文件。pom.xml 内定义了项目管理的所有信息,也包含了项目的构建包名称和标识信息。构建包的标识由groupId、artifactId、version 三个元素组成。groupId 代表项目组织ID,一般对应项目包名,如com.jd;artifactId 代表项目标识,一般为工程名;version 代表软件包版本号。pom.xml 文件中引入的jar 包是通过这三个元素定义的。pom.xml 增加了一些内置元素。其中Properties 元素用来定义工程内使用的变量,可以在其他地方引用。Profile 元素为自定义的工程配置集合,方便打包时自由切换,打出不同配置适合不同环境的软件包。Build 标签用于管理构建,可以引入不同阶段的插件定义打包过程。Maven 构建阶段主要包括Compile、Test、Package、Install、Deploy 等。Compile 代表编译阶段;Test 代表测试阶段,可以在打包前先执行自动化测试;Package 代表打包阶段,用于指定打包过程,打包类型包括jar 包、war 包等;Install 阶段用于将打出的包安装到指定目录,默认为Maven 仓库;Deploy 阶段用于定义打包后的部署过程。如代码示例4.1.3 所示为一个简单的POM 文件模板。
  代码示例4.1.3
  <?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">
  <!--声明项目描述符遵循的POM 模型版本 -->
  <modelVersion>4.0.0</modelVersion>
  <!--定义项目groupId -->
  <groupId>com.jd.demo</groupId>
  <!--定义项目artifactId -->
  <artifactId>demo</artifactId>
  <!--定义项目当前version,此为SNAPSHOT 版本-->
  <version>1.0-SNAPSHOT</version>
  <!--定义打包类型-->
  <packaging>war</packaging>
  <!--定义项目的名称-->
  <name>demo</name>
  <!--定义项目用到的属性,可以采用${属性名}引用-->
  <properties>
  <spring.version>4.0.0.RELEASE</spring.version>
  <mybatis.version>3.2.7</mybatis.version>
  </properties>
  <!-- 打包配置信息 -->
  <profiles>
  <profile>
  <id>development</id>
  <activation>
  <!--代表默认使用此profile-->
  <activeByDefault>true</activeByDefault>
  </activation>
  <properties>
  <loginAddress>demo.jd.com</loginAddress>
  </properties>
  </profile>
  </profiles>
  <!--配置依赖的jar 包-->
  <dependencies>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>${spring.version}</version>
  </dependency>
  <!-- mybatis 核心包 -->
  <dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>${mybatis.version}</version>
  </dependency>
  </dependencies>
  <!--构建信息-->
  <build>
  <!--包名-->
  <finalName>demo</finalName>
  51
  <resources>
  <resource>
  <directory>src/main/resources</directory>
  <filtering>true</filtering>
  </resource>
  </resources>
  <pluginManagement>
  <plugins>
  <!--编译插件-->
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.4</version>
  </plugin>
  <!--打包插件-->
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.2</version>
  </plugin>
  <!—resources 插件,用于处理main 和test resource-->
  <plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <version>2.4</version>
  </plugin>
  </plugins>
  </pluginManagement>
  </build>
  </project>
  Maven 通过约定的方式定义工程目录结构。如表4.1.1 所示。
  Maven 的项目管理功能为开发工作提供了很大便利。用户不需要手工下载和导入jar 包,只需要在POM 文件中定义需要的jar 包(配置groupid、artifactid、version信息),Maven 构建时会自动下载jar 包。通常使用的集成开发工具均支持在编码阶段自动下载jar 包。用户只需要编码,其他的事情Maven 已经帮我们做到了,非常方便。
  4.1.3 Gradle
  Gradle 是在Maven 后兴起的又一款构建工具。与Maven 通过XML 文件管理项目不同,Gradle 是采用比较流行的动态语言Groovy,基于DSL(Domain- SpecificLanguage)语法管理项目,可以做到配置即代码。建议在使用Gradle 前先熟悉Groovy的简单用法。Groovy 是通过Java 实现的一种动态脚本语言。相比Maven,Gradle管理项目更加灵活和便利。Gradle 同样支持依赖版本库管理,支持多个软件构建过程。支持从compile、runtime、testCompile、testRuntime 四个阶段引入依赖的版本库。
  Gradle 结合了Ant 任务管理和Maven 生命周期、依赖管理的特点。Gradle 通过task 定义各阶段任务,下面代码示例4.1.4 是一个Gradle build 文件。
  代码示例4.1.4
  //定义编译任务
  task compile {
  //Gradle 特性,在任务最后执行的方法
  doLast {
  println 'compiling source'
  }
  }
  task compileTest(dependsOn: compile) {
  doLast {
  println 'compiling unit tests'
  }
  }
  task test(dependsOn: [compile, compileTest]) {
  doLast {
  println 'running unit tests'
  }
  }
  task dist(dependsOn: [compile, test]) {
  doLast {
  println 'building the distribution'
  }
  }
  任务按照“compile.compileTest.test.dist”的顺序执行。任务的依赖关系如图4.1.1所示。
使用Gradle 时需指定要执行的任务,上游任务会根据依赖关系自动执行。用户可以通过-x 选项跳过某个任务。如命令gradle dist -x test 会跳过test 任务。执行结果如代码示例4.1.5 所示。
  > gradle dist -x test
  :compile
  compiling source
  :dist
  building the distribution
  BUILD SUCCESSFUL
  Total time: 1 secs
  代码示例4.1.6
  > gradle di
  :compile
  compiling source
  :compileTest
  compiling unit tests
  :test
  running unit tests
  :dist
  building the distribution
  BUILD SUCCESSFUL
  Total time: 1 secs
  如任务名称为驼峰式,可以用其每个单词开头字母组合成简写的任务名。Gradle也可以识别。如命令gradle cT 代表compileTest,执行输出如代码示例4.1.7 所示。
  代码示例4.1.7
  > gradle cT
  :compile
  compiling source
  代码示例4.1.5
  :compileTest
  compiling unit tests
  BUILD SUCCESSFUL
  Total time: 1 secs
  Gradle 也支持执行时通过-b 选项指定build 文件。类似Ant 和Maven 的-f 选项。Gradle 支持增量构建,通常情况下任务执行过一次以后,再次执行时如果输入输出和上次没有发生任何变化,Gradle 不会再次执行构建,执行时输出UP-TO-DATE。如果要强制执行,则可以设置--rerun-tasks 选项。
  如果想了解构建时项目的结构和依赖信息或者在出现问题时进行调试,Gradle也有对应的命令。gradle -q projects 可以获取工程内所有子项目的列表。gradle -qtasks 可以获取所有task 的列表。gradle -q tasks -all 可以获取工程内所有任务列表,包括没有被使用的任务列表。gradle dependencies 可以获取工程内对应阶段软件包的依赖信息。通过gradle project:properties 可以输出对应工程的所有属性及属性值。遗憾的是Gradle 没有类似maven profile 的配置套件。我们可以通过定义属性文件和多个Gradle 文件的方式达到相同的效果。
  4.1.4 Jenkins
  在软件开发工作中,一般会引入自动化测试和持续集成技术加快开发测试进度。自动化测试通常包括接口和UI 的回归测试,也包括单元测试和需要大数据验证的功能自动化测试。持续集成的执行过程包括获取源码、编译、单元测试、构建软件包、部署、自动化回归测试。比较知名的持续集成工具包括Bamboo、GO、TeamCity、Jenkins 等。Bamboo、GO、TeamCity 都是收费软件。Jenkins 是免费开源软件,支持各种插件安装扩展,是目前最流行的持续集成工具。
  Jenkins 安装比较简单,只需从官网jenkins.io 下载软件包,并执行java -jarjenkins.war 命令,即可启动服务。服务端口默认为8080,如果在本地安装,可访问http://localhost:8080。
  Jenkins 内置用户管理功能。Jenkins 通过Master/Slave 模式管理服务器。Jenkins所在服务器作为Master,服务器可以接入Jenkins,作为Jenkins 的节点,我们通常将这些节点称为Slave。
  Jenkins 支持CRON 定时触发和手工触发方式执行任务。Jenkins 任务配置时可以使用Linux Shell。任务包括构建前工作、构建中工作、构建后工作三个阶段。每个工作阶段可通过一个或多个插件管理,任务配置后,按照约定的顺序执行。常用的Jenkins 插件包括版本管理插件(SVN、Git 等)、编译构建插件(Ant、Maven、Gradle 等)、测试插件(Junit、TestNG 等)、测试结果收集插件、测试报告发布插件、邮件发送插件、构建参数录入插件,这些插件都是开源的。用户也可以根据Jenkins的开发规范开发插件。有这些插件的支持,用户可以通过简单编程的方式配置动态任务,增加任务的灵活性。
本文选自《京东系统质量保障技术实战》第四章,本站经机械工业出版社和作者的授权。
版权声明:51Testing软件测试网获机械工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。

相关文章
  第3章3.2 接口测试实战——京东系统质量保障技术实战(2)
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号