Spock测试框架实践(三)
在上一次Spock实践中我们介绍了Spock的基本概念,今天我们继续介Spock的数据驱动和一些技巧。
一、首先介绍下spock中的数据驱动:
Spock框架支持多种数据驱动方式
1.数据表,强于可读性,适合数据量小的场景
2.数据管道,强于可维护性,适合数据量多的场景
步骤:
a. 在用例中,把可变的变量参数化
b. 在where模块中配置参数数据
在实际测试工作中,往往测试数量较大,此时最佳实践方式是从数据库读取数据作为驱动数据,例如:
二、技巧
1.对象构建技巧
在测试过程中,需要构建测试数据对象,对于比较复杂属性的对象构造,用java往往比较繁琐笨重,需要不断调用setter方法设置属性值,但是groovy语法可以基于map的构造器构造对象,能节省很多的代码。
通过groovy的object.with结构可以分组对象参数,例如
def "冒烟测试"() {
given:"discount coupon param"
def stairList = []
1.upto(3, { stairList<< new CouponStair(quota: 1000 * it, discount: 0.9 - 0.1 * it)})
baseCoupon = newCoupon()
baseCoupon.with {
setStyle(3)
setMaxDiscount(2000)
setStairs(stairList)
setGrantType(grantType)
}
when:"execute create coupon"
def createCoupon =couponWriteService.createCoupon(clientInfo, baseCoupon, null)
then:"check the create result"
createCoupon
println(createCoupon)
where:"grantType is below"
grantType<< [1, 2, 3, 5]
}
2.集合操作技巧
l each()方法-遍历集合,闭包应用于每个元素
def "打印批次信息"() {
def coupons =(100101435..100101440).collect { couponId -> couponReadService.getByCouponId(clientInfo,00001, couponId) }
expect:
coupons
coupons.each {coupon -> println "
}
l any()方法-遍历集合,若至少一个元素满足闭包条件,返回true,否则返回false
promotionSummaryList.empty ?: promotionSummaryList.any {
it.promotionType == 3 && it.promotionSubType == 302
}
l every()方法-遍历集合,若每个元素都满足闭包条件,返回true,否则false
def "demo every"() {
expect:
(1..10).every {it > 0 }
l find()方法 找到集合中第一个符合条件的元素并返回该元素,未找到则返回null 2 == (1..10).find { i -> i % 2== 0 }
l findAll()方法 遍历集合并返回符合条件的元素集合。
[2, 4, 6, 8, 10] ==(1..10).findAll { i -> i % 2 == 0 }
l collect()方法 集合中的元素根据条件转化为新的元素并返回一个新元素集合。
[1, 8, 27] == (1..3).collect { i -> i**3 }
l list.elesFild()直接返回元素指定字段组成列表。
def "demo 列表直接返回元素相关属性列表"() {
PromotionSkuQueryquery = new PromotionSkuQuery(venderId: 20361, promoId: 1000372401)
def promotionSkuList =promotionReadInnerService.getPromotionSkuList(new ClientInfo(appName:"marketCenter"), query)
def skuIds =promotionSkuList.skuId
expect:
skuIds instanceof List
println skuIds
}
列表元素去重
def "两种方法,列表元素去重"() {
def x = [1,1,1]
expect:
assert [1] == newHashSet(x).toList()
assert [1] == x.unique()
}
def "列表去null"() {
def x = [1,null,1]
expect:
assert [1,1] == x.findAll{it!= null}
assert [1,1] == x.grep{it}
}
- Nginx 负载均衡的Cache缓存批量清理的操作记录
- DotNet软件开发框架
- Nginx通过https方式反向代理的简单实现
- 再论IBatisNet + Castle进行项目的开发
- 利用xml轻松读取web.config中的用户自定义节
- 分布式监控系统Zabbix-3.0.3-完整安装记录(3)-监控nginx,php,memcache,Low-level discovery磁盘IO
- python报错问题解决:'ascii' codec can't encode character
- 利用message queue实现aspx与winform通信, 并附完整示例
- 10招步骤保护IIS服务器安全
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
- Android-Universal-Image-Loader 图片异步加载类库的使用
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
- haproxy反向代理环境部署(http和https代理)
- 网站速度优化模块HttpCompressionModule
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Docker快速搭建WordPress博客网站
- Elasticsearch入门,这一篇就够了
- 玩转 lua in Redis
- 用docker快速搭建wordpress博客
- 生产环境优雅的重启基于Nginx、Tornado的Web服务进程
- nginx记录post body/payload数据 日志用打印出结果
- nginx的location、rewrite玩法详解
- Redis Lua脚本调试
- 安装elasticsearch 5.x, 6.x 常见问题(坑)的解决
- 轻松搞懂elasticsearch概念
- 深入Golang调度器之GMP模型
- 深入Golang之sync.Pool详解
- 一次对电视盒子的漏洞分析
- MQ选型之RabbitMQ
- httprouter与 fasthttp 的性能对比