热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

持续集成_借持续集成的思想搞接口测试自动化

篇首语:本文由编程笔记#小编为大家整理,主要介绍了借持续集成的思想搞接口测试自动化相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了借持续集成的思想搞接口测试自动化相关的知识,希望对你有一定的参考价值。









借持续集成的思想搞接口测试自动化


  前言


  前段时间的工作中有接触到接口测试,测试代码以maven工程的形式编写,使用testNG测试框架。工作中,每次执行测试都是在IDE里手动执行测试代码,很是麻烦,再考虑到后期的回归测试需要,所以产生了把该接口测试自动化的想法。


  最初的做法是将测试数据保存在excel中,测试代码从excel中读取测试数据,然后执行mvn test命令执行测试。但是excel中写测试用例不是很方便,另外,这样简单的测试工具只能在我本机上运行,如果想分享给其他同事也来执行测试的话,就需要在他本机上再重复安装和搭建测试依赖环境,比如maven,java等,且要保证版本一致性,很是麻烦。正好之前有学点docker的知识,为了便于移植,就考虑将测试工具容器化。另外,最近也一直在看有关持续集成和DevOpts相关的东西,感到QA未来的一条发展方向就是DevOpsts,就萌生了把这个接口测试按照持续集成的思想搞一下的念头,也算让自己实践一下,更好的理解该思想。所以这里就分享下自己搭建这套持续集成接口测试自动化的流程,可能会与正宗的持续集成差一点,但大概的思路应该是对的。


  整体流程


  整体的想法是测试数据和测试代码分离,两者之间没有耦合,修改一方不用再修改另一方。另外,由于测试脚本会经常改动,比如testng.xml中会时常更新要执行的测试case,希望每次改动测试脚本后,会自动触发构建测试工作,所以就考虑引入gitlab和jenkins,在每次本地修改过测试脚本后,将测试脚本push到gitlab,jenkins通过webhook检测到gitlab上测试脚本有更新后,触发一个构建job,将测试脚本clone到本地,并执行测试。这样,每更新一次测试代码就触发一次测试,达到了自动化测试的目的,这也是持续集成的思想。


  另外,考虑后续的移植方便,将整个流程的各部分容器化,所以就要借助docker。整体流程如下: 


借持续集成的思想搞接口测试自动化


整体流程



  • Test Code



  本地的测试脚本,每次修改测试脚本后,push到gitlab上。



  • Gitlab



  利用docker搭建一个gitlab仓库容器,存储测试脚本。这个代码仓库建立起来后,不但自己本地修改测试脚本后可以上传到该仓库,也便于其他同事修改测试脚本后,同样上传到该测试代码仓库来触发自动化测试工作。



  • Jenkins



  利用docker搭建一套Jenkins容器。这里的Jenkins的工作主要为:


  ① 检测gitlab仓库中测试脚本是否有更新,若有更新则触发一个构建job;


  ② 在构建job中执行测试工作,包括:


  a、将gitlab中更新后的测试脚本下载到执行节点slave上;


  b、启动mysql、maven容器,执行测试,收集测试报告。



  • MySQL



  利用docker搭建一套mysql容器,该容器的作用为存储测试数据。



  • Maven



  利用docker搭建一个maven容器,该容器的作用是加载测试脚本(maven工程),读取测试数据(从mysql容器中读取),执行测试(用mvn test调用testNG),生成测试报告。


  可以看到,各个部分都是基于docker容器化的,各容器独立存在,互相解耦,且便于各自移植。


  环境搭建


  整套搭建在我本机的虚拟机192.168.201.130上搭建。


  1、 下载镜像


  下载jenkins,gitlab,maven,mysql镜像。


    sudo docker pull jenkins/jenkins:lts


  sudo docker pull gitlab/gitlab-ce


  sudo docker pull maven:3.5.2-jdk-8


  sudo docker pull mysql


  其中jenkins选lts版本,getlab选ce版本,maven选jdk8版本。


  2、编排容器


  容器编排采用docker-compose.yml。


  2.1 mysql容器


  该容器作为测试数据的存储。由于容器中mysql的数据保存在容器的/var/lib/mysql目录下,所以将该目录挂载到宿主机上,这样即使容器被删除,容器中mysql的数据也依然存在,下次再新建容器时,读取宿主机的数据库数据,“之前的数据库就恢复了”。所以,这也是用docker来搭建数据库的好处,可以复制多个相同的数据库。


  2.1.1 新建mysql容器


  将容器的/var/lib/mysql目录挂载到宿主机的的/home/ivanli/myown/docker_test/docker_mysql/data目录;


  注意!必须确保宿主机的挂载目录下是空的,否则mysql容器启动会报错。


  mysql容器的3306端口映射到宿主机的3307端口;


  设置环境变量MYSQL_ROOT_PASSWORD,该变量的值即为mysql root用户的密码。


  sudo docker run -v -d /home/ivanli/myown/docker_test/docker_mysql/data:/var/lib/mysql --name myMysql -e MYSQL_ROOT_PASSWORD=88888888 -p 3307:3306 mysql


  2.1.2 测试数据存入mysql


  作为测试数据保存源,首先要将测试数据(包括测试基础数据和测试用例等)先插入到mysql容器中,完成测试数据库的初始化,这样以后就可用该数据库提供测试数据进行测试工作了。


  因为之前在宿主机上搭建了一套mysql,且创建好了数据库、表和数据,这里为了方便,直接将宿主机上mysql的数据库导出,导入进容器的mysql中。



  • 导出宿主机数据库数据



  mysqldump -u root -p --databases lego2TestData > mydb.bak



  • 将数据库文件copy进容器/root目录下



  sudo docker cp  mydb.bak myMysql:/root/



  • 进入mysql容器,导入数据



  ① 进入mysql容器


  sudo docker exec -it myMysql  /bin/bash


  ② 在容器内登录mysql数据库,密码为启动容器时的MYSQL_ROOT_PASSWORD环境变量的值


  docker -u root -p


  ③ 新建一个与要导入的数据库同名的数据库


  mysql> create database lego2TestData ;


  ④ 导入数据


  mysql> source /root/mydb.bak;


  至此,宿主机数据库就导入到mysql容器中了。


  mysql为了安全性,在默认情况下用户只允许在本地登录,即目前该数据库只能在容器内被登录,所以为了在容器外也能远程登录容器内的mysql,要对数据库进行权限设置,这里设置为允许root用户在任何地方进行远程登录,并可对数据库进行任何操作:


  grant all privileges on *.* to 'root'@'%' identified by '88888888' with grant option;


  因为容器中数据库的数据挂载在宿主机上,所以,上面导入的数据库数据在下次容器创建时依然存在。这样,就可以用该容器作为测试数据提供源了。


  2.2、maven容器


  工作中要测试的代码是java写的,所以测试代码以maven工程的形式编写,然后以挂载的方式,将测试代码挂载进maven容器中,在maven容器中执行测试。


  2.2.1、测试代码


  测试代码由以下几部分组成:


 ivanli@ubuntu:~/myown/docker_test/docker_legoTest/testSuites_auto_test$ ll


  total 36


  -rw-rw-r-- 1 ivanli ivanli    2 Nov  7 00:27 :


  drwxrwxr-x 5 ivanli ivanli 4096 Nov 14 03:05 ./


  drwxrwxr-x 4 ivanli ivanli 4096 Nov  8 22:32 ../


  drwxrwxr-x 4 ivanli ivanli 4096 Nov  7 00:27 config/


  drwxrwxr-x 2 ivanli ivanli 4096 Nov  7 00:27 lib/


  -rw-r--r-- 1 root   root   3987 Nov  7 00:32 pom.xml


  -rwxrwxr-x 1 ivanli ivanli  521 Nov  7 00:27 run.sh*


  drwxrwxr-x 4 ivanli ivanli 4096 Nov  7 00:27 src/


  -rw-rw-r-- 1 ivanli ivanli  309 Nov  7 00:27 testng.xml



  • config 配置文件



  与测试工程相关的配置文件存放在这个文件夹,另外,连接mysql容器读取测试数据的配置文件db.properties也存放在此文件夹下,该文件内容为:


  dbAddr = 192.168.201.130


  dbPort = 3307


  dbName = lego2TestData


  dbUser = root


  dbPassword = 88888888


  其中192.168.201.130为docker宿主机ip。



  • src 测试代码



  测试代码在src/test/java目录下。



  • pom.xml



  测试框架选用testNG,以依赖的形式引入到pom.xml中。


  因为testNG原生测试报告页面太low,所以用reportNG来生成测试报告。目前reportNG最高版本不支持中文,在网上down了别人改进的支持中文的reportNG jar包到本地,放入工程${project.basedir}/lib目录下。


  另外,测试数据从mysql中读取,所以pom.xml中引入java操作mysql的jar包。


  最后,因为要用到的maven容器中的java版本是1.8,所以maven-compiler-plugin插件中要指定java版本为1.8。


  相关内容在pom.xml中为:


  


  


  org.testng


  testng


  6.10


  test


  


  


  


  mysql


  mysql-connector-java


  5.1.38


  


  


  


  org.uncommons


  reportng


  1.1.5


  system


  ${project.basedir}/lib/reportng-1.1.5.jar


  


  


  velocity


  velocity


  1.4


  


  


  com.google.inject


  guice


  4.0


  


  


  


  


  


  


  org.apache.maven.plugins


  maven-surefire-plugin


  2.18.1


  


  


  


  usedefaultlisteners


  false


  


  


  listener


  org.uncommons.reportng.htmlReporter,


  org.uncommons.reportng.JUnitXMLReporter


  


  


  target/


  


  testng.xml


  


  always


  


  


  


  maven-compiler-plugin


  3.1


  


  utf-8


  true


  1.8


  1.8


  


  


  


  



  • lib 存放本地依赖jar包



  这个文件夹只是用来存放上面提到的下载到本地的支持中文的reportNG jar包。其实也可以将该jar包上传到自己的maven私服,然后在pom.xml中引入。这里就放在lib目录下:


ivanli@ubuntu:~/myown/docker_test/docker_legoTest/testSuites_auto_test/lib$ ll


  total 44


  drwxrwxr-x 2 ivanli ivanli  4096 Nov  7 00:27 ./


  drwxrwxr-x 5 ivanli ivanli  4096 Nov 14 03:05 ../


  -rw-rw-r-- 1 ivanli ivanli 34655 Nov  7 00:27 reportng-1.1.5.jar



  • testng.xml 写明测试套件和用例



  testng.xml中写入要测试的套件和测试用例,这里就不多说了。



  • run.sh 测试运行脚本



  脚本内容如下:


  #!/bin/bash


  #  mvn clean


  mvn clean


  # 获取当前脚本所在路径


  workdir=$(cd $(dirname "$0");pwd)


  # 配置文件所在路径


  dbCOnfig=$workdir'/config/dbconfig/db.properties'


  scfCOnfig=$workdir'/config/online/scf.config'


  # 配置文件复制到下面路径


  toDbCOnfigPath=$workdir'/target/config/dbconfig'


  toScfCOnfigPath=$workdir'/target/config/online'


  # 复制配置文件


  mkdir -p "$toDbConfigPath"


  mkdir -p "$toScfConfigPath"


  cp "$dbConfig" "$toDbConfigPath"


  cp "$scfConfig" "$toScfConfigPath"


  #  mvn test


  mvn test


  该脚本主要包含3步:


  ① mvn clean


  清理项目目录下的targer目录。


  ② 复制配置文件到项目的target目录下


  由于编译后的测试代码是去工程的target/config目录下读取配置文件,而步骤①删除了target目录,所以步骤②需要手动新建target目录,并把配置文件复制到该目录下。


  ③ mvn test


  执行测试,mvn test命令将调用testng执行测试。


  2.2.2、maven容器编排


  由于测试数据从mysql容器中读取,所以测试时,需要mysql容器先启动,再启动maven容器,即maven容器的启动依赖于mysql容器。因此,这里将mysql容器和maven容器放入同一个docker-compose.yml中编排:



  • docker-compose.yml



  version: '2'


  services:


  mysql:


  image: mysql


  ports:


  - "3307:3306"


  container_name: myMySQL


  volumes:


  - "/home/ivanli/myown/docker_test/docker_mysql/data:/var/lib/mysql"


  maven_lego_adServiceTest:


  image: maven


  container_name: maven_lego


  depends_on:


  - mysql


  volumes:


  # 将gitlab拉下来的maven工程导入容器中


  - "/home/ivanli/myown/jenkins_node/workspace/lego2_AdServiceTestSuite/testSuites_auto_test:/usr/src/app"


  #  将gitlab拉下来的maven配置文件替换容器的maven配置文件


  - "/home/ivanli/myown/jenkins_node/workspace/lego2_AdServiceTestSuite/dockerMavenConf/settings.xml:/usr/share/maven/conf/settings.xml"


  # 将宿主机目录作为maven仓库,做缓存用


  - "/home/ivanli/myown/.m2/repo:/usr/share/maven/ref"


  entrypoint: ["/usr/src/app/run.sh"]


  mysql服务的启动,这里不再复述。


  maven_lego_adServiceTest服务说明如下:


  ① depends_on


  因为maven容器要读取mysql中的测试数据,所以要依赖mysql服务先启动。


  ② volumes挂载


  挂载分3部分:


  a、将gitlab拉下来(通过jenkins拉代码,拉下的代码所在目录为jenkins执行节点的工作区间)的测试代码maven工程testSuites_auto_test挂载到容器的/usr/src/app目录下;


  b、将gitlab拉下来的maven配置文件替换容器的maven配置文件;


  c、为了缓存maven容器下载的jar包,这里将maven容器中的maven仓库挂载到宿主机的/home/ivanli/myown/.m2/repo目录下。这样就不用每次启动容器都重新下载引用jar包了,提高测试速度。


  ③ entrypoint


  容器启动后,要执行测试代码中的run.sh脚本执行测试,因为测试代码工程挂载到容器的/usr/src/app目录下,所以这里执行该目录下的run.sh脚本。



  • 容器启动脚本dockerrun.sh



  因为希望实际测试时,在开始测时创建容器,测试完成后删除容器,所以将该部分控制命令写入dockerrun.sh中:


  #!/bin/bash -e


  # 启动maven容器,执行测试


  sudo docker-compose run -w /usr/src/app maven_lego_adServiceTest


  # 删除容器


  sudo docker-compose down


  注意!实际启动容器执行测试的时候,不知为什么不能直接执行entrypoint中写明的/usr/src/app/run.sh脚本,提示在/目录下找不到run.sh的错误。所以在启动maven_lego_adServiceTest服务之前,先通过-w切换工作目录到/usr/src/app目录下,再启动maven_lego_adServiceTest服务,这样就可以成功执行run.sh脚本了。


  容器执行测试完毕后,再执行docker-compose down,删除容器。


  2.3、gitlab容器


  gitlab容器作为远程代码仓库,存放测试代码。


  2.3.1、gitlab容器编排



  • docker-compose.yml



  version: '2'


  services:


  gitlab:


  image: gitlab/gitlab-ce


  ports:


  - "8443:443"


  - "8929:80"


  - "2222:22"


  container_name: gitlab


  volumes:


  - "/home/ivanli/myown/docker_test/docker_gitlab/config:/etc/gitlab"


  - "/home/ivanli/myown/docker_test/docker_gitlab/logs:/var/log/gitlab"


  - "/home/ivanli/myown/docker_test/docker_gitlab/data:/var/opt/gitlab"


  ① gitlab容器的https端口映射到宿主机的8443端口,http端口映射到宿主机的8929端口,ssh端口映射到宿主机的2222端口。


  ② gitlab容器中的/etc/gitlab、/var/log/gitlab和/var/opt/gitlab目录挂载到宿主机上。


  2.3.2、配置gitlab


  配置gitlab容器的/etc/gitlab/gitlab.rb


  首先启动gitlab容器。


  sudo docker-compose up -d


  容器启动后,修改gitlab的配置文件/etc/gitlab/gitlab.rb。因为其所在目录有挂载到宿主机上,所以直接修改宿主机的/home/ivanli/myown/docker_test/docker_gitlab/config/gitlab.rb文件


  这里配置为docker宿主机ip


  external_url 'http://192.168.201.130'


  ② 配置ssh端口号


  ### GitLab Shell settings for GitLab


  gitlab_rails['gitlab_shell_ssh_port'] = 2222


  然后重启gitlab容器。


  sudo docker restart gitlab


  浏览器访问http://192.168.201.130:8929,出现如下页面说明gitlab容器搭建ok。


借持续集成的思想搞接口测试自动化


......


借持续集成的思想搞接口测试自动化









 


推荐阅读







点击阅读☞


点击阅读☞


点击阅读☞


点击阅读☞


点击阅读☞


















点击左下角“阅读原文”,查看全文内容!






推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • C#数字图像处理的3种方法
    来源:http:zxlovenet.cnblogs.com本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文介绍了Foundation框架中一些常用的结构体和类,包括表示范围作用的NSRange结构体的创建方式,处理几何图形的数据类型NSPoint和NSSize,以及由点和大小复合而成的矩形数据类型NSRect。同时还介绍了创建这些数据类型的方法,以及字符串类NSString的使用方法。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
author-avatar
min覀igreenr
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有