SlideShare ist ein Scribd-Unternehmen logo
1 von 82
Downloaden Sie, um offline zu lesen
User perspective
testing using Ruby

      Michał Czyż
        @cs3b
selleo.com
http://webout.eu
User perspective
testing using Ruby
https://twitter.com/#!/moonmaster9000/status/169540724474384384
https://twitter.com/#!/athoshun/statuses/165138347432488962
https://twitter.com/#!/defkode/status/124066265642967040
http://www.jackkinsella.ie/2011/09/26/why-bother-with-cucumber-testing.html
http://blog.jonasbandi.net/2010/09/acceptance-vs-integration-tests.html
KAMELEON




http://www.funnypictures24.com/funny2/funnyphotoshopped166.jpg
fill_in & within



page.fill_in 'Login', :with =>
                            'me@in.com'

page.within('body') do ... end
click
click 'Administrations',
      'Products',
click :and_dismiss => 'Delete'
click :and_accept => 'Delete'

click :image => 'OK'

click :element => "#some_div"
fill_in
fill_in 'www.selleo.com' => 'Link'

fill_in 'www.selleo.com' => 'Link'
        'Selleo' => 'Company',
        'Poland' => 'Country'
fill_in :check => 'Remember me'

fill_in :check => [ 'Red',
                    'Green',
                    'Grey' ]
fill_in :uncheck => 'Remember me'

fill_in :uncheck => [ 'Red',
                      'Green',
                      'Grey' ]
fill_in :choose => 'Female'

fill_in :choose => [ 'Europe',
                     'Poland' ]
fill_in :select => { 'Poland' =>
                     'Countries' }

fill_in :select => { 'Poland' =>
                     'Countries',

                    'Silesia' =>
                    'Provinces' }
fill_in :unselect => { 'Poland' =>
                       'Countries' }

fill_in :unselect => { 'Poland' =>
                       'Countries',

                      'Silesia' =>
                      'Provinces' }
fill_in :attach => { 'me.png' =>
                     'Avatar'}

fill_in :attach => { 'me.png' =>
                     'Avatar',
                     'selleo.png' =>
                     'Company Logo' }
# spec_helper.rb
Kameleon.configure do |c|
 c.assets_dir = '(...)/fixtures/assets'
end
see
see 'www.selleo.com',

see 'one',
    'another piece of text',
    'and another one'
see :link => 'Wrocloverb'

see :link => { 'Wrocloverb' =>
               'http://wrocloverb.com' }

see :links => { 'Wrocloverb' =>
                'http://wrocloverb.com',
                'Selleo' =>
                'http://www.selleo.com' }
see :image => 'OK'

see :image => 'icon_ok.png'

see :images => [ 'completed',
                 'approved' ]
see 'Ruby' => 'First Name'

see 'Wisła' => 'City',
    'Silesia' => 'Province'
see :field => 'Email'

see :fields => ['Email',
                'City',
                'Street' ]
see :empty => 'Last Name'

see :empty => [ 'Last Name',
                'City' ]
see :checked => 'Remember me'

see :checked => [ 'Newsletter',
                  'Remember me' ]
see :unchecked => 'Remember me'

see :unchecked => [ 'Newsletter',
                    'Remember me' ]
see :selected => { 'Poland' =>
                   'Countries' }

see :selected => { 'Poland' =>
                   'Countries',

                   'Silesia' =>
                   'Provinces' }
see :selected => { [ 'Red',
                     'Green',
                     'Orange' ] =>
                   'Colors' }
see :unselected => { 'Poland' =>
                     'Countries' }

see :unselected => { 'Poland' =>
                     'Countries',

                     'Silesia' =>
                     'Provinces' }
see :unselected => { [ 'Red',
                       'Green',
                       'Orange' ] =>
                     'Colors' }
see :ordered => [ 'Bart',
                  'Tom',
                  'Anette' ]
see 5 => ".element"

see 3 => :menu_item

see 5 => [:xpath,
          '//div[@class="element"]' ]
not_see
not_see 'php'

not_see 'java',
        'c#',
        '.net'
not_see :field => 'Email'

not_see :fields => [ 'Email',
                     'City',
                     'Street' ]
not_see :link => 'Wrocloverb'

not_see :link => { 'Wrocloverb' =>
             'http://wrocloverb.com' }

not_see :links => [ 'Wrocloverb',
                    'Selleo' ]
not_see :image => 'OK'

not_see :image => 'ok.png'

not_see :images => [ 'OK',
                     'rails.png' ]
act_as
visit('/')

act_as(:default) do
  click 'Products'
end
visit('/')

create_session(:user)
visit('/login')

act_as(:default) do
  not_see :field => 'Email'
end

act_as(:user)
see :fields => [ 'Email', 'Password' ]
http://s1.desktopia.net/wp-content/uploads/walls/thumbs/Funny-Chameleon-575x359.jpg
click_link "Products"
within('table.index tr:nth-child(2)') {
   page.should have_content("apache baseball
   cap") }
within('table.index tr:nth-child(3)') {
   page.should have_content("zomg shirt") }

click_link "admin_products_listing_name_title"
within('table.index tr:nth-child(2)') {
   page.should have_content("zomg shirt") }
within('table.index tr:nth-child(3)') {
   page.should have_content("apache baseball
   cap") }
https://github.com/spree/spree/blob/master/core/spec/requests/admin/products/products_spec.rb#L22
click "Products"
within('table.index) do
   see :ordered => [ "apache baseball cap",
                      "zomg shirt" ]
end

click "admin_products_listing_name_title"
within('table.index') do
   see :ordered => [ "zomg shirt",
                      "apache baseball cap"]
end
click_link "Products"
click_link "admin_new_product"

fill_in "product_name", :with => "Baseball Cap"
fill_in "product_sku", :with => "B100"
fill_in "product_price", :with => "100"
fill_in "product_available_on", :with =>
                                 "2012/01/24"
select "Size", :from => "Prototype"
check "Large"
click_button "Create"
page.should have_content("successfully
created!")
https://github.com/spree/spree/blob/master/core/spec/requests/admin/products/products_spec.rb#L77
click "Products",
      "admin_new_product"

fill_in "Baseball Cap" => "product_name",
        "B100" => "product_sku",
        "100" => "product_price",
        "2012/01/24" => "product_available_on",
        :select => {
                      "Size" => "Prototype"
                   },
        :check => "Large"
click "Create"
see "successfully created!"
within(:css, 'table.index tr:nth-child(2)') {
                           click_link "Edit" }

fill_in "adjustment_amount", :with => "99"
fill_in "adjustment_label", :with => "rebate 99"
click_button "Continue"
page.should have_content("successfully
                              updated!")
page.should have_content("rebate 99")
page.should have_content("$99.00")




https://github.com/spree/spree/blob/master/core/spec/requests/admin/orders/adjustments_spec.rb#L48
within(:row => 2) { click "Edit" }

fill_in 99 => "adjustment_amount",
          "rebate 99" => "adjustment_label"
click "Continue"
see "successfully updated!",
       "rebate 99",
       "$99.00"
click_link "Orders"
within('table#listing_orders tbody tr:nth-child
(1)') { click_link "R100" }

click_link "Payments"
within('#payment_status') { page.should
have_content("Payment: balance due") }

find('table.index tbody tr:nth-child(2)
   td:nth-child(2)').text.should == "$39.98"
find('table.index tbody tr:nth-child(2)
   td:nth-child(3)').text.should == "Credit Card"
find('table.index tbody tr:nth-child(2)
   td:nth-child(4)').text.should == "pending"
https://github.com/spree/spree/blob/master/core/spec/requests/admin/orders/payments_spec.rb#L32
click "Orders"
within('table#listing_orders', :row => 1) do
   click_link "R100"
end

click "Payments"
within('#payment_status') do
   see("Payment: balance due")
end

within(:cell =>[2,2]) { see "$39.98" }
within(:cell =>[2,3]) { see "Credit Card" }
within(:cell =>[2,4]) { see "pending" }
DEMO
 inspired by a case taken
from a production system
create_session(:user)
sign_in_as(:user)

create_session(:admin)
sign_in_as(:admin)
act_as(:user) do
 not_see 'IS OPEN',
           'IS CLOSED'
 within(:right_column) do
   not_see 'Submit a proposal',
              'Submit'
 end
end
act_as(:admin) do
 within(:menu) { click 'Set Contest' }
 fill_in 'S vs C' => 'Name',
         '2012-01-19 08:00:00' => 'starts at',
         '2012-01-20 08:00:00' => 'ends at'
 click 'Create Contest'
 see 'Contest was successfully created'
end
Timecop.travel(2012, 1, 19, 8, 59, 55) do
 act_as(:user) do
  refresh_page
  see 'IS CLOSED'
  sleep 10
  not_see 'IS CLOSED'
  see 'IS OPEN'
 end
end
Timecop.travel(2012, 1, 19, 9, 1, 1) do
 act_as(:user) do
  refresh_page
  %w(ruby ... haml).each do |content|
     fill_in content => 'proposal_content'
     click 'Submit'
  end
 end
act_as(:admin) do
 click 'Sticker proposals',
  'Load more'
  %w(ruby ... html).each do |c|
     within(:proposal_with_content => c) do
     click 'favorite'
   end
 end
end
act_as(:user) do
 refresh_page
 %w(...).each_with_index do |c, r|
   within(:proposal_with_content => c) do
     click "Rate #{r+1} out of 5"
   end
 end
end
act_as(:user) do
 %w(ruby coffescript).each do |c|
  within(:proposal_with_content => c) do
    click 'Comment'
    fill_in "sample text #{c}" => 'body'
    click 'Create comment'
  end
 end
end
Timecop.travel(2012, 1, 20, 11, 10, 10) do
 act_as(:admin) do
  refresh_page
  click 'Load more'
  %w(html python).each do |c|
    within(:proposal_with_content => c) do
      click 'choose'
   end
  end
 end
act_as(:user) do
 refresh_page
 click 'Gallery'
 within(:ordered_list) do
  see *(%w(html python))
  not_see *(%w(ruby ... coffescript))
 end
end
act_as(:admin) do
 click 'Gallery', 'Add new production picture'
 fill_in 'Sample title for picture' => 'Title',
         :attach => {'pict.jpg' => 'Image'}
 click 'Create Gallery image'
end
act_as(:user) do
 click 'Gallery'
 fill_in :select => {'S vs C' => 'contest_id'}
 within(:gallery_list) do
   see :image => 'Thumb_pict'
 end
end
act_as(:admin) do
 click 'Add new contest sticker'
 fill_in 'Sample title for picture' => 'Title',
          :attach => {'pict2.jpg' => 'Image'}
 click 'Create Gallery image'
end
act_as(:user) do
 click 'Gallery'
 fill_in :select => {'S vs C' => 'contest_id'}
 within(:gallery_list) do
   see :image => 'Thumb_pict2'
 end
end
http://2.bp.blogspot.com/_bVtGlUaW-tA/TMOUvmYXzHI/AAAAAAAAP90/SR5yHHWydN4/s1600/Mech_chameleon_by_tommaso_sanguigni.jpg
# gemfile
gem 'kameleon', '>= 0.2.0.alpha.2'
gem 'headless'

# spec_helper.rb
require 'kameleon'
require 'kameleon/ext/rspec/all'
# or
require 'kameleon/ext/rspec/dsl'

# optional
# .../rspec/garbage_collector'
# .../rspec/headless'
SHARED DB CONNECTION




example: lib/kameleon/ext/active_record/

●   shared_single_connection.rb

●   shared_single_connection_with_spork.rb
HEADLESS


RSpec.configure do |config|
 config.before(:suite) do
   @headless = Headless.new(:display => '100')
   @headless.start
 end

 config.after(:suite) do
   @headless.stop if defined?(@headless)
 end
end

require 'kameleon/ext/rspec/headless'
RIPL



   config.after(:each) do
     if exception = example.instance_variable_get(:@exception)


     Ripl.start :binding => binding
     end
   end




example: lib/kameleon/utils/debug_console.rb
LINKS
RSPEC
 ● http://pragprog.com/book/achbd/the-rspec-book
 ● https://www.relishapp.com/rspec
CAPYBARA
 ● https://github.com/jnicklas/capybara
XPATH
 ● http://www.w3.org/TR/xpath/
 ● https://addons.mozilla.org/en-US/firefox/addon/firepath/
SELENIUM
 ● http://seleniumhq.org/docs/
WEBKIT
 ● https://github.com/thoughtbot/capybara-webkit
KAMELEON

●   https://github.com/cs3b/kame   leon
THANKS :-)




questions ?
  http://selleo.com/people/michal-czyz


  http://cs3b.com

Weitere ähnliche Inhalte

Was ist angesagt?

When solid met angular components
When solid met angular componentsWhen solid met angular components
When solid met angular componentsShiri Haim
 
Creating web api and consuming part 2
Creating web api and consuming part 2Creating web api and consuming part 2
Creating web api and consuming part 2Dipendra Shekhawat
 
Polymer - pleasant client-side programming with web components
Polymer - pleasant client-side programming with web componentsPolymer - pleasant client-side programming with web components
Polymer - pleasant client-side programming with web componentspsstoev
 
Basic articles of incorporation template free basic articles of incorporatio...
Basic articles of incorporation template  free basic articles of incorporatio...Basic articles of incorporation template  free basic articles of incorporatio...
Basic articles of incorporation template free basic articles of incorporatio...Lloyd Peace
 
Play, Slick, play2-authの間で討死
Play, Slick, play2-authの間で討死Play, Slick, play2-authの間で討死
Play, Slick, play2-authの間で討死Kiwamu Okabe
 
Componentization css angular
Componentization css angularComponentization css angular
Componentization css angularDavid Amend
 
Embracing Capybara
Embracing CapybaraEmbracing Capybara
Embracing CapybaraTim Moore
 
Action View Form Helpers - 2, Season 2
Action View Form Helpers - 2, Season 2Action View Form Helpers - 2, Season 2
Action View Form Helpers - 2, Season 2RORLAB
 
Functional testing with capybara
Functional testing with capybaraFunctional testing with capybara
Functional testing with capybarakoffeinfrei
 
Open Selector
Open SelectorOpen Selector
Open Selectorjjdelc
 
Improving state of M2 front-end - Magento 2 Community Project
Improving state of M2 front-end - Magento 2 Community ProjectImproving state of M2 front-end - Magento 2 Community Project
Improving state of M2 front-end - Magento 2 Community ProjectBartek Igielski
 
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tleFuture Processing
 
Anko試食会
Anko試食会Anko試食会
Anko試食会susan335
 

Was ist angesagt? (20)

Symfony2. Form and Validation
Symfony2. Form and ValidationSymfony2. Form and Validation
Symfony2. Form and Validation
 
When solid met angular components
When solid met angular componentsWhen solid met angular components
When solid met angular components
 
1cst
1cst1cst
1cst
 
Creating web api and consuming part 2
Creating web api and consuming part 2Creating web api and consuming part 2
Creating web api and consuming part 2
 
Polymer - pleasant client-side programming with web components
Polymer - pleasant client-side programming with web componentsPolymer - pleasant client-side programming with web components
Polymer - pleasant client-side programming with web components
 
Convidar para page !!
Convidar para page !!Convidar para page !!
Convidar para page !!
 
Basic articles of incorporation template free basic articles of incorporatio...
Basic articles of incorporation template  free basic articles of incorporatio...Basic articles of incorporation template  free basic articles of incorporatio...
Basic articles of incorporation template free basic articles of incorporatio...
 
Unit testing UIView
Unit testing UIViewUnit testing UIView
Unit testing UIView
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
Play, Slick, play2-authの間で討死
Play, Slick, play2-authの間で討死Play, Slick, play2-authの間で討死
Play, Slick, play2-authの間で討死
 
Componentization css angular
Componentization css angularComponentization css angular
Componentization css angular
 
Quality code by design
Quality code by designQuality code by design
Quality code by design
 
Embracing Capybara
Embracing CapybaraEmbracing Capybara
Embracing Capybara
 
Action View Form Helpers - 2, Season 2
Action View Form Helpers - 2, Season 2Action View Form Helpers - 2, Season 2
Action View Form Helpers - 2, Season 2
 
Functional testing with capybara
Functional testing with capybaraFunctional testing with capybara
Functional testing with capybara
 
Error found
Error foundError found
Error found
 
Open Selector
Open SelectorOpen Selector
Open Selector
 
Improving state of M2 front-end - Magento 2 Community Project
Improving state of M2 front-end - Magento 2 Community ProjectImproving state of M2 front-end - Magento 2 Community Project
Improving state of M2 front-end - Magento 2 Community Project
 
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tle
 
Anko試食会
Anko試食会Anko試食会
Anko試食会
 

Andere mochten auch

Libraries Change Lives Award 1992-2010
Libraries Change Lives Award 1992-2010Libraries Change Lives Award 1992-2010
Libraries Change Lives Award 1992-2010EdinburghCityLibraries
 
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко Антон
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко АнтонSolit 2014, Как эффективно организовать Автоматизацию, Семенченко Антон
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко Антонsolit
 
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антон
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко АнтонSolit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антон
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антонsolit
 
Introduction to bdd
Introduction to bddIntroduction to bdd
Introduction to bddantannatna
 
From ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingFrom ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingEmanuele DelBono
 

Andere mochten auch (8)

oAuth wroclove
oAuth wrocloveoAuth wroclove
oAuth wroclove
 
Born Digital - Dan Franklin
Born Digital - Dan FranklinBorn Digital - Dan Franklin
Born Digital - Dan Franklin
 
Libraries Change Lives Award 1992-2010
Libraries Change Lives Award 1992-2010Libraries Change Lives Award 1992-2010
Libraries Change Lives Award 1992-2010
 
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко Антон
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко АнтонSolit 2014, Как эффективно организовать Автоматизацию, Семенченко Антон
Solit 2014, Как эффективно организовать Автоматизацию, Семенченко Антон
 
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антон
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко АнтонSolit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антон
Solit 2014, Agile ValueTeam, учимся понимать Scrum, Семенченко Антон
 
Introduction to bdd
Introduction to bddIntroduction to bdd
Introduction to bdd
 
From ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingFrom ActiveRecord to EventSourcing
From ActiveRecord to EventSourcing
 
Salesforce1 Platform
Salesforce1 PlatformSalesforce1 Platform
Salesforce1 Platform
 

Ähnlich wie [ WrocLoveRb 2012] user perspective testing using ruby

RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”apostlion
 
Quick ref capybara
Quick ref capybaraQuick ref capybara
Quick ref capybarafatec
 
Quick ref capybara
Quick ref capybaraQuick ref capybara
Quick ref capybarafatec
 
Worth the hype - styled components
Worth the hype - styled componentsWorth the hype - styled components
Worth the hype - styled componentskathrinholzmann
 
Rails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackRails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackDavid Copeland
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4DEVCON
 
Practical PHP by example Jan Leth-Kjaer
Practical PHP by example   Jan Leth-KjaerPractical PHP by example   Jan Leth-Kjaer
Practical PHP by example Jan Leth-KjaerCOMMON Europe
 
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史Shengyou Fan
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.jsSarah Drasner
 
Pengenalan AngularJS
Pengenalan AngularJSPengenalan AngularJS
Pengenalan AngularJSEdi Santoso
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPStephen Tallamy
 
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]Eleanor McHugh
 
TechSupportCh 21 project.doc1Projects.doc Project 21-.docx
TechSupportCh 21 project.doc1Projects.doc Project 21-.docxTechSupportCh 21 project.doc1Projects.doc Project 21-.docx
TechSupportCh 21 project.doc1Projects.doc Project 21-.docxmattinsonjanel
 

Ähnlich wie [ WrocLoveRb 2012] user perspective testing using ruby (20)

Mojolicious
MojoliciousMojolicious
Mojolicious
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
 
Quick ref capybara
Quick ref capybaraQuick ref capybara
Quick ref capybara
 
Quick ref capybara
Quick ref capybaraQuick ref capybara
Quick ref capybara
 
Zero to SOLID
Zero to SOLIDZero to SOLID
Zero to SOLID
 
Worth the hype - styled components
Worth the hype - styled componentsWorth the hype - styled components
Worth the hype - styled components
 
Capstone Website Code
Capstone Website CodeCapstone Website Code
Capstone Website Code
 
Rails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackRails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power Stack
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4
 
Practical PHP by example Jan Leth-Kjaer
Practical PHP by example   Jan Leth-KjaerPractical PHP by example   Jan Leth-Kjaer
Practical PHP by example Jan Leth-Kjaer
 
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.js
 
Pengenalan AngularJS
Pengenalan AngularJSPengenalan AngularJS
Pengenalan AngularJS
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMP
 
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
 
TechSupportCh 21 project.doc1Projects.doc Project 21-.docx
TechSupportCh 21 project.doc1Projects.doc Project 21-.docxTechSupportCh 21 project.doc1Projects.doc Project 21-.docx
TechSupportCh 21 project.doc1Projects.doc Project 21-.docx
 
PureScript & Pux
PureScript & PuxPureScript & Pux
PureScript & Pux
 
vue-reactivity.pdf
vue-reactivity.pdfvue-reactivity.pdf
vue-reactivity.pdf
 

Kürzlich hochgeladen

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 

Kürzlich hochgeladen (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

[ WrocLoveRb 2012] user perspective testing using ruby