Groovy(java)+Spock+IDEA+maven+Jenkins+SVN+maven-surefire-plugin+maven-surefire-report-plugin/maven-antrun-extended-plugin集成接口测试框架
文章为原创,未经本人授权禁止转载。
一、spock框架环境搭建。
二、基于spock框架的脚本开发。
三、基于spock框架的用例执行并生成HTML报告。
四、集成jenkins生成HTML报告。
五、通过tomcat访问HTML报告。
一、spock框架环境搭建
1、插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- Optional plugins for using Spock -->
<!-- Only required if names of spec classes don't match default Surefire patterns (`*Test` etc.) -->
<!--使用mvn test命令生成xml和txt结果文件-->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<includes>
<!--指定需要执行的测试类路径-->
<include>themis/shenpijieguo/*Spec</include>
</includes>
</configuration>
</plugin>
<!-- Mandatory plugins for using Spock -->
<plugin>
<!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
visit https://github.com/groovy/GMavenPlus/wiki -->
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 使用mvn test surefire-report:report 将先生成xml和TXT结果文件,再将xml结果文件转化为HTML报告,该报告排版不好-->
<!--<plugin>-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-surefire-report-plugin</artifactId>-->
<!--<version>2.20</version>-->
<!--<configuration>-->
<!--<showSuccess>true</showSuccess>-->
<!--</configuration>-->
<!--</plugin>-->
<!-- Only required for spock-example build -->
<!--<plugin>-->
<!--<artifactId>maven-deploy-plugin</artifactId>-->
<!--<version>2.5</version>-->
<!--<configuration>-->
<!--<skip>true</skip>-->
<!--</configuration>-->
<!--</plugin>-->
<!-- 用mvn ant生成格式更友好的report -->
<!-- 执行命令为mvn test生成格式更好的HTML报告 -->
<plugin>
<groupId>org.jvnet.maven-antrun-extended-plugin</groupId>
<artifactId>maven-antrun-extended-plugin</artifactId> <!-- //////////// -->
<executions>
<execution>
<id>test-reports</id>
<phase>test</phase> <!-- //////////// -->
<configuration>
<tasks>
<junitreport todir="${basedir}/target/surefire-reports">
<fileset dir="${basedir}/target/surefire-reports">
<include name="**/*.xml" />
</fileset>
<report format="frames" todir="${basedir}/target/surefire-reports" /> <!-- //////////// -->
</junitreport>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-junit</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-trax</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
</plugin>
2、依赖
<!-- Mandatory dependencies for using Spock -->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.0-groovy-2.4</version>
</dependency>
<!-- Optional dependencies for using Spock -->
<dependency> <!-- use a specific Groovy version rather than the one specified by spock-core -->
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.1</version>
</dependency>
<dependency> <!-- enables mocking of classes (in addition to interfaces) -->
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.1</version>
<!--<scope>profile.test</scope>-->
</dependency>
<dependency> <!-- enables mocking of classes without default constructor (together with CGLIB) -->
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>2.1</version>
<!--<scope>profile.test</scope>-->
</dependency>
<dependency> <!-- only required if Hamcrest matchers are used -->
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<!--<scope>profile.test</scope>-->
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.185</version>
</dependency>
<dependency>
<groupId>com.github.rest-driver</groupId>
<artifactId>rest-server-driver</artifactId>
<version>1.1.43</version>
</dependency>
<dependency> <!--mysql 数据库 driver jar-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- Spring jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.3.RELEASE</version>
<!--<version>${springframework.version}</version>-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.3.RELEASE</version>
<!--<version>${springframework.version}</version>-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.3.RELEASE</version>
<!--<version>${springframework.version}</version>-->
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework</groupId>-->
<!--<artifactId>spring-context-support</artifactId>-->
<!--<!–<version>${springframework.version}</version>–>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.4</version>
</dependency>
<!--读取Excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
<!--Json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
<!-- guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<!-- Joda Time-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javassist/javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
<!-- // if you don't already have slf4j-api and an implementation of it in the classpath, add this! -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.13</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
</dependency>
<!--+++++++++++++++++++++++++++++++junit+ant+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- https://mvnrepository.com/artifact/org.apache.ant/ant-trax -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-trax</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-junit</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.jvnet.maven-antrun-extended-plugin</groupId>
<artifactId>maven-antrun-extended-plugin</artifactId>
<version>1.43</version>
</dependency>
<!--++++++++++++++++++++++++++++++++++++++testng report++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!--<dependency>-->
<!--<groupId>com.relevantcodes</groupId>-->
<!--<artifactId>extentreports</artifactId>-->
<!--<version>2.41.1</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>com.vimalselvam</groupId>-->
<!--<artifactId>testng-extentsreport</artifactId>-->
<!--<version>1.3.1</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>com.aventstack</groupId>-->
<!--<artifactId>extentreports</artifactId>-->
<!--<version>3.0.6</version>-->
<!--</dependency>-->
<!--<!– https://mvnrepository.com/artifact/org.testng/testng –>-->
<!--<dependency>-->
<!--<groupId>org.testng</groupId>-->
<!--<artifactId>testng</artifactId>-->
<!--<version>6.9.10</version>-->
<!--<!– <scope>test</scope> –>-->
<!--</dependency>-->
3、仓库
<repositories>
<!-- Only required if a snapshot version of Spock is used -->
<repository>
<id>spock-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- Only required in spock-example build -->
<distributionManagement>
<repository>
<id>foo</id>
<url>file:///fake.repository.to.make.maven.happy</url>
</repository>
<snapshotRepository>
<id>bar</id>
<url>file:///fake.repository.to.make.maven.happy</url>
</snapshotRepository>
</distributionManagement>
4、创建maven项目,目录结构如下:
二、spock框架的脚本开发
1、创建测试类基类,继承spock框架的抽象类Specification,具体用例测试类继承该基类,在基类中可以对数据库,cookie进行初始化。
/**
* 测试类-基类
* (添加了几个db连接的static属性)
*
* Created by zhf2015 on 16/7/13.
*/
class BaseSpockTest extends Specification {
@Shared static themis_db = CommonUtil.getSqlInstanceOfthemisdb()
/** @Shared static cookie =
* collection.version.Common.getcookie(Common.loginurl,Common.loginparam)
*/
@Shared header_cookie = RestServerDriver.header("Cookie",cookie)
}
2、创建具体测试类,继承上述基类,以下是最简单的写法
package themis.shenpijieguo
import spock.lang.Unroll
import themis.BaseSpockTest
import themis.Common
class applydetailSearchByReportSpec extends BaseSpockTest {
def setupSpec() {
//TODO: 设置每个测试类的环境
}
def setup() {
//TODO: 设置每个测试方法的环境,每个测试方法执行一次
}
@Unroll("该case验证接口url=#url,入参applyStatus=#applyStatus,pageSize=#pageSize,applyId=#applyId,page=#page,ruleId=#ruleId")
def "测试方法1"() {
given: "清理脏数据"
// handleOk &= themis_db.execute('''delete from case_operation_records where id=?''',id);
// and: "添加测试数据"
// handleOk &= themis_db.execute('''delete from case_operation_records where id=?''',id);
println("themis_db:" + themis_db.getConnection().getMetaPropertyValues().toString())
and: "实际值"
def paramStr=""
HashMap paramMap = new HashMap();
paramMap.put("applyStatus",applyStatus)
paramMap.put("pageSize",pageSize)
paramMap.put("page",page)
paramMap.put("ruleId",ruleId)
paramMap.put("applyId",applyId)
Set keySets=paramMap.keySet()
for (String keyName:keySets){
if (paramMap.get(keyName)!=""){
paramStr+="&"+keyName+"="+paramMap.get(keyName)
}
}
paramStr=paramStr.substring(1, paramStr.length())
def reponse = Common.PostUrl(url,paramStr, header_cookie)
// def content = reponse.getContent()
def jsonNodes=reponse.asJson()
println("paramStr:" + paramStr)
println("reponse:" + reponse)
println("jsonNodes:" + jsonNodes)
def r_status = reponse.getStatusCode()
def r_success=jsonNodes.get("success").asText()
def r_errorMsg=jsonNodes.get("errorMsg").asText()
def r_errorCode=jsonNodes.get("errorCode").asText()
def r_attributes=jsonNodes.get("attributes").asText()
def r_attributesJson=jsonNodes.get("attributesJson").asText()
def r_exception=jsonNodes.get("exception").asText()
def r_total=jsonNodes.get("total").asInt()
def r_hasMore=jsonNodes.get("hasMore").asText()
and: "预期值"
//TODO:
expect: "随处可用的断言"
r_status==200&&r_success=="true"&&r_errorMsg==""&&r_errorCode==""&&r_attributes=="null"&&r_attributesJson==""&&r_exception=="null"&&r_total==1&&r_hasMore=="false"
where: "不是必需的测试数据"
index | applyId|ruleId|page|pageSize|applyStatus| url
1 | 10975001|2230012|1|10 |""|Common.hostUrl+"/apply/detailSearchByReport.json"
}
def cleanup() {
//TODO: 清理每个测试方法的环境,每个测试方法执行一次
}
def cleanupSepc() {
//TODO: 清理每个测试类的环境
}
}
三、基于spock框架的用例执行并生成HTML报告
1、采用Junit 执行或者直接运行类文件
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import themis.shenpijieguo.applydetailSearchByReportSpec;
import themis.shenpijieguo.applydetailSearchSpec;
@RunWith(Suite.class)
@SuiteClasses({applydetailSearchByReportSpec.class,applydetailSearchSpec.class})
public class JunitTestSuites {
}
2、利用插件中的maven-surefire-plugin+maven-surefire-report-plugin执行生成结果HTML报告:
1)pom.xml文件中maven-surefire-plugin中指定需要执行的测试类
2)使用mvn clean test surefire-report:report命令相当于使用了mvn clean test,mvn surefire-report:report两个命令
3)打开项目路径中\target\site\surefire-report.html文件即为结果报告,报告格式不好,建议使用下面方式执行。
3、利用maven-antrun-extended-plugin插件生成ant 生成的HTML报告
1)在pom.xml中添加maven-surefire-plugin和maven-antrun-extended-plugin
插件
2)使用mvn clean test直接运行。
3)打开/target/surefire-reports/index.html文件,显示结果报告
四、集成jenkins生成HTML报告
1)使用publish Junit test result插件生成Junit HTML报告.构建自由风格的job,适合结果文件为xml格式
Job设置:
结果报告:
2)使用publish HTML report插件生成ant HTML报告,适合结果文件是HTML格式的方式。
I: Job设置
Ii. 查看报告
注:ant生成的HTML报告,使用chrome打开时会出现jenkins的安全策略原因导致无法显示,这时可以用IE去显示。
解决办法参考:
https://zhuanlan.zhihu.com/p/28080975
五、通过tomcat访问HTML报告
1、修改tomcat服务器conf文件夹下的server.xml文件,添加context标签如下所示
2、增加以下标签,其中docBase为需要访问的外部文件夹路径
3、启动tomcat服务器,输入url:http://localhost:8080/index.html, 可以访问HTML静态资源。
Groovy(java)+Spock+IDEA+maven+Jenkins+SVN+maven-surefire-plugin+maven-surefire-report-plugin/maven-antrun-extended-plugin集成接口测试框架的更多相关文章
- 搭建基于IDEA+Selenium+Java+TestNG+Maven+Jenkins+SVN的Web端UI自动化测试环境
第一步:工具下载安装配置 JDK安装与配置 IDEA安装与配置 Maven安装与配置 Tomcat部署与配置 Jenkins部署与配置 Svn安装与配置 各浏览器驱动下载与配置 第二步:集成各个工具到 ...
- java+maven+jenkins+svn构建
操作参照:https://blog.csdn.net/qq_34977342/article/details/82346915 1.创建一个自由风格的项目,起名字 2.设置构建项目最大保存数量,与天数 ...
- Selenium+TestNG+Maven+Jenkins+SVN(转载)
转载自:https://blog.csdn.net/u014202301/article/details/72354069 一. 创建Maven项目,下载Selenium和TestNG的依赖(依赖可以 ...
- Jenkins+SVN+Maven+shell 自动化部署实践
JAVA环境中利用Jenkins+svn+maven进行自动化部署实践 一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...
- 自动化测试框架:jmeter + maven+ jenkins
原理:jenkins驱动maven执行,maven驱动jmeter执行 前提条件:windows安装了jmeter.maven.tomcat.jenkins 安装方法参考汇总目录中对应的博文:http ...
- 项目持续集成环境(jenkins + SVN + maven + tomcat)
整体流程 每次SVN上代码有变动,触发自动构建动作,并部署到服务器的tomcat上,具体流程: 1.SVN上提交代码修改 2.maven执行Goals 3.将web工程打成war包 4.关闭服务器的t ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- Jenkins+svn+maven
首先我们在我们的服务器上安装好svn和maven 这里在前两步骤基本上没有啥问题,主要就是在Jenkins的步骤我弄了好长时间,这里记录一下 Jenkins的问题我是在这个网址解决的:http://b ...
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...
随机推荐
- 风情万种awk
awk是基于列的文本处理工具,所有的文件都是由单词和各种空白字符组成.这里"空白字符"包括空格.tab以及连续的空格和tab,每个非空白的部分叫做"域",从左到 ...
- 常用的smarty变量操作
php模板引擎smarty的变量操作符可用于操作变量,自定义函数和字符.语法中使用"|"应用变量操作符,多个参数用":"??指簟?/DIV> capita ...
- AndroidManifest.xml文件详解(meta-data)
http://blog.csdn.net/think_soft/article/details/7567189 语法(SYNTAX): <meta-dataandroid:name=" ...
- 【SPOJ Query on a tree 】 (树链剖分)
http://acm.hust.edu.cn/vjudge/problem/13013 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...
- 安卓 应用app启动过程
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 从用户点击 Launcher 上的 App 图标,到显示出 App 界面时主要发生的事情.知晓以 ...
- 浅谈OI中的提交答案
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
- HDU 6060 RXD and dividing(LCA)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6060 [题目大意] 给一个n个节点的树,要求将2-n号节点分成k部分, 然后将每一部分加上节点1, ...
- 基于socket的udp传输,socketserver模块,进程
基于UDP的套接字 udp是无连接的,先启动哪一端都不会报错 socket.SOCK_DGRAM 数据报协议 udp不会发送空数据,什么都不输入直接发送也会有报头发过去 服务端 import sock ...
- QPS相关的概念收集(吞吐量(TPS)、QPS、并发数、响应时间(RT))
一.概念: 1.响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许 ...
- 移动应用安全开发指南(Android)--Android组件和IPC
概述 移动应用开发中,往往有跨进程通信的需求,方便地实现程序间的数据共享.Android提供了多种IPC通信的方式,给开发人员带来了便利,但如果选择或使用不当,就有可能发生各种各样的风险. 安全准则 ...