SlideShare una empresa de Scribd logo
1 de 82
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

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
 

La actualidad más candente (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試食会
 

Destacado

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
 

Destacado (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
 

Similar a [ 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
 

Similar a [ 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
 

Último

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
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
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
🐬 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
 
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
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
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
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
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
 

Último (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
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
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
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...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
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
 

[ WrocLoveRb 2012] user perspective testing using ruby