coverage of core model -> 53%
code to test ratio -> 1:0.7
我们希望成长!
Then /系统显示当前所有应用/ do count = 0 @browser.html.scan(/名称/){count += 1} count.should == App.reals.count end
# roles.rb 使用代码制造数据 Role.create(:name => Role::Admin) Role.create(:name => Role::PE) Role.create(:name => Role::APPOPS)
# inventory.rb 直接装载sql,提高测试速度 conn = ActiveRecord::Base.connection data_file = "#{Rails.root}/fixtures/load_all.sql" File.readlines(data_file).each do |line| conn.execute line end
# coffees.rb 数据间的依赖 S.define :hangzhou do S[:dalian]=City.create(name: "HangZhou") end S.define :cafes, :req => :hangzhou do S[:starbucks]=Store.create( name: "Starbucks", city: S[:dalian] ) S[:metoo]=Store.create( name: "Metoo", city: S[:dalian] ) end
def fixture *args args.each do |fixture| load "#{Rails.root}/fixtures/#{fixture}.rb" end end
When /应用和机器数据已经导入/ do fixture :inventory end
# language: zh-CN 功能: 基本运维 系统运维的基本用例 场景: 用户通过系统进行一次运维操作的完整流程 假如创建了一个应用,名字是center 而且应用center包含机器localhost 而且基础数据已经导入 当lifu被任命为center的PE 而且lifu通过浏览器登录系统 那么系统显示center应用 而且机器列表中包含localhost
# 用例描述 当lifu开始管理自己的指令
# 驱动代码 When /(.+)开始(.+)/ do |user, behaviour| user = find_or_create_user(user) case behaviour when '管理自己的指令' @browser.link(:text, '管理我的指令').click end end
!!!发现可消除的重复
# 用例描述当lifu开始管理自己的指令当lifu开始管理我的指令
When /(.+)开始(.+)/ do |user, behaviour| user = find_or_create_user(user)case behaviour when '管理自己的指令' @browser.link(:text, '管理我的指令').click end@browser.link(:text, behaviour).click end
小结:一致性通常能提高复用水平
# 用例描述 ...... 当lifu开始管理我的指令 那么系统显示我的指令列表
# 驱动代码 Then /^系统显示(.+)列表$/ do |title| @browser.html.should include(title) end
验证能力不足!!!
# 修改视图文件view ...我的指令列表<span class="title">我的指令列表</span> ...
# 用例描述Then /^系统显示(.+)列表$/ do |title| @browser.html.should include(title) endThen /^系统显示(.+)列表$/ do |title| @browser.span(:text, title).class_name.should == 'title' end
小结:测试推进html文档结构化
# 驱动代码 Then /^系统显示(.+)列表$/ do |title| span = nil @browser.wait_until do span = @browser.span(:text, "#{title}列表") span.exist? end @zone = span. tap{|e| e.should_not be_nil}. parent. tap{|e| e.tag_name.should == "h2" }. parent. tap{|e| e.tag_name.should == 'div'}
当用户在其中执行创建...
# 用例描述 ...... 当用户填写指令date并提交 那么列表中出现date指令 当用户在列表中删除date指令
# 驱动代码 When /用户在列表中删除(.+)指令/ do |command| @zone.span(:text, command).parent.link(:text, "删除").click end
失败!!! Element is no longer attached to the DOM
# 驱动代码 When /用户在列表中删除(.+)指令/ do |command| span = nil @browser.wait_until do span = @browser.span(:text, "#{title}列表") span.exist? end @zone = span. tap{|e| e.should_not be_nil}. parent. tap{|e| e.tag_name.should == "h2" }. parent. tap{|e| e.tag_name.should == 'div'} @zone.span(:text, command).parent.link(:text, "删除").click end
缺少变量!
# 用例描述 ...... 当用户填写指令date并提交 那么列表中出现date指令 当用户在我的指令列表中删除date指令
When /用户在(.+)列表中删除(.+)指令/ do |title, command| ...
依然失败—— Modal dialog present (Selenium::WebDriver::Error::UnhandledAlertError)
# 驱动代码 When /用户在(.+)列表中删除(.+)指令/ do |title, command| @browser.execute_script( "window.confirm = function() {return true}" ) span = nil @browser.wait_until do span = @browser.span(:text, "#{title}列表") span.exist? end @zone = span. tap{|e| e.should_not be_nil}. parent. tap{|e| e.tag_name.should == "h2" }. parent. tap{|e| e.tag_name.should == 'div'} @zone.span(:text, command).parent.link(:text, "删除").click end
考虑复用
def get_list_zone_by_title title span = nil @browser.wait_until do span = @browser.span(:text, "#{title}列表") span.exist? end @zone = span. tap{|e| e.should_not be_nil}. parent. tap{|e| e.tag_name.should == "h2" }. parent. tap{|e| e.tag_name.should == 'div'} end
When /用户在(.+)列表中删除(.+)指令/ do |title, command| @browser.execute_script( "window.confirm = function() {return true}" ) get_list_zone_by_title(title). span(:text, command).parent.link(:text, "删除").click end
Then /^系统显示(.+)列表$/ do |title| get_list_zone_by_title(title) end
# language: zh-CN 功能: 基本运维 系统运维的基本用例 场景: 用户通过系统进行一次运维操作的完整流程 假如创建了一个应用,名字是center 而且应用center包含机器localhost 而且基础数据已经导入 当lifu被任命为center的PE 而且lifu通过浏览器登录系统 那么首页包含center应用 而且机器列表中包含localhost 当用户开始管理我的指令 那么系统显示我的指令列表 当用户在其中执行创建 那么页面出现新增指令模板 当用户填写指令date并提交 那么列表中出现date指令 当用户在我的指令列表中删除date指令 那么列表中不出现date指令
+-------------------------+------------------+ | code to test ratio | 1:0.7 | +-------------------------+------------------+ | coverage of core model | 53% | +-------------------------+------------------+
+---------------------+--------+--------+-------+--------+ | Name | Lines | LOC | M/C | LOC/M | +---------------------+--------+--------+-------+--------+ | Controllers | 415 | 332 | 2 | 5 | | Helpers | 96 | 61 | 0 | 10 | | Models | 747 | 546 | 3 | 7 | | Libraries | 229 | 199 | 8 | 10 | | Model specs | 634 | 518 | 0 | 101 | | View specs | 6 | 3 | 0 | 0 | | Controller specs | 109 | 89 | 0 | 0 | | Helper specs | 15 | 3 | 0 | 0 | | Request specs | 11 | 9 | 0 | 0 | | Cucumber features | 310 | 162 | 0 | 25 | +---------------------+--------+--------+-------+--------+ | Total | 2572 | 1922 | 3 | 12 | +---------------------+--------+--------+-------+--------+ LOC: 1138 Test LOC: 784 Code to Test Ratio: 1:0.7
erlang
ruby/rails
/
#