Writing Software not code With. Ben Mabey

Size: px
Start display at page:

Download "Writing Software not code With. Ben Mabey"

Transcription

1 Writing Software not code With Ben Mabey

2 Writing Software not code With Ben Mabey

3 Writing Software not code With Behaviour Driven Development Ben Mabey

4 ?

5

6 Tweet in the blanks... "most software projects are like " #rubyhoedown #cucumber

7 "most software projects are like " #rubyhoedown #cucumber

8

9

10 So... why are software projects like The Homer?

11

12

13

14 Feature Devotion Placing Text emphasis on features instead of overall outcome

15

16 Shingeo Shingo of Toyota says...

17 "Inspection to find defects is waste."

18 "Inspection to find defects is waste." "Inspection to prevent defects is essential."

19 56% of all bugs are introduced in requirements. (CHAOS Report)

20 Root Cause Analysis

21 Popping the Why Stack...

22

23 Protect Revenue Increase Revenue Manage Cost

24

25 Feature: title * not executed * documentation value * variant of contextra * business value up front In order to [Business Value] As a [Role] I want to [Some Action] (feature)

26 There is no template. What is important to have in narrative: * business value * stakeholder role * user role * action to be taken by user

27 <rant>

28 Writing Software not code With Behaviour Driven Development Ben Mabey

29 != BDD

30 != BDD

31 RSpec!= BDD

32 RSpec!= BDD

33 All of these tools are great... but, in the, tools are tools. While RSpec and Cucumber are optimized for BDD, using them doesn t automatically mean you re doing BDD" The RSpec Book

34 BDD is a mindset not a tool set

35 </rant>

36 Feature: title * not executed * documentation value * variant of contextra * business value up front In order to [Business Value] As a [Role] I want to [Some Action] (feature)

37 Scenario: title Given [Context] When I do [Action] Then I should see [Outcome]

38 Scenario: title Given [Context] And [More Context] When I do [Action] And [Other Action] Then I should see [Outcome] But I should not see [Outcome]

39 project_root/ `-- features

40 project_root/ `-- features -- awesomeness.feature -- greatest_ever.feature

41 project_root/ `-- features -- awesomeness.feature -- greatest_ever.feature `-- support -- env.rb `-- other_helpers.rb

42 project_root/ `-- features -- awesomeness.feature -- greatest_ever.feature `-- support -- env.rb `-- other_helpers.rb -- step_definitions -- domain_concept_a.rb `-- domain_concept_b.rb

43 Step Given a widget

44 Step Definition Given a widget Given /^a widget$/ do #codes go here

45 Step Definition Step Mother Given a widget Given /^a widget$/ do #codes go here

46 Step Definition Step Mother Given a widget Given /^a widget$/ do #codes go here

47

48

49

50 28+ Languages

51 28+ Languages

52 28+ Languages RSpec, Test::Unit, etc

53 28+ Languages Your Code RSpec, Test::Unit, etc

54 Not Just for Rails

55 Outside-In

56

57

58 Write Scenarios

59 Steps are ping

60 Write Step Definition

61 Go Down A Gear

62 RSpec, TestUnit, etc

63 Write Code Example (Unit Test)

64 Make Example Pass

65 REFACTOR!!

66 Where Are we?

67 Continue until...

68 REFACTOR and REPEAT

69 features/manage_my_wishes.feature Feature: manage my wishes In order to get more stuff As a greedy person I want to manage my wish list for my family members to Scenario: add Scenario: remove Scenario: tweet wish

70 features/manage_my_wishes.feature Feature: manage my wishes In order to get more stuff Work In Progress As a greedy person I want to manage my wish list for my family members to Scenario: add wish Given I am logged in When I make a "New car" wish Then "New car" should appear on my wish Scenario: remove Scenario: tweet wish

71 Workflow

72 Workflow git branch -b add_wish_tracker#

73 Workflow git branch -b add_wish_tracker# Tag Scenario or Feature

74 Workflow git branch -b add_wish_tracker# Tag Scenario or Feature cucumber --wip

75 Workflow git branch -b add_wish_tracker# Tag Scenario or Feature cucumber --wip Develop it Outside-In

76 Workflow git branch -b add_wish_tracker# Tag Scenario or Feature cucumber --wip Develop it Outside-In git rebase ---interactive; git merge

77 Workflow git branch -b add_wish_tracker# Tag Scenario or Feature cucumber --wip Develop it Outside-In git rebase ---interactive; git merge Repeat!

78 @wip on master?

79 @wip on master? $ rake -T cucumber

80 @wip on master? $ rake -T cucumber rake cucumber:ok OR rake cucumber

81 @wip on master? $ rake -T cucumber rake cucumber:ok OR rake cucumber cucumber --tags ~@wip --strict

82 @wip on master? $ rake -T cucumber Tag Exclusion rake cucumber:ok OR rake cucumber cucumber --tags ~@wip --strict

83 @wip on master? $ rake -T cucumber

84 @wip on master? $ rake -T cucumber rake cucumber:wip

85 @wip on master? $ rake -T cucumber rake cucumber:wip cucumber --wip

86 @wip on master? $ rake -T cucumber rake cucumber:wip Limit tags in flow cucumber --wip

87 @wip on master? $ rake -T cucumber rake cucumber:wip Limit tags in flow cucumber --wip Expect failure - Success == Failure

88 @wip on master? $ rake -T cucumber rake cucumber:all Runs both ok and wip -- great for CI

89 features/manage_my_wishes.feature Feature: manage my wishes In order to get more stuff As a greedy person I want to manage my wish list for my family members to Scenario: add wish Given I am logged in When I make a "New car" wish Then "New car" should appear on my wish Scenario: remove Scenario: tweet wish

90

91 Line # of scenario

92

93 Look Ma! backtraces! Given I am logged in #features/manage_my_wishes.feature:8

94

95

96 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true)

97 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) Test Data Builder / Object Mother

98 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) Fixture Replacement, Fixjour, Factory Girl, etc spec/fixjour_builders.rb Fixjour do define_builder(user) do klass, overrides klass.new( : => "user#{counter(:user)}@ .com", :password => 'password', :password_confirmation => 'password' )

99 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true)

100 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button

101 features/step_definitions/user_steps.rb Webrat / Awesomeness Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button

102 features/step_definitions/user_steps.rb Webrat / Awesomeness Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button

103 features/step_definitions/user_steps.rb Webrat / Awesomeness Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button features/support/env.rb require 'webrat' Webrat.configure do config config.mode = :rails

104 features/step_definitions/user_steps.rb Webrat / Awesomeness Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button features/support/env.rb require 'webrat' Webrat.configure do config config.mode = :rails Adapter

105 features/step_definitions/user_steps.rb Webrat / Awesomeness Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button features/step_definitions/webrat_steps.rb When /^I press "(.*)"$/ do button click_button(button) When /^I follow "(.*)"$/ do link click_link(link) 20+ Steps Out-of-box When /^I fill in "(.*)" with "(.*)"$/ do field, value fill_in(field, :with => value)

106 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button

107 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button # make sure we have actually logged in- so we fail fast if not session[:user_id].should

108 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button # make sure we have actually logged in- so we fail fast if not session[:user_id].should controller.current_user.should

109 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path Specify fill_in " ", outcome, :with not implementation. fill_in "Password", :with => valid_user_attributes["password"] click_button # make sure we have actually logged in- so we fail fast if not session[:user_id].should controller.current_user.should response.should contain("signed in successfully")

110 features/step_definitions/user_steps.rb Given /^I am logged in$/ = create_user(: _confirmed => true) visit new_session_path fill_in " ", :with fill_in "Password", :with => valid_user_attributes["password"] click_button # make sure we have actually logged in- so we fail fast if not response.should contain("signed in successfully")

111

112 No route matches /sessions/create with {:method=>:post} (ActionController::RoutingError)

113 I m going to cheat...

114 I m going to cheat... $ gem install thoughtbot-clearance $./script generate clearance $./script generate clearance_features

115 Authlogic?

116

117 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish Then /^(.+) should appear on my wish list$/ do wish

118 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish Then /^(.+) should appear on my wish list$/ do wish Regexp Capture -> Yielded Variable

119 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button Then /^(.+) should appear on my wish list$/ do wish

120 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button Then /^(.+) should appear on my wish list$/ do wish response.should contain("your wish has been added!") response.should contain(wish)

121 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button No route matches /wishes with {:method=>:get} (ActionController::RoutingError) Then /^(.+) should appear on my wish list$/ do wish response.should contain("your wish has been added!") response.should contain(wish)

122 config/routes.rb ActionController::Routing::Routes.draw do map map.resources :wishes

123 config/routes.rb ActionController::Routing::Routes.draw do map map.resources :wishes When I make a New car wish uninitialized constant WishesController (NameError)

124 config/routes.rb ActionController::Routing::Routes.draw do map map.resources :wishes $./script generate rspec_controller new create

125 config/routes.rb ActionController::Routing::Routes.draw do map map.resources :wishes When I make a New car wish Could not find link with text or title or id Make a wish (Webrat::NotFoundError)

126 app/views/wishes/index.html.erb <%= link_to "Make a wish", new_wish_path %>

127 app/views/wishes/index.html.erb <%= link_to "Make a wish", new_wish_path %> When I make a New car wish Could not find field: Wish (Webrat::NotFoundError)

128 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button

129 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button app/views/wishes/new.html.erb <% form_for :wish do f %> <%= f.label :name, "Wish" %> <%= f.text_field :name %> <%= submit_tag "Make the wish!" %> <% %>

130 features/step_definitions/wish_steps.rb When /^I make a "(.+)" wish$/ do wish visit "/wishes" click_link "Make a wish" fill_in "Wish", :with => wish click_button app/views/wishes/new.html.erb <% form_for :wish do f %> <%= f.label :name, "Wish" %> <%= f.text_field :name %> <%= submit_tag "Make the wish!" %> <% %> Location Strategy FTW!

131 View Controller

132 spec/controllers/wishes_controller_spec.rb describe WishesController do describe "POST / (#create)" do

133 spec/controllers/wishes_controller_spec.rb describe WishesController do describe "POST / (#create)" do it "creates a new wish for the user with the params" do user = mock_model(user, :wishes => mock("wishes association")) controller.stub!(:current_user).and_return(user) user.wishes.should_receive(:create).with(wish_params) post :create, 'wish' => {'name' => 'Dog'}

134 app/controllers/wishes_controller.rb class WishesController < ApplicationController def create current_user.wishes.create(params['wish'])

135 spec/controllers/wishes_controller_spec.rb describe WishesController do describe "POST / (#create)" do before(:each) do... it "redirects the user to their wish list" do do_post response.should redirect_to(wishes_path)

136 app/controllers/wishes_controller.rb def create current_user.wishes.create(params['wish']) redirect_to :action => :index

137 View Controller Model

138 app/controllers/wishes_controller.rb def create current_user.wishes.create(params['wish']) redirect_to :action => :index When I make a New car wish undefined method `wishes` for #<User:0x268e898> (NoMethodError)

139 app/controllers/wishes_controller.rb def create current_user.wishes.create(params['wish']) redirect_to :action => :index $./script generate rspec_model wish name:string user_id:integer

140 app/models/wish.rb class Wish < ActiveRecord::Base belongs_to :user app/models/user.rb class User < ActiveRecord::Base include Clearance::App::Models::User has_many :wishes

141 app/models/wish.rb class Wish < ActiveRecord::Base belongs_to :user app/models/user.rb When I make a New car wish Then New car should appear on my wish expected the following element s content to include Your wish has been added! class User < ActiveRecord::Base include Clearance::App::Models::User has_many :wishes

142 spec/controllers/wishes_controller_spec.rb it "notifies the user of creation via the flash" do do_post flash[:success].should == "Your wish has been added!"

143 spec/controllers/wishes_controller_spec.rb it "notifies the user of creation via the flash" do do_post flash[:success].should == "Your wish has been added!" app/controllers/wishes_controller.rb def create current_user.wishes.create(params['wish']) flash[:success] = "Your wish has been added!" redirect_to :action => :index

144 spec/controllers/wishes_controller_spec.rb it "should notifies the user of creation via the flash" do do_post flash[:success].should == "Your wish has been added!" app/controllers/wishes_controller.rb Then New car should appear on my wish expected the following element s content to include New car def create current_user.wishes.create(params['wish']) flash[:success] = "Your wish has been added!" redirect_to :action => :index

145 app/views/wishes/index.html.erb <ul> do wish %> <li><%= wish.name %></li> <% %> </ul>

146 spec/controllers/wishes_controller_spec.rb describe "GET / (#index)" do def do_get get :index it "assigns the user's wishes to the view" do do_get assigns[:wishes].should

147 app/controllers/wishes_controller.rb def = current_user.wishes

148

149 How do I test JS and AJAX? FAQ

150

151 Slow Fast

152 Slow Integrated Fast Isolated

153 Slow Integrated Fast Isolated

154 Slow Integrated Fast Isolated

155 Slow Integrated Fast Isolated

156 Slow Integrated Fast Isolated

157 Slow Fast

158 Slow Fast Joyful

159 Slow Painful Fast Joyful

160 Slow Painful Celerity Fast Joyful

161 Celerity

162 Celerity HtmlUnit

163 Celerity HtmlUnit

164 Celerity HtmlUnit

165 Celerity HtmlUnit

166 require "rubygems" require "celerity" browser = Celerity::Browser.new browser.goto(' browser.text_field(:name, 'q').value = 'Celerity' browser.button(:name, 'btng').click puts "yay" if browser.text.include? 'celerity.rubyforge.org'

167 What if I use MRI?

168 Culerity

169 require "rubygems" require "culerity" culerity_server = Culerity::run_server browser = Culerity::RemoteBrowserProxy.new(culerity_server) browser.goto(' browser.text_field(:name, 'q').value = 'Celerity' browser.button(:name, 'btng').click puts "yay" if browser.text.include? 'celerity.rubyforge.org'

170 Celerity +

171 HtmlUnit +

172 CodeNote

173 Feature: CLI Server In order to save me time and headaches As a presenter of code I create a presentation in plaintext a'la Slidedown (from Pat Nakajima) and have CodeNote serve it up for me For example of how to test CLI tools take a look at CodeNote on github. RSpec and Cucumber also have good examples of how to do this. Scenario: basic presentation loading and viewing Given that the codenote server is not running And a file named "presentation.md" with: """!TITLE My Presentation!PRESENTER Ben Mabey # This is the title slide!slide # This is second slide... """ When I run "codenote_load presentation.md" And I run "codenote" And I visit the servers address

174 Feature: Twitter Quiz In order to encourage audience participation where 90% of the audience is hacking on laptops As a presenter I want audience members To answer certain questions via twitter

175 Feature: Twitter Quiz In order to encourage audience participation where 90% of the audience is hacking on laptops As a presenter I want audience members To answer certain questions via Scenario: waiting for an Scenario: winner is Scenario: fail Scenario: network timeout

176 Feature: Twitter Quiz In order to encourage audience participation where 90% of the audience is hacking on laptops As a presenter I want audience members To answer certain questions via Scenario: waiting for an answer

177 @wip Scenario: waiting for an answer Given the following presentation """!TITLE American History!PRESENTER David McCullough # Wanna win a prize? ### You'll have to answer a question... ### in a tweet! First correct tweet wins!!slide # Who shot Alexander Hamilton? ## You must use #free_stuff in your tweet.!dynamic-slide TwitterQuiz '#free_stuff "aaron burr"'!slide Okay, that was fun. Lets actually start now. """

178 @wip Scenario: waiting for an answer Given the following presentation """!TITLE American History!PRESENTER David McCullough # Wanna win a prize? ### You'll have to answer a question... ### in a tweet! First correct tweet wins!!slide # Who shot Alexander Hamilton? ## You must use #free_stuff in your tweet.!dynamic-slide TwitterQuiz '#free_stuff "aaron burr"'!slide Okay, that was fun. Lets actually start now. """

179 @wip Scenario: waiting for an answer Given the following presentation... And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search When the presenter goes to the 3rd slide And I go to the 3rd slide Then I should see "And the winner is..." And I should see an ajax spinner

180 Given the following presentation """ blah, blah """ Given /the following presentation$/ do presentation

181 Given the following presentation """ blah, blah """ Given /the following presentation$/ do presentation Yields the multi-line string

182 Given the following presentation """ blah, blah """ Given /the following presentation$/ do presentation CodeNote::PresentationLoader.setup(presentation)

183 RSpec Cycle

184 And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search

185 How do I test web services? FAQ

186

187 page = `curl -is FakeWeb.register_uri(:get, " :response => page) Net::HTTP.get(URI.parse(" # => Full response, including headers

188 And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search Given %r{no tweets have been tweeted that match the '([']*)' search$} do query

189 And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query))

190 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query))

191 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) Helpers

192 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) Helpers def search_url_for(query) " def canned_response_for(query)... return file_path

193 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) def search_url_for(query) " def canned_response_for(query)... return file_path

194 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) def search_url_for(query) " def canned_response_for(query)... return file_path

195 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) Every time you monkeypatch def search_url_for(query) Object, a kitten dies. " def canned_response_for(query)... return file_path

196 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) module TwitterHelpers def search_url_for(query) " def canned_response_for(query)... return file_path

197 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) module TwitterHelpers def search_url_for(query) " def canned_response_for(query)... return file_path World(TwitterHelpers)

198 Given %r{no tweets have been tweeted that match the '([']*)' search$} do query FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) module TwitterHelpers def search_url_for(query) " def canned_response_for(query)... return file_path World(TwitterHelpers)

199 When the presenter goes to the 3rd slide

200 When the presenter goes to the 3rd slide When /the presenter goes to the (\d+)(?:st nd rd th) slide$/ do slide_number presenter_browser.goto path('/') (slide_number.to_i - 1).times do presenter_browser.link(:text, "Next").click

201 When the presenter goes to the 3rd slide When /the presenter goes to the (\d+)(?:st nd rd th) slide$/ do slide_number presenter_browser.goto path('/') (slide_number.to_i - 1).times do presenter_browser.link(:text, "Next").click Presenter has own browser, multiple sessions!

202 And I go to the 3rd slide Then I should see "And the winner is..."

203 And I go to the 3rd slide Then I should see "And the winner is..." When /I go to the (\d+)(?:st nd rd th) slide$/ do slide_number browser.goto path("/slides/#{slide_number}")

204 And I go to the 3rd slide Then I should see "And the winner is..." When /I go to the (\d+)(?:st nd rd th) slide$/ do slide_number browser.goto path("/slides/#{slide_number}") Then /I should see "(["]*)"$/ do text browser.should contain(text)

205 And I should see an ajax spinner

206 And I should see an ajax spinner Then /I should see an ajax spinner$/ do browser.image(:id, 'spinner').exists?.should be_true

207 Brief RSpec cycle?

208 Scenario: waiting for an answer Given the following presentation... And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search When the presenter goes to the 3rd slide And I go to the 3rd slide Then I should see "And the winner is..." And I should see an ajax spinner

209 Feature: Twitter Quiz In order to encourage audience participation where 90% of the audience is hacking on laptops As a presenter I want audience members To answer certain questions via twitter Scenario: waiting for an Scenario: winner is displayed

210 @wip Scenario: winner is displayed Given the following presentation... And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search

211 @wip Scenario: winner is displayed Given the following presentation... And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search Duplication of context!

212 Feature: Twitter Quiz... Background: A presentation with a Twitter Quiz Given the following presentation """ blah, blah """ And no tweets have been tweeted that match the '#free_stuff "aaron burr"' search Scenario: waiting for an answer When the presenter goes to the 3rd slide And I go to the 3rd slide Then I should see "And the winner is..." And I should see an ajax Scenario: winner is displayed Extract to Background

213 @wip Scenario: winner is displayed When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago And the presenter goes to the 3rd slide And I go to the 3rd slide Then I should tweet along with his avatar

214 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago

215 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table

216 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table Cucumber::AST::Table

217 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query))

218 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) Umm... that won t work.

219 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table FakeWeb.register_uri(:get, search_url_for(query), :body => canned_response_for(query)) What I would really like is a test data builder/factory for twitter searches...

220 require 'faketwitter' FakeTwitter.register_search("#cheese", {:results => [{:text => "#cheese is good"}]}) require 'twitter_search' TwitterSearch::Client.new('').query('#cheese') is 21 Aug @profile_image_url=" s3.amazonaws.com/twitter_production/profile_images/1/ photo.jpg">]

221 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table FakeTwitter.register_search(query, { :results => tweet_table.hashes})

222 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table FakeTwitter.register_search(query, { :results => tweet_table.hashes}) Our headers and columns aren t compatible with API.

223 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table tweet_table.map_headers! do header header.downcase.gsub(' ','_') FakeTwitter.register_search(query, { :results => tweet_table.hashes})

224 When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago When %r{the following tweets are tweeted that match the '([']*)' search$} do query, tweet_table tweet_table.map_headers! do header header.downcase.gsub(' ','_') tweet_table.map_column!('created_at') do relative_time interpret_time(relative_time) FakeTwitter.register_search(query, { :results => tweet_table.hashes})

225 @wip Scenario: winner is displayed When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago And the presenter goes to the 3rd slide And I go to the 3rd slide Then I should tweet along with his avatar

226 Then %r{i should tweet along with (?:his her) avatar$} do user tweet = FakeTwitter.tweets_from(user).first browser.should contain(tweet['text'], :wait => 10) browser.should have_image(:src, tweet['profile_image_url']) Timeout

227 Then %r{i should tweet along with (?:his her) avatar$} do user tweet = FakeTwitter.tweets_from(user).first browser.should contain(tweet['text'], :wait => 10) browser.should have_image(:src, tweet['profile_image_url']) Spec::Matchers.define :contain do text, options match do browser options[:wait] = 0 browser.wait_until(options[:wait]) do browser.text.include?(text)

228 Then %r{i should tweet along with (?:his her) avatar$} do user tweet = FakeTwitter.tweets_from(user).first browser.should contain(tweet['text'], :wait => 10) browser.should have_image(:src, tweet['profile_image_url']) Spec::Matchers.define :contain do text, options match do browser options[:wait] = 0 browser.wait_until(options[:wait]) do browser.text.include?(text) Keep trying after sleeping until it times out

229 RSpec Cycle

230 Scenario: winner is displayed When the following tweets are tweeted that match the '#free_stuff "aaron burr"' search From User Text Created Aaron Burr shot Alexander Hamilton #free_stuff 1 minute Aaron Burr shot Alexander Hamilton #free_stuff 2 minutes ago And the presenter goes to the 3rd slide And I go to the 3rd slide Then I should tweet along with his avatar

231 Demo!

232 More tricks...

233

234 Scenario: view members list Given the following wishes exist Wish Family Member Laptop Thomas Ninto Wii Candace CHEEZBURGER FuzzBuzz When I view the wish list for "Candace" Then I should see the following wishes Wish Ninto Wii

235 Given the following wishes exist Wish Family Member Laptop Thomas Ninto Wii Candace CHEEZBURGER FuzzBuzz features/step_definitions/wish_steps.rb Given /^the following wishes exist$/ do table

236 Given the following wishes exist Wish Family Member Laptop Thomas Ninto Wii Candace CHEEZBURGER FuzzBuzz features/step_definitions/wish_steps.rb Given /^the following wishes exist$/ do table table.hashes.each do row member = User.find_by_name(row["Family Member"]) create_user(:name => row["family Member"]) member.wishes.create!(:name => row["wish"])

237 Table Diffing

238 Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Scenarios: input_1 input_2 button output add add add 40

239 Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Scenarios: addition input_1 input_2 button output add add 7 Scenarios: subtraction 0 40 minus -40

240 Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Scenarios: input_1 input_2 button output add add add 40

241 Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Scenarios: input_1 input_2 button output add add add 40

242 Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Scenarios: input_1 input_2 button output add add add 40

243 Steps Within Steps When /^I view the wish list for "(.+)"$/ do user_name Given "I am logged in" visit "/wishes/#{user_name}"

244 Steps Within Steps When /^I view the wish list for "(.+)"$/ do user_name Given "I am logged in" visit "/wishes/#{user_name}"

245 Hooks Before do After do scenario World do World(MyModule) World(HerModule)

246 Tagged Hooks = Feature: Lorem Scenario: Ipsum Scenario: Dolor Feature: Scenario: Amet Scenario: Consec

247 Spork Sick of slow loading times? Spork will load your main environment once. It then runs a DRB server so cucumber (or RSpec) can run against it with the --drb flag. For each test run Spork forks a child process to run them in a clean memory state. So.. it is a DRb server that forks.. hence Spork. :)

248 Drinking the Cucumber Kool-Aid?

249 Integration tests are a scam J. B. Rainsberger Obviously, I don t agree with this 100%. But he has some valid points. Integrations tests are not a replacement for good unit tests. Use cucumber for happy paths. Use lower level tests for design and to isolate object behavior.

250 Cucumber is a good hammer

251 Cucumber is a good hammer Not everything is a nail

252 I can skp teh unit testz?

253 Acceptance Tests Application Level For Customers Slow Good confidence Prevent against regression Unit Tests Object Level- Isolated! For developers FAST! (should be at least) - Tighter Feedback Loop More about design!!!!!!!!!!!! Will need both gears! Some things are easier to test at the application level and vice-versa.

254 SRSLY? Model specs, Controller Specs, and view specs!?

255

256

257

258 W

259 M

260 More tests == More Maintenance

261 Test Value = Design + Documentation + Defence (regression)

262 if test.value > test.cost Suite.add(test)

263 KTHXBYE! BenMabey.com github.com/bmabey Twitter: bmabey IRC: mabes

Most of the security testers I know do not have

Most of the security testers I know do not have Most of the security testers I know do not have a strong background in software development. Yes, they maybe know how to hack java, reverse-engineer binaries and bypass protection. These skills are often

More information

Cucumber and Capybara

Cucumber and Capybara Cucumber and Capybara A commons case study old vs new old new testingframework test-unit v1 cucumber browser-driver pure selenium v1 capybara vs Plain text scenarios with features Step definitions shamelessly

More information

Installing Ruby on Windows XP

Installing Ruby on Windows XP Table of Contents 1 Installation...2 1.1 Installing Ruby... 2 1.1.1 Downloading...2 1.1.2 Installing Ruby...2 1.1.3 Testing Ruby Installation...6 1.2 Installing Ruby DevKit... 7 1.3 Installing Ruby Gems...

More information

Testing Rails. by Josh Steiner. thoughtbot

Testing Rails. by Josh Steiner. thoughtbot Testing Rails by Josh Steiner thoughtbot Testing Rails Josh Steiner April 10, 2015 Contents thoughtbot Books iii Contact us................................ iii Introduction 1 Why test?.................................

More information

Deep in the CRUD LEVEL 1

Deep in the CRUD LEVEL 1 Deep in the CRUD LEVEL 1 Prerequisites: TryRuby.org TwitteR for ZOMBIES {tweets Columns (we have 3) DB TABLE Rows { (we have 4) id status zombie Zombie Challenge #1 Retrieve the Tweet object with id =

More information

Rails 4 Quickly. Bala Paranj. www.rubyplus.com

Rails 4 Quickly. Bala Paranj. www.rubyplus.com Rails 4 Quickly Bala Paranj 1 About the Author Bala Paranj has a Master s degree in Electrical Engineering from The Wichita State University. He has over 15 years of experience in the software industry.

More information

RESTful Rails Development. translated by Florian Görsdorf and Ed Ruder

RESTful Rails Development. translated by Florian Görsdorf and Ed Ruder RESTful Rails Development Ralf Wirdemann [email protected] Thomas Baustert [email protected] translated by Florian Görsdorf and Ed Ruder March 26, 2007 Acknowledgments Many thanks go

More information

The Cucumber Book. Extracted from: Behaviour-Driven Development for Testers and Developers. The Pragmatic Bookshelf

The Cucumber Book. Extracted from: Behaviour-Driven Development for Testers and Developers. The Pragmatic Bookshelf Extracted from: The Cucumber Book Behaviour-Driven Development for Testers and Developers This PDF file contains pages extracted from The Cucumber Book, published by the Pragmatic Bookshelf. For more information

More information

Hudson Continous Integration Server. Stefan Saasen, [email protected]

Hudson Continous Integration Server. Stefan Saasen, stefan@coravy.com Hudson Continous Integration Server Stefan Saasen, [email protected] Continous Integration Software development practice Members of a team integrate their work frequently Each integration is verified by

More information

SAHARA FASHION15 RESPONSIVE MAGENTO THEME

SAHARA FASHION15 RESPONSIVE MAGENTO THEME SAHARA FASHION15 RESPONSIVE MAGENTO THEME This document is organized as follows: Chater I. Install ma_sahara_fashion15 template Chapter II. Features and elements of the template Chapter III. List of extensions

More information

Cucumber: Finishing the Example. CSCI 5828: Foundations of Software Engineering Lecture 23 04/09/2012

Cucumber: Finishing the Example. CSCI 5828: Foundations of Software Engineering Lecture 23 04/09/2012 Cucumber: Finishing the Example CSCI 5828: Foundations of Software Engineering Lecture 23 04/09/2012 1 Goals Review the contents of Chapters 9 and 10 of the Cucumber textbook Testing Asynchronous Systems

More information

TESTING FRAMEWORKS. Gayatri Ghanakota

TESTING FRAMEWORKS. Gayatri Ghanakota TESTING FRAMEWORKS Gayatri Ghanakota OUTLINE Introduction to Software Test Automation. What is Test Automation. Where does Test Automation fit in the software life cycle. Why do we need test automation.

More information

Comparing Dynamic and Static Language Approaches to Web Frameworks

Comparing Dynamic and Static Language Approaches to Web Frameworks Comparing Dynamic and Static Language Approaches to Web Frameworks Neil Brown School of Computing University of Kent UK 30 April 2012 2012-05-01 Comparing Dynamic and Static Language Approaches to Web

More information

Version Control! Scenarios, Working with Git!

Version Control! Scenarios, Working with Git! Version Control! Scenarios, Working with Git!! Scenario 1! You finished the assignment at home! VC 2 Scenario 1b! You finished the assignment at home! You get to York to submit and realize you did not

More information

Fermilab Service Desk

Fermilab Service Desk Fermilab Service Desk Incident Management Recording new Incident work instructions Software tools: Remedy 7.1x OVERVIEW Incident recording: As the starting point for the Incident Management process; accurately

More information

QUICK START GUIDE. Cloud based Web Load, Stress and Functional Testing

QUICK START GUIDE. Cloud based Web Load, Stress and Functional Testing QUICK START GUIDE Cloud based Web Load, Stress and Functional Testing Performance testing for the Web is vital for ensuring commercial success. JAR:Load is a Web Load Testing Solution delivered from the

More information

Improving your Drupal Development workflow with Continuous Integration

Improving your Drupal Development workflow with Continuous Integration Improving your Drupal Development workflow with Continuous Integration Peter Drake Sahana Murthy DREAM IT. DRUPAL IT. 1 Meet Us!!!! Peter Drake Cloud Software Engineer @Acquia Drupal Developer & sometimes

More information

Cloudwords Drupal Module. Quick Start Guide

Cloudwords Drupal Module. Quick Start Guide Cloudwords Drupal Module Quick Start Guide 1 Contents INTRO... 3 HOW IT WORKS... 3 BEFORE YOU INSTALL... 4 In Cloudwords... 4 In Drupal... 4 INSTALLING THE CLOUDWORDS DRUPAL MODULE... 5 OPTION ONE: Install

More information

Achieving Continuous Integration with Drupal

Achieving Continuous Integration with Drupal 23 Au gu Achieving Continuous Integration with Drupal st 20 12 Achieving Continuous Integration with Drupal Drupalcon Munich 2012 Barry Jaspan [email protected] The Evolution of a Drupal Developer

More information

How to Make a Working Contact Form for your Website in Dreamweaver CS3

How to Make a Working Contact Form for your Website in Dreamweaver CS3 How to Make a Working Contact Form for your Website in Dreamweaver CS3 Killer Contact Forms Dreamweaver Spot With this E-Book you will be armed with everything you need to get a Contact Form up and running

More information

5 Mistakes to Avoid on Your Drupal Website

5 Mistakes to Avoid on Your Drupal Website 5 Mistakes to Avoid on Your Drupal Website Table of Contents Introduction.... 3 Architecture: Content.... 4 Architecture: Display... 5 Architecture: Site or Functionality.... 6 Security.... 8 Performance...

More information

Note: With v3.2, the DocuSign Fetch application was renamed DocuSign Retrieve.

Note: With v3.2, the DocuSign Fetch application was renamed DocuSign Retrieve. Quick Start Guide DocuSign Retrieve 3.2.2 Published April 2015 Overview DocuSign Retrieve is a windows-based tool that "retrieves" envelopes, documents, and data from DocuSign for use in external systems.

More information

EPiServer Operator's Guide

EPiServer Operator's Guide EPiServer Operator's Guide Abstract This document is mainly intended for administrators and developers that operate EPiServer or want to learn more about EPiServer's operating environment. The document

More information

Guide to Automating Workflows Quickly and Easily

Guide to Automating Workflows Quickly and Easily Guide to Automating Workflows Quickly and Easily Part 3 Back to Contents 1 2012 Nintex USA LLC, All rights reserved. Errors and omissions excepted. Table of Contents Introduction... 3 Handling the Full

More information

Brakeman and Jenkins: The Duo Detects Defects in Ruby on Rails Code

Brakeman and Jenkins: The Duo Detects Defects in Ruby on Rails Code Brakeman and Jenkins: The Duo Detects Defects in Ruby on Rails Code Justin Collins Tin Zaw AppSec USA September 23, 2011 About Us Justin Collins - @presidentbeef Tin Zaw - @tzaw Our Philosophy: Light Touch

More information

Ruby On Rails. CSCI 5449 Submitted by: Bhaskar Vaish

Ruby On Rails. CSCI 5449 Submitted by: Bhaskar Vaish Ruby On Rails CSCI 5449 Submitted by: Bhaskar Vaish What is Ruby on Rails? Ruby on Rails is a web application framework written in Ruby, a dynamic programming language. Ruby on Rails uses the Model-View-Controller

More information

Intellect Platform - The Workflow Engine Basic HelpDesk Troubleticket System - A102

Intellect Platform - The Workflow Engine Basic HelpDesk Troubleticket System - A102 Intellect Platform - The Workflow Engine Basic HelpDesk Troubleticket System - A102 Interneer, Inc. Updated on 2/22/2012 Created by Erika Keresztyen Fahey 2 Workflow - A102 - Basic HelpDesk Ticketing System

More information

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is Chris Panayiotou Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is the current buzz in the web development

More information

SAHARA DIGITAL8 RESPONSIVE MAGENTO THEME

SAHARA DIGITAL8 RESPONSIVE MAGENTO THEME SAHARA DIGITAL8 RESPONSIVE MAGENTO THEME This document is organized as follows: Chater I. Install ma_sahara_digital8 template Chapter II. Features and elements of the template Chapter III. List of extensions

More information

Translation Proxy A New Option for Managing Multilingual Websites

Translation Proxy A New Option for Managing Multilingual Websites A New Option for Managing Multilingual Websites Introduction 3 Why Multilingual Site Management is So Painful 4 : A New Option 8 : How it Works 9 Proxy in Action Summary FAQ 10 13 14 Who is Lionbridge

More information

email-lead Grabber Business 2010 User Guide

email-lead Grabber Business 2010 User Guide email-lead Grabber Business 2010 User Guide Copyright and Trademark Information in this documentation is subject to change without notice. The software described in this manual is furnished under a license

More information

Missouri Department of Health and Senior Services Bureau of Immunization Assessment and Assurance February 2013

Missouri Department of Health and Senior Services Bureau of Immunization Assessment and Assurance February 2013 1 SMV Help Desk: 877.813.0933 / [email protected] Missouri Department of Health and Senior Services Bureau of Immunization Assessment and Assurance February 2013 Accessing ShowMeVax website

More information

Marketo Integration Setup Guide

Marketo Integration Setup Guide Page 1 of 30 Table of Contents About the RingLead Integration with Marketo Create the Marketo Webhook - Response Mapping - Configure Webhook Response Mapping Create the Marketo Program and Campaign - Create

More information

PHP on IBM i: What s New with Zend Server 5 for IBM i

PHP on IBM i: What s New with Zend Server 5 for IBM i PHP on IBM i: What s New with Zend Server 5 for IBM i Mike Pavlak Solutions Consultant [email protected] (815) 722 3454 Function Junction Audience Used PHP in Zend Core/Platform New to Zend PHP Looking to

More information

Web Framework Performance Examples from Django and Rails

Web Framework Performance Examples from Django and Rails Web Framework Performance Examples from Django and Rails QConSF 9th November 2012 www.flickr.com/photos/mugley/5013931959/ Me Gareth Rushgrove Curate devopsweekly.com Blog at morethanseven.net Text Work

More information

Digitally Sign an InfoPath form and Submit using Email

Digitally Sign an InfoPath form and Submit using Email Digitally Sign an InfoPath form and Submit using Email In this video, I am going to show how you can take a Form such as the Form that I am looking at right now, the Resource Provisioning Form, Turn on

More information

School account creation guide

School account creation guide School account creation guide Contents Your welcome email Page 2 The CSV file Page 3 Uploading the CSV and creating the accounts Page 5 Retrieving staff usernames and passwords Page 8 Retrieving student

More information

CS169.1x Lecture 5: SaaS Architecture and Introduction to Rails " Fall 2012"

CS169.1x Lecture 5: SaaS Architecture and Introduction to Rails  Fall 2012 CS169.1x Lecture 5: SaaS Architecture and Introduction to Rails " Fall 2012" 1" Web at 100,000 feet" The web is a client/server architecture" It is fundamentally request/reply oriented" Web browser Internet

More information

Git Branching for Continuous Delivery

Git Branching for Continuous Delivery Git Branching for Continuous Delivery Sarah Goff-Dupont Automation Enthusiast Hello everyone I ll be talking about how teams at Atlassian use Git branches for continuous delivery. My name is Sarah, and

More information

Adobe Summit 2015 Lab 718: Managing Mobile Apps: A PhoneGap Enterprise Introduction for Marketers

Adobe Summit 2015 Lab 718: Managing Mobile Apps: A PhoneGap Enterprise Introduction for Marketers Adobe Summit 2015 Lab 718: Managing Mobile Apps: A PhoneGap Enterprise Introduction for Marketers 1 INTRODUCTION GOAL OBJECTIVES MODULE 1 AEM & PHONEGAP ENTERPRISE INTRODUCTION LESSON 1- AEM BASICS OVERVIEW

More information

Continuous Delivery on AWS. Version 1.0 DO NOT DISTRIBUTE

Continuous Delivery on AWS. Version 1.0 DO NOT DISTRIBUTE Continuous Version 1.0 Copyright 2013, 2014 Amazon Web Services, Inc. and its affiliates. All rights reserved. This work may not be reproduced or redistributed, in whole or in part, without prior written

More information

Kentico CMS 7.0 Intranet Administrator's Guide

Kentico CMS 7.0 Intranet Administrator's Guide Kentico CMS 7.0 Intranet Administrator's Guide 2 Kentico CMS 7.0 Intranet Administrator's Guide Table of Contents Introduction 5... 5 About this guide Getting started 7... 7 Installation... 11 Accessing

More information

Kentico Content Management System (CMS) Managing Events and News Content

Kentico Content Management System (CMS) Managing Events and News Content Kentico Content Management System (CMS) Managing Events and News Content I. Introduction The Kentico CMS uses a new process to enter news and events, which will allow visitors to the Website to easily

More information

MAS 90 MAS 200 Tips, Tricks and Frequently Asked Questions (FAQ s) Prepared by: The Fitzgerald Group August 11, 2004

MAS 90 MAS 200 Tips, Tricks and Frequently Asked Questions (FAQ s) Prepared by: The Fitzgerald Group August 11, 2004 MAS 90 MAS 200 Tips, Tricks and Frequently Asked Questions (FAQ s) Prepared by: The Fitzgerald Group August 11, 2004 This is a compilation of ideas from The Fitzgerald Group staff, from clients and from

More information

Set internet safety parental controls with Windows

Set internet safety parental controls with Windows How to Microsoft lets parents set up internet safety settings on a Windows computer for their kids, using Family Safety. Family Safety provides a website and a free program that you install on the computers

More information

How To Write A Book Purchase On An Ipad With A Bookshop On A Pcode On A Linux 2.5.2 (Windows) On A Macbook 2.2.2 On A Microsoft Powerbook 2 (Windows 2.

How To Write A Book Purchase On An Ipad With A Bookshop On A Pcode On A Linux 2.5.2 (Windows) On A Macbook 2.2.2 On A Microsoft Powerbook 2 (Windows 2. 4. Getting started with Cucumber Our first Cucumber project We are finally ready to add Cucumber to our testing toolbox. The downloaded source has a project we will start with. The project is in the learn_cucumber

More information

Eliminate Workflow Friction with Git

Eliminate Workflow Friction with Git Eliminate Workflow Friction with Git Joel Clermont @jclermont I come from the distant land of Milwaukee. Organizer of Milwaukee PHP and Milwaukee FP. Feel free to reach out to me on Twitter. World s problems

More information

Prestashop Ship2MyId Module. Configuration Process

Prestashop Ship2MyId Module. Configuration Process Prestashop Ship2MyId Module Configuration Process Ship2MyID Module Version : v1.0.2 Compatibility : PrestaShop v1.5.5.0 - v1.6.0.14 1 P a g e Table of Contents 1. Module Download & Setup on Store... 4

More information

Developer Workshop 2015. Marc Dumontier McMaster/OSCAR-EMR

Developer Workshop 2015. Marc Dumontier McMaster/OSCAR-EMR Developer Workshop 2015 Marc Dumontier McMaster/OSCAR-EMR Agenda Code Submission 101 Infrastructure Tools Developing OSCAR Code Submission: Process OSCAR EMR Sourceforge http://www.sourceforge.net/projects/oscarmcmaster

More information

Evaluation. Chapter 1: An Overview Of Ruby Rails. Copy. 6) Static Pages Within a Rails Application... 1-10

Evaluation. Chapter 1: An Overview Of Ruby Rails. Copy. 6) Static Pages Within a Rails Application... 1-10 Chapter 1: An Overview Of Ruby Rails 1) What is Ruby on Rails?... 1-2 2) Overview of Rails Components... 1-3 3) Installing Rails... 1-5 4) A Simple Rails Application... 1-6 5) Starting the Rails Server...

More information

Advanced Tornado TWENTYONE. 21.1 Advanced Tornado. 21.2 Accessing MySQL from Python LAB

Advanced Tornado TWENTYONE. 21.1 Advanced Tornado. 21.2 Accessing MySQL from Python LAB 21.1 Advanced Tornado Advanced Tornado One of the main reasons we might want to use a web framework like Tornado is that they hide a lot of the boilerplate stuff that we don t really care about, like escaping

More information

Continuous Integration

Continuous Integration CODING & DEVELOPMENT BORIS GORDON FEBRUARY 7 2013 Continuous Integration Introduction About me boztek on d.o. (http://drupal.org/user/134410) @boztek [email protected] 2 Introduction About you

More information

Building Dynamic Web 2.0 Websites with Ruby on Rails

Building Dynamic Web 2.0 Websites with Ruby on Rails Building Dynamic Web 2.0 Websites with Ruby on Rails Create database-driven dynamic websites with this open-source web application framework A.P. Rajshekhar Chapter 5 "Gathering User Comments" In this

More information

Magic SDE Self-Service

Magic SDE Self-Service Magic SDE Self-Service Agency Security Administrators (ASA) Workflow Administrators (WFA) Employee Data Administrators (EDA) Credit Card Administrators (CCA) User Support Liaisons (USL) at Type A Agencies

More information

ManageMyHealth SMS Text Message Service User Guide. Medtech32. Version 20.0 (March 2012)

ManageMyHealth SMS Text Message Service User Guide. Medtech32. Version 20.0 (March 2012) ManageMyHealth SMS Text Message Service User Guide Medtech32 Version 20.0 (March 2012) IMPORTANT NOTE Medtech recommends that all Medtech upgrades and database back-up and restore processes are performed

More information

by Jonathan Kohl and Paul Rogers 40 BETTER SOFTWARE APRIL 2005 www.stickyminds.com

by Jonathan Kohl and Paul Rogers 40 BETTER SOFTWARE APRIL 2005 www.stickyminds.com Test automation of Web applications can be done more effectively by accessing the plumbing within the user interface. Here is a detailed walk-through of Watir, a tool many are using to check the pipes.

More information

Software Development Tools

Software Development Tools Software Development Tools COMP220/COMP285 Sebastian Coope More on Automated Testing and Continuous Integration These slides are mainly based on Java Tools for Extreme Programming R.Hightower & N.Lesiecki.

More information

PHP Authentication Schemes

PHP Authentication Schemes 7 PHP Authentication Schemes IN THIS CHAPTER Overview Generating Passwords Authenticating User Against Text Files Authenticating Users by IP Address Authenticating Users Using HTTP Authentication Authenticating

More information

In depth study - Dev teams tooling

In depth study - Dev teams tooling In depth study - Dev teams tooling Max Åberg mat09mab@ Jacob Burenstam Linder ada09jbu@ Desired feedback Structure of paper Problem description Inconsistencies git story explanation 1 Introduction Hypotheses

More information

GETTING STARTED WITH CONTINUOUS DELIVERY. Lana Kalashnyk @lana_vk wcgp.co

GETTING STARTED WITH CONTINUOUS DELIVERY. Lana Kalashnyk @lana_vk wcgp.co GETTING STARTED WITH CONTINUOUS DELIVERY Lana Kalashnyk @lana_vk wcgp.co ABOUT ME Lana Kalashnyk BAAS Computer Science minor Business Administration AS in Computer Science emphasis on Networking Cisco

More information

Drupal CMS for marketing sites

Drupal CMS for marketing sites Drupal CMS for marketing sites Intro Sample sites: End to End flow Folder Structure Project setup Content Folder Data Store (Drupal CMS) Importing/Exporting Content Database Migrations Backend Config Unit

More information

HELP DESK MANUAL INSTALLATION GUIDE

HELP DESK MANUAL INSTALLATION GUIDE Help Desk 6.5 Manual Installation Guide HELP DESK MANUAL INSTALLATION GUIDE Version 6.5 MS SQL (SQL Server), My SQL, and MS Access Help Desk 6.5 Page 1 Valid as of: 1/15/2008 Help Desk 6.5 Manual Installation

More information

Continuous Integration

Continuous Integration Continuous Integration WITH FITNESSE AND SELENIUM By Brian Kitchener [email protected] Intro Who am I? Overview Continuous Integration The Tools Selenium Overview Fitnesse Overview Data Dependence My

More information

TestTrack Test Case Management Quick Start Guide

TestTrack Test Case Management Quick Start Guide TestTrack Test Case Management Quick Start Guide This guide is provided to help you get started with TestTrack test case management and answer common questions about working with test cases and test runs.

More information

TweetAttacks Pro. User Manual

TweetAttacks Pro. User Manual TweetAttacks Pro User Manual The ultimate twitter auto follower, auto unfollower, tweet scraper, reply generator, auto retweeter, tweet spinner, mass retweeter and tweet scheduler with socialoomph integration.

More information

Continuous Performance Testing

Continuous Performance Testing Continuous Performance Testing Confoo.ca Kore Nordmann (@koredn) 27. Feb 2013 Continuous Performance Testing 1 / 30 About me Degree in computer sience Professional PHP since 2000 Open source enthusiast

More information

Would You Like To Earn $1000 s With The Click Of A Button?

Would You Like To Earn $1000 s With The Click Of A Button? Would You Like To Earn $1000 s With The Click Of A Button? (Follow these easy step by step instructions and you will) This Version of the ebook is for all countries other than the USA. If you need the

More information

10 kanban boards and their context

10 kanban boards and their context 10 kanban boards and their context Hi! I ve visualized a set of kanban boards from operations, development and sales to trigger ideas. But don t forget, a kanban board is a tool to help you think for yourself,

More information

CommonSpot Content Server Version 6.2 Release Notes

CommonSpot Content Server Version 6.2 Release Notes CommonSpot Content Server Version 6.2 Release Notes Copyright 1998-2011 PaperThin, Inc. All rights reserved. About this Document CommonSpot version 6.2 updates the recent 6.1 release with: Enhancements

More information

Part I. OpenCIT Server

Part I. OpenCIT Server OpenCIT Manual 12 Table of Contents I. OpenCIT Server... 1 1. How to read the Manual... 2 2. What is the Open Continuous Integration And Test Server... 3 II. Using the OpenCIT Server... 4 3. Quickstart...

More information

Magento Theme EM0006 for Computer store

Magento Theme EM0006 for Computer store Magento Theme EM0006 for Computer store Table of contends Table of contends Introduction Features General Features Flexible layouts Main Menu Standard Blocks Category Menu and Category Layered Menu. HTML

More information

Managing User Accounts

Managing User Accounts Managing User Accounts This chapter includes the following sections: Configuring Local Users, page 1 Active Directory, page 2 Viewing User Sessions, page 6 Configuring Local Users Before You Begin You

More information

Migration Manager v6. User Guide. Version 1.0.5.0

Migration Manager v6. User Guide. Version 1.0.5.0 Migration Manager v6 User Guide Version 1.0.5.0 Revision 1. February 2013 Content Introduction... 3 Requirements... 3 Installation and license... 4 Basic Imports... 4 Workspace... 4 1. Menu... 4 2. Explorer...

More information

Agile Web Application Testing

Agile Web Application Testing Agile Web Application Testing Technologies and Solutions V. Narayan Raman Tyto Software Goals Rapid feedback on the quality of software Problem in Web App Testing Many Browsers Many Operating Systems Browsers

More information

Apollo ACC PCI Registry Export Basics

Apollo ACC PCI Registry Export Basics Training Apollo ACC PCI Registry Export Basics Barbara O Brien Product Education Trainer Registry Export Assistance Clinical Content Contact the Registry Software Questions LUMEDX Support 1.800.966.0669

More information

Cloud Elements! Marketing Hub Provisioning and Usage Guide!

Cloud Elements! Marketing Hub Provisioning and Usage Guide! Cloud Elements Marketing Hub Provisioning and Usage Guide API Version 2.0 Page 1 Introduction The Cloud Elements Marketing Hub is the first API that unifies marketing automation across the industry s leading

More information

Testing Best Practices

Testing Best Practices ALMComplete, QAComplete, DevComplete This document is used as a guide to improving your testing and quality assurance processes. 1 Test Case Creation Once requirements have been created and approved, while

More information

Installing and Sending with DocuSign for NetSuite v2.2

Installing and Sending with DocuSign for NetSuite v2.2 DocuSign Quick Start Guide Installing and Sending with DocuSign for NetSuite v2.2 This guide provides information on installing and sending documents for signature with DocuSign for NetSuite. It also includes

More information

Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle. Kuassi Mensah Group Product Manager

Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle. Kuassi Mensah Group Product Manager Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle Kuassi Mensah Group Product Manager The following is intended to outline our general product direction. It

More information

Legacy Automated Testing Bridge QAComplete ALMComplete HP Quick Test Pro v. 10-11

Legacy Automated Testing Bridge QAComplete ALMComplete HP Quick Test Pro v. 10-11 User s Guide Legacy QAComplete ALMComplete HP Quick Test Pro v. 10-11 This document explains how to use the Legacy Automation Bridge for HP Quick Test Professional versions 10-11 Please note: this feature

More information

DreamFactory & Modus Create Case Study

DreamFactory & Modus Create Case Study DreamFactory & Modus Create Case Study By Michael Schwartz Modus Create April 1, 2013 Introduction DreamFactory partnered with Modus Create to port and enhance an existing address book application created

More information

Build it with Drupal 8

Build it with Drupal 8 Build it with Drupal 8 Comprehensive guide for building common websites in Drupal 8. No programming knowledge required! Antonio Torres This book is for sale at http://leanpub.com/drupal-8-book This version

More information

Primavera Unifier v9.14 / 2014 EPPM Day Hands On Session Exercise Document

Primavera Unifier v9.14 / 2014 EPPM Day Hands On Session Exercise Document Primavera Unifier v9.14 / 2014 EPPM Day Hands On Session Exercise Document This exercise document is a basic Unifier intro. document, for those people, who would like to gain the first impression around

More information

Modern CI/CD and Asset Serving

Modern CI/CD and Asset Serving Modern CI/CD and Asset Serving Mike North 10/20/2015 About.me Job.new = CTO Job.old = UI Architect for Yahoo Ads & Data Organizer, Modern Web UI Ember.js, Ember-cli, Ember-data contributor OSS Enthusiast

More information

Everyday Lessons from Rakudo Architecture. Jonathan Worthington

Everyday Lessons from Rakudo Architecture. Jonathan Worthington Everyday Lessons from Rakudo Architecture Jonathan Worthington What do I do? I teach our advanced C#, Git and software architecture courses Sometimes a mentor at various companies in Sweden Core developer

More information

Installation & User Guide

Installation & User Guide SharePoint List Filter Plus Web Part Installation & User Guide Copyright 2005-2009 KWizCom Corporation. All rights reserved. Company Headquarters P.O. Box #38514 North York, Ontario M2K 2Y5 Canada E-mail:

More information

BDD FOR AUTOMATING WEB APPLICATION TESTING. Stephen de Vries

BDD FOR AUTOMATING WEB APPLICATION TESTING. Stephen de Vries BDD FOR AUTOMATING WEB APPLICATION TESTING Stephen de Vries www.continuumsecurity.net INTRODUCTION Security Testing of web applications, both in the form of automated scanning and manual security assessment

More information

ThirtySix Software WRITE ONCE. APPROVE ONCE. USE EVERYWHERE. www.thirtysix.net SMARTDOCS 2014.1 SHAREPOINT CONFIGURATION GUIDE THIRTYSIX SOFTWARE

ThirtySix Software WRITE ONCE. APPROVE ONCE. USE EVERYWHERE. www.thirtysix.net SMARTDOCS 2014.1 SHAREPOINT CONFIGURATION GUIDE THIRTYSIX SOFTWARE ThirtySix Software WRITE ONCE. APPROVE ONCE. USE EVERYWHERE. www.thirtysix.net SMARTDOCS 2014.1 SHAREPOINT CONFIGURATION GUIDE THIRTYSIX SOFTWARE UPDATED MAY 2014 Table of Contents Table of Contents...

More information

Qlik REST Connector Installation and User Guide

Qlik REST Connector Installation and User Guide Qlik REST Connector Installation and User Guide Qlik REST Connector Version 1.0 Newton, Massachusetts, November 2015 Authored by QlikTech International AB Copyright QlikTech International AB 2015, All

More information

Managing User Accounts

Managing User Accounts Managing User Accounts This chapter includes the following sections: Active Directory, page 1 Configuring Local Users, page 3 Viewing User Sessions, page 5 Active Directory Active Directory is a technology

More information

Title Page. Informed Filler. User s Manual. Shana Corporation 9744-45 Avenue Edmonton, Alberta, Canada T6E 5C5

Title Page. Informed Filler. User s Manual. Shana Corporation 9744-45 Avenue Edmonton, Alberta, Canada T6E 5C5 Title Page Informed Filler User s Manual Shana Corporation 9744-45 Avenue Edmonton, Alberta, Canada T6E 5C5 Telephone: (780) 433-3690 Order Desk: (800) 386-7244 Fax: (780) 437-4381 E-mail: [email protected]

More information