Upload
bqconf
View
542
Download
3
Embed Size (px)
Citation preview
广联达软件股份有限公司 测试管理部 王妍
自动化测试大揭秘之-------- 大量地区化的自动化应对方案
广联达软件股份有限公司
立足工程建设领域,围绕工程项目的全生命周期,提供软件产品和企业信息化整体解决方案
建设领域信息化产业首家上市的软件公司
产品
20余项核心技术、56个软件版权
人员 研发系由300多人组成,其中开发180人,测试110人,并外聘30多名全国业内权威专家
困境 思考 尝试 效果 未来
新产品延后一年半发版
困境 思考 尝试 效果 未来
千行bug率高达16‰
困境 思考 尝试 效果 未来
进度慢
质量差
产能低
怎么办?
试点项目
重点难点问题
相对独立
性价比
有代表性
基于UI自动化
影响小
有资源
难度小
困境 思考 尝试 效果 未来
敏捷 自动化测试
同一产品自动化的持续维护和变更?
用例清晰 脚本清晰
困境 思考 尝试 效果 未来
用例清晰
单个功能
功能组合
重点流程
网状结构的覆盖度
重要程度
投入产出比
困境 思考 尝试 效果 未来
用例清晰
单一test只测试单一功能 控制test的大小和运行时间 Test中尽量减少不必要的数据和操作
困境 思考 尝试 效果 未来
脚本清晰 模块化和分层思想是保证事物条理清晰的重要手段。
表现层
逻辑层
数据层
业务(DSL)
功能操作
数据
Test
函数
数据
困境 思考 尝试 效果 未来
与业务相关,与具体操作过程无关 体现测试用例的内容 易读性高,业务人员也可以阅读
Test
函数
数据
困境 思考 尝试 效果 未来
Test编写模式
构造数据 操作1 操作2 … 取数据(如需要) 验证
困境 思考 尝试 过程 效果
Test
函数
数据
单一职责 构造数据、操作和验证由不同的函数完成。 同一函数只实现单一功能,不包含附加功能。
困境 思考 尝试 过程 效果
Test
函数
数据 优点 降低复杂度,易于编写和维护 职责明确,易于提取公共
专属和共用 专属是指使用范围小,仅与某一故事相关。 共用是指软件的基础功能,多个故事均需要使用
困境 思考 尝试 过程 效果
Test
函数
数据
编写故事 专属函数 其他故事使用 公共函数
数据内容:输入和需要验证的结果 使用方式:取输入数据,操作,将实际结果与数据进行对比
困境 思考 尝试 过程 效果
Test
函数
数据
问题: 数据量庞大,难以维护
当软件算法改变时,所有结果数据均错误,需要重新验证和替换。
Test
函数
数据
困境 思考 尝试 效果 未来
数据是操作和验证中必须要知道的软件的信息 能通过逻辑查找的通过查找定位 脚本中实现软件算法,操作结果和脚本计算结果对比。
Test
函数
数据
困境 思考 尝试 效果 未来
数据组织
相关联的数据放在一起 数据与操作无关 数据与具体测试业务无关
Test
函数
数据
困境 思考 尝试 效果 未来
同一平台下全国31个地区的通性功能的测试? 衍生产品通性功能的测试?
困境 思考 尝试 效果 未来
基础数据不同 操作不同 业务流程不同 增加或缺少业务
1. 替换数据文件 2. 使用工具抽提数据内容 3. 脚本中数据的提取见前文数据部分
困境 思考 尝试 效果 未来
基础数据不同 操作不同 业务流程不同 增加或缺少业务
1. 简单操作函数内部消化(识别界面情况)
2. 重点操作可专门验证 3. 重写改操作对应的函数 4. 重点在于控制函数粒度
困境 思考 尝试 效果 未来
基础数据不同 操作不同 业务流程不同 增加或缺少业务
1. 简单流程区别函数内部消化(识别界面情况)
2. 重点流程可专门验证 3. 重写流程对应的函数 4. 重点在于函数的分层
困境 思考 尝试 效果 未来
基础数据不同 操作不同 业务流程不同 增加或缺少业务 1. 业务划分清晰
2. 不同的业务测试由不同的类完成 3. 是否测试某业务可配置
困境 思考 尝试 效果 未来
特殊情况下的测试?
大量重复操作下的测试 多程序同时测试 效率测试 对XML、EXCEL的测试
困境 思考 尝试 效果 未来
综合举例
BEGIN { @@地区 = '陕西' require 'gtf_for_test.rb' add_rel_path(__FILE__) require '数据冒烟公共函数' class Test_AA < Test::Unit::TestCase include Module_数据冒烟公共函数
def get_value return 提取所有库信息(地区, "遍历定额子目", true, false, false, false) end end r = Test_AA.new('get_value') $a = r.get_value } module Add_test def self.included(klass) $a.each do |item| klass.send(:define_method, "test_#{item.values_at("计价方式","清单库","定额库","清单专业").join('_')}数据冒烟".to_sym){单个工程数据冒烟(item)}#动态生成方法
end end end class Test_单位工程冒烟 < Test::Unit::TestCase .... include Module_数据冒烟公共函数
include Add_test def test_aa end def 单个工程数据冒烟(工程新建信息) 新建单位工程(*工程新建信息.values_at("计价方式","工程名称","清单库","定额库","清单专业","定额专业", "估价表")) .... ensure should(报错标志, "当前报错的库,清单库: #{工程新建信息["清单库"]}, 定额库: #{工程新建信息["定额库"]}, 清单专业: #{工程新建信息["清单专业"]}, 定额专业: #{工程新建信息["定额专业"]}, 估价表 #{工程新建信息["估价表"]}") end end
困境 思考 尝试 效果 未来
困境 思考 尝试 效果 未来
XX地区化开发 手工测试(本地区)
纯手工测试的地区化产品开发状况:
加入自动化测试的地区化产品开发状况:
XX地区化开发 手工测试(本地区)
手工回归测试(其他地区一)
手工回归测试(其他地区二) …自动化回归测试(本地区、其他地区一、二、三…)
3倍于程序的自动化测试代码 每周发版 每天相当于数千万次的人工操作验证
自动化测试工作展望
自动化测试可用于开发自测 自动化测试驱动开发… 自动化测试是一个综合性产品,不同部分选用最经济实惠的工具或语言
困境 思考 尝试 效果 未来
一个民族有一些关注天空的人,他们才有希望
谢谢