SlideShare a Scribd company logo
Beta Program Overview Al Sargent [email_address] +1 415 730 1430 June 5, 2009
DimDim tip 06/05/09 Sauce Labs Confidential Choose  Fit Screen
The Problem Many, many functional tests… 06/05/09 Sauce Labs Confidential Hundreds of test flows Happy path Corner cases  Negative tests Before check-in, after check-in
…  and test platforms Dozens of test platforms Hundreds of test flows Happy path Corner cases  Negative tests Before check-in, after check-in 06/05/09 Sauce Labs Confidential 6, 7  (and soon 8) 9.5  (and soon 9.6) 1.0 3.0, 3.1  (and soon 4) 2, 3  (and soon 3.1) Add-ons Browser configurations Languages/locales
…  and test data 06/05/09 Sauce Labs Confidential Lots of test data Correct data, Incorrect data, Missing data, Data overflow Dozens of test platforms 6, 7  (and soon 8) 9.5  (and soon 9.6) 1.0 3.0, 3.1  (and soon 4) 2, 3  (and soon 3.1) Add-ons Browser configs Languages/locales
… run on minimal test hardware. 06/05/09 Sauce Labs Confidential Test jobs In-house test lab Minutes 10 20 30 40 50 60 70 80 90 Test results Can’t run  all scripts  + browsers Test lab rathole Too long to find and fix bugs
How many tests? Which browsers/OS combos? How much data? 06/05/09 Sauce Labs Confidential
Concurrent Test Execution 06/05/09 Sauce Labs Confidential Minutes 0 5 Test jobs 2000 nodes Test results Run  all  scripts  + browsers Find and fix bugs  fast No  configuration needed
How many test machines? How long to run today? How long, ideally? How often run today? How often, ideally? 06/05/09 Sauce Labs Confidential
User Experience 06/05/09 Sauce Labs Confidential Agile developer / tester Source control 1 Check in code & test scripts 5 Run scripts HTTP(s) 7 View results Web, RSS REST 8 Delete scripts &  results 6 Download  results REST 4 Upload scripts Sauce Labs FTP App Under Test 3 Promote new build to cloud-accessible location (Your infrastructure) Start new build Polling or trigger Build System 2 cron rake
How does this map to your workflow? Which CI or build system? Build script language? Test script language? 06/05/09 Sauce Labs Confidential
What’s in our cloud? 06/05/09 Sauce Labs Confidential Sauce Labs Scripts Selenium test scripts Written in Python, Ruby (now) Selenese, PHP, Java, C#, Perl (future) Configs Which browser, addons, & OS that a job should run on Jobs Similar to a print job waiting, running, done… Results Output of Script Stdout, stderr, and more… Users Can access certain Scripts, Configs, Jobs, and Results
What’s in our cloud? 06/05/09 Sauce Labs Confidential Sauce Labs Waiters  (small number) Listen to  API requests Dispatch Job execution to Chefs Handle other requests directly Chefs  (many, up to 2000) Selenium RC + browser Run Job and return Results
What’s  the app under test? Internet-accessible? Max # of  Selenium RCs? 06/05/09 Sauce Labs Confidential
06/05/09 Sauce Labs Confidential
require 'rubygems' require 'couchrest'   # http://github.com/jchris/couchrest # Link to user's database db = CouchRest.database("http://jdoe.saucelabs.com") # Upload a script # ----------------------------------------------------------------------- # A SauceLabs script is simply a regular ruby script wrapped in JSON response = db.save( { "Type" => "script", "Name" => "Google Search", "Language" => "ruby",  "Content" => "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }) script_id = response['id’] 06/05/09 Sauce Labs Confidential 4 Upload script
# Run a job # ------------------------------------------------------------------ # You run a job by uploading a new "job" document, linking to the # script id. # A job is instantly queued for execution upon upload. response = db.save( {  "Type" => "job", "ScriptId" => script_id, }) job_id = response['id’] 06/05/09 Sauce Labs Confidential 5 Run job
# Check job status # ---------------------------------------------------------------------------- status = db.get(job_id)['Status'] # 'status' will be one of: #  "new" #  "queued" #  "in progress" #  "complete" #  "error” # Download result # ---------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job result_id = db.get(job_id)['ResultId'] # Second, retrieve the complete result document: result = db.get(result_id) # You can now introspect the results # View standard output standard_output = result['Stdout'] # View standard error standard_error = result['Stderr’] 06/05/09 Sauce Labs Confidential 6 Download result
# Delete result # ------------------------------------------------------------------ result = db.get(result_id) db.delete(result) # Delete script # ------------------------------------------------------------------ script = db.get(script_id) db.delete(script) 06/05/09 Sauce Labs Confidential 8 Delete result and script
What we’ll do for you Provide  free  access to product Provide  coaching  on: How to integrate our service into your build scripts How to parallelize your test scripts Demonstrate  prototypes  for your feedback Notify  you of downtime and updates (planned or not) Take precautions to ensure that your information remains  secure 06/05/09 Sauce Labs Confidential
What we need from you Information about your existing testing environment Perform actual integration of Sauce Labs into your test environment Use Sauce Labs' product in your testing process Report any bugs or feature shortcomings you find Assign a primary point of contact Participate in weekly check-in calls Provide a product review (good or bad) that we may publish Speak with potential Sauce Labs investors about your experiences 06/05/09 Sauce Labs Confidential
Next steps 06/05/09 Sauce Labs Confidential
Where do we go from here? xUnit, TestNG Fit(nesse), RSpec Hudson Continuum CruiseControl TeamCity Bamboo Git(hub) Subversion Cron Eclipse Internet Explorer Firefox  Safari Chrome Opera Flash/Flex iPhone Android Selenium output Screencasts Screenshots DOMshots JavaScript state Yslow HTML errors Accessibility HTTP traffic Dtrace …  all tracked over time Python Ruby Java Perl Selenese C# PHP Selenium on Rails 06/05/09 Sauce Labs Confidential Platforms Languages Build Systems Telemetry Frameworks
# CouchDB library from http://code.google.com/p/couchdb-python/ from couchdb import Server # Link to user's database server = Server('http://sauceapp.com/') db = server['jsmith’] # Upload a script # ---------------------------------------------------------------------- # A Sauce Labs script is simply a regular python script wrapped in JSON script_id = db.create({ "Type" : "script", "Name" : "Google Search", "Language" : "python",  "Content" : "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }) 06/05/09 Sauce Labs Confidential 4 Upload script
# Run a job # ---------------------------------------------------------- # You run a job by uploading a new "job" document, linking to the script id. # A job is instantly queued for execution upon upload. job_id = db.create( {  "Type"  :"job", "ScriptId" :script_id, }) 06/05/09 Sauce Labs Confidential 5 Run job
# Check job status # -------------------------------------------------------------------------- status = db[job_id]["Status"] # 'status' will be one of: #  "new" #  "queued" #  "in progress" #  "complete" #  "error” # Download result # -------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job result_id = db[job_id]['ResultId'] # Second, retrieve the complete result document result = db[result_id] # You can now introspect the results. # View standard output standard_output = result['Stdout'] # View standard error standard_error = result['Stderr'] 06/05/09 Sauce Labs Confidential 6 Download result
# Delete result # ----------------------------------------------------------------- del db[result_id] # Delete script # ----------------------------------------------------------------- del db[script_id] 06/05/09 Sauce Labs Confidential 8 Delete result and script
# Using CouchDB library by Michael Hendricks (not in CPAN, yet!) # http://git.ndrix.com/?p=Net-CouchDB use Net::CouchDB; # Link to user's database my $server = Net::CouchDB->new('http://localhost:5984'); my $db = $server->db('perltest'); # Upload a script # -------------------------------------------------------------------------- # A Sauce Labs script is simply a regular perl script wrapped in JSON my $script = $db->insert( { Type => "script", Name => "Google Search", Langage => "perl", Content => "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }); my $script_id = $script->id; 06/05/09 Sauce Labs Confidential 4 Upload script
# Run a job # ---------------------------------------------------------- # You run a job by uploading a new "job" document, linking to # the script id. # A job is instantly queued for execution upon upload. my $job = $db->insert( { Type => "job", ScriptId => $script_id }); my $job_id = $job->id; 06/05/09 Sauce Labs Confidential 5 Run job
# Check job status # -------------------------------------------------------------------------- my $status = $db->document($job_id)->{'Status'}; # 'status' will be one of: # "new" # "queued" # "in progress" # "complete" # "error” # Download result # -------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job my $result_id = $db->document($job_id)->{'ResultId'}; # Second, retrieve the complete result document: my $result = $db->document($result_id); # You can now introspect the results. # View standard output my $standard_output = result->{'Stdout'}; # View standard error my $standard_error = result->{'Stderr'}; 06/05/09 Sauce Labs Confidential 6 Download result
# Delete result # ------------------------------------------------------------------ my $result = $db->document($result_id); $result->delete; # Delete script # ------------------------------------------------------------------ my $script = $db->document($script_id); $script->delete; 06/05/09 Sauce Labs Confidential 8 Delete result and script
Curl command: curl -X POST - u jdoe:password -d ' { "Type":"script", "Name":"Google Search",  "Language":"python",  "Content":"open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')", "CreatedBy":"jdoe", "CreatedDate":"Mon, 18 Aug 2008 14:26:10 +0000", "LastModifiedBy":"jdoe", "LastModifiedDate":"Mon, 18 Aug 2008 14:26:10 +0000" }' http://saucedb.com/jdoe/  06/05/09 Sauce Labs Confidential 4 Upload script
Curl returns: {"ok":true,"id":"4749f6c4159ae5a097e586f3e5040cbe","rev":"668367075"}  To view in browser:  (You'll probably need to provide name/password) http://jdoe.sauceapp.com/4749f6c4159ae5a097e586f3e5040cbe  06/05/09 Sauce Labs Confidential 4 Upload script
Curl command: curl -X POST -u jdoe:password -d ' { "Type":"job", "Status":"new", "ScriptId":"3ece08113906d84325f9341e794caefa", "ResultId":null, "CreatedBy":"jdoe", "CreatedDate":"Mon, 18 Aug 2008 14:54:55 +0000" }' http://saucedb.com/jdoe/ 06/05/09 Sauce Labs Confidential 5 Run job
Curl returns: {"ok":true,"id":"3c4c1f2f21ea4e346aebc244f21dde76","rev":"1359430379"}  To view in browser:  (You'll probably need to provide name/password) http://jdoe.sauceapp.com/3c4c1f2f21ea4e346aebc244f21dde76  06/05/09 Sauce Labs Confidential 5 Run job
Partnering with Sauce Labs Sauce focuses on hosted testing Looking for independent consultants, and consulting firms, who use our service during their engagements Guru pricing, training, etc. available 06/05/09 Sauce Labs Confidential
Agile is now mainstream Source: Dr. Dobb’s Journal. 5/7/08.  http://bit.ly/4EjcDH 06/05/09 Sauce Labs Confidential
Continuous Integration is now mainstream 06/05/09 Sauce Labs Confidential Source:VersionOne. 8/22/08.  http://www.versionone.com/pdf/3rdAnnualStateOfAgile_FullDataReport.pdf
Functional tests tend to run at end of day 06/05/09 Sauce Labs Confidential Source: Viewtier Systems.  http://bit.ly/2qQ5LX
Our current thinking about pricing (Subject to change) 06/05/09 Sauce Labs Confidential $ per  test minute Tests queued no later than… Five minutes Express : Relatively high per test minute 8 hours Economy :  Low amount per test minute
Express entails lower chef utilization (We’ll need beta usage to quantify) 06/05/09 Sauce Labs Confidential Express Chef # minute Economy Chef # minute script 1 script 6 script 10 script 2 script 7 script 11 script 12 script 3 script 8 script 13 script 4 script 9 script 14 script 5 10 20 30 40 50 60 1 2 3 4 5 10 20 30 40 50 60 script 1 script 2 script 3 script 4 script 5 script 6 1
Thinking about pricing the right way? How much Express would you use? How much Economy? 06/05/09 Sauce Labs Confidential

More Related Content

PPT
Top 50 Interview Questions and Answers in CakePHP
PPTX
Netflix JavaScript Talks - Scaling A/B Testing on Netflix.com with Node.js
PPTX
PHPUnit with CakePHP and Yii
PDF
2 introduction-php-mvc-cakephp-m2-installation-slides
PDF
ZLM-Cython Build you first module
PPTX
CakePHP - Admin Acl Controlled
PPTX
Laravel Unit Testing
PDF
SDPHP - Percona Toolkit (It's Basically Magic)
Top 50 Interview Questions and Answers in CakePHP
Netflix JavaScript Talks - Scaling A/B Testing on Netflix.com with Node.js
PHPUnit with CakePHP and Yii
2 introduction-php-mvc-cakephp-m2-installation-slides
ZLM-Cython Build you first module
CakePHP - Admin Acl Controlled
Laravel Unit Testing
SDPHP - Percona Toolkit (It's Basically Magic)

What's hot (20)

PPTX
Burp plugin development for java n00bs (44 con)
PPTX
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
PPT
How Danga::Socket handles asynchronous processing and how to write asynchrono...
PDF
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
PDF
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
PDF
Javascript TDD with Jasmine, Karma, and Gulp
PDF
Release with confidence
PPT
Pentesting Using Burp Suite
PDF
CakePHP: An Introduction
PDF
BSides Lisbon 2013 - All your sites belong to Burp
KEY
CakePHP - The Path to 2.0
KEY
CakePHP 2.0 - PHP Matsuri 2011
PDF
php[world] 2015 Training - Laravel from the Ground Up
KEY
CakePHP 2.0 - It'll rock your world
PPTX
RSpec and Rails
PPT
Hackingtomcat
PDF
Token Testing Slides
KEY
Dependency Management With Pinto
PDF
Frontend Performance: Beginner to Expert to Crazy Person
PPT
Perlbal Tutorial
Burp plugin development for java n00bs (44 con)
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
How Danga::Socket handles asynchronous processing and how to write asynchrono...
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Javascript TDD with Jasmine, Karma, and Gulp
Release with confidence
Pentesting Using Burp Suite
CakePHP: An Introduction
BSides Lisbon 2013 - All your sites belong to Burp
CakePHP - The Path to 2.0
CakePHP 2.0 - PHP Matsuri 2011
php[world] 2015 Training - Laravel from the Ground Up
CakePHP 2.0 - It'll rock your world
RSpec and Rails
Hackingtomcat
Token Testing Slides
Dependency Management With Pinto
Frontend Performance: Beginner to Expert to Crazy Person
Perlbal Tutorial
Ad

Similar to Sauce Labs Beta Program Overview (20)

ODP
Integration Testing in Python
PPT
An Introduction to Solr
PPT
Testing_with_TestComplete
PDF
The Present and Future of Mobile Test Automation with Appium
PDF
Web application penetration testing lab setup guide
PDF
Ansible testing
PPT
Pragmatic Parallels: Java and JavaScript
PPT
AppengineJS
PDF
Good practices for debugging Selenium and Appium tests
PDF
AWS Lambda from the trenches
PPTX
jDriver Presentation
PDF
JVM Web Frameworks Exploration
KEY
Enterprise Build And Test In The Cloud
PDF
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
PPT
Selenium
PDF
Create an architecture for web test automation
PDF
Automate across Platform, OS, Technologies with TaaS
PDF
Serverless in production, an experience report (LNUG)
ODP
Building JBoss AS 7 for Fedora
PPT
Java 6 [Mustang] - Features and Enchantments
Integration Testing in Python
An Introduction to Solr
Testing_with_TestComplete
The Present and Future of Mobile Test Automation with Appium
Web application penetration testing lab setup guide
Ansible testing
Pragmatic Parallels: Java and JavaScript
AppengineJS
Good practices for debugging Selenium and Appium tests
AWS Lambda from the trenches
jDriver Presentation
JVM Web Frameworks Exploration
Enterprise Build And Test In The Cloud
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
Selenium
Create an architecture for web test automation
Automate across Platform, OS, Technologies with TaaS
Serverless in production, an experience report (LNUG)
Building JBoss AS 7 for Fedora
Java 6 [Mustang] - Features and Enchantments
Ad

Recently uploaded (20)

PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
System and Network Administraation Chapter 3
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
medical staffing services at VALiNTRY
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
ai tools demonstartion for schools and inter college
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
CHAPTER 2 - PM Management and IT Context
PPT
Introduction Database Management System for Course Database
PDF
Designing Intelligence for the Shop Floor.pdf
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
assetexplorer- product-overview - presentation
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Odoo Companies in India – Driving Business Transformation.pdf
Computer Software and OS of computer science of grade 11.pptx
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
System and Network Administraation Chapter 3
Upgrade and Innovation Strategies for SAP ERP Customers
PTS Company Brochure 2025 (1).pdf.......
Internet Downloader Manager (IDM) Crack 6.42 Build 41
medical staffing services at VALiNTRY
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
ai tools demonstartion for schools and inter college
Adobe Illustrator 28.6 Crack My Vision of Vector Design
wealthsignaloriginal-com-DS-text-... (1).pdf
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
CHAPTER 2 - PM Management and IT Context
Introduction Database Management System for Course Database
Designing Intelligence for the Shop Floor.pdf
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
assetexplorer- product-overview - presentation
Navsoft: AI-Powered Business Solutions & Custom Software Development

Sauce Labs Beta Program Overview

  • 1. Beta Program Overview Al Sargent [email_address] +1 415 730 1430 June 5, 2009
  • 2. DimDim tip 06/05/09 Sauce Labs Confidential Choose Fit Screen
  • 3. The Problem Many, many functional tests… 06/05/09 Sauce Labs Confidential Hundreds of test flows Happy path Corner cases Negative tests Before check-in, after check-in
  • 4. … and test platforms Dozens of test platforms Hundreds of test flows Happy path Corner cases Negative tests Before check-in, after check-in 06/05/09 Sauce Labs Confidential 6, 7 (and soon 8) 9.5 (and soon 9.6) 1.0 3.0, 3.1 (and soon 4) 2, 3 (and soon 3.1) Add-ons Browser configurations Languages/locales
  • 5. … and test data 06/05/09 Sauce Labs Confidential Lots of test data Correct data, Incorrect data, Missing data, Data overflow Dozens of test platforms 6, 7 (and soon 8) 9.5 (and soon 9.6) 1.0 3.0, 3.1 (and soon 4) 2, 3 (and soon 3.1) Add-ons Browser configs Languages/locales
  • 6. … run on minimal test hardware. 06/05/09 Sauce Labs Confidential Test jobs In-house test lab Minutes 10 20 30 40 50 60 70 80 90 Test results Can’t run all scripts + browsers Test lab rathole Too long to find and fix bugs
  • 7. How many tests? Which browsers/OS combos? How much data? 06/05/09 Sauce Labs Confidential
  • 8. Concurrent Test Execution 06/05/09 Sauce Labs Confidential Minutes 0 5 Test jobs 2000 nodes Test results Run all scripts + browsers Find and fix bugs fast No configuration needed
  • 9. How many test machines? How long to run today? How long, ideally? How often run today? How often, ideally? 06/05/09 Sauce Labs Confidential
  • 10. User Experience 06/05/09 Sauce Labs Confidential Agile developer / tester Source control 1 Check in code & test scripts 5 Run scripts HTTP(s) 7 View results Web, RSS REST 8 Delete scripts & results 6 Download results REST 4 Upload scripts Sauce Labs FTP App Under Test 3 Promote new build to cloud-accessible location (Your infrastructure) Start new build Polling or trigger Build System 2 cron rake
  • 11. How does this map to your workflow? Which CI or build system? Build script language? Test script language? 06/05/09 Sauce Labs Confidential
  • 12. What’s in our cloud? 06/05/09 Sauce Labs Confidential Sauce Labs Scripts Selenium test scripts Written in Python, Ruby (now) Selenese, PHP, Java, C#, Perl (future) Configs Which browser, addons, & OS that a job should run on Jobs Similar to a print job waiting, running, done… Results Output of Script Stdout, stderr, and more… Users Can access certain Scripts, Configs, Jobs, and Results
  • 13. What’s in our cloud? 06/05/09 Sauce Labs Confidential Sauce Labs Waiters (small number) Listen to API requests Dispatch Job execution to Chefs Handle other requests directly Chefs (many, up to 2000) Selenium RC + browser Run Job and return Results
  • 14. What’s the app under test? Internet-accessible? Max # of Selenium RCs? 06/05/09 Sauce Labs Confidential
  • 15. 06/05/09 Sauce Labs Confidential
  • 16. require 'rubygems' require 'couchrest' # http://github.com/jchris/couchrest # Link to user's database db = CouchRest.database("http://jdoe.saucelabs.com") # Upload a script # ----------------------------------------------------------------------- # A SauceLabs script is simply a regular ruby script wrapped in JSON response = db.save( { "Type" => "script", "Name" => "Google Search", "Language" => "ruby", "Content" => "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }) script_id = response['id’] 06/05/09 Sauce Labs Confidential 4 Upload script
  • 17. # Run a job # ------------------------------------------------------------------ # You run a job by uploading a new "job" document, linking to the # script id. # A job is instantly queued for execution upon upload. response = db.save( { "Type" => "job", "ScriptId" => script_id, }) job_id = response['id’] 06/05/09 Sauce Labs Confidential 5 Run job
  • 18. # Check job status # ---------------------------------------------------------------------------- status = db.get(job_id)['Status'] # 'status' will be one of: # "new" # "queued" # "in progress" # "complete" # "error” # Download result # ---------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job result_id = db.get(job_id)['ResultId'] # Second, retrieve the complete result document: result = db.get(result_id) # You can now introspect the results # View standard output standard_output = result['Stdout'] # View standard error standard_error = result['Stderr’] 06/05/09 Sauce Labs Confidential 6 Download result
  • 19. # Delete result # ------------------------------------------------------------------ result = db.get(result_id) db.delete(result) # Delete script # ------------------------------------------------------------------ script = db.get(script_id) db.delete(script) 06/05/09 Sauce Labs Confidential 8 Delete result and script
  • 20. What we’ll do for you Provide free access to product Provide coaching on: How to integrate our service into your build scripts How to parallelize your test scripts Demonstrate prototypes for your feedback Notify you of downtime and updates (planned or not) Take precautions to ensure that your information remains secure 06/05/09 Sauce Labs Confidential
  • 21. What we need from you Information about your existing testing environment Perform actual integration of Sauce Labs into your test environment Use Sauce Labs' product in your testing process Report any bugs or feature shortcomings you find Assign a primary point of contact Participate in weekly check-in calls Provide a product review (good or bad) that we may publish Speak with potential Sauce Labs investors about your experiences 06/05/09 Sauce Labs Confidential
  • 22. Next steps 06/05/09 Sauce Labs Confidential
  • 23. Where do we go from here? xUnit, TestNG Fit(nesse), RSpec Hudson Continuum CruiseControl TeamCity Bamboo Git(hub) Subversion Cron Eclipse Internet Explorer Firefox Safari Chrome Opera Flash/Flex iPhone Android Selenium output Screencasts Screenshots DOMshots JavaScript state Yslow HTML errors Accessibility HTTP traffic Dtrace … all tracked over time Python Ruby Java Perl Selenese C# PHP Selenium on Rails 06/05/09 Sauce Labs Confidential Platforms Languages Build Systems Telemetry Frameworks
  • 24. # CouchDB library from http://code.google.com/p/couchdb-python/ from couchdb import Server # Link to user's database server = Server('http://sauceapp.com/') db = server['jsmith’] # Upload a script # ---------------------------------------------------------------------- # A Sauce Labs script is simply a regular python script wrapped in JSON script_id = db.create({ "Type" : "script", "Name" : "Google Search", "Language" : "python", "Content" : "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }) 06/05/09 Sauce Labs Confidential 4 Upload script
  • 25. # Run a job # ---------------------------------------------------------- # You run a job by uploading a new "job" document, linking to the script id. # A job is instantly queued for execution upon upload. job_id = db.create( { "Type" :"job", "ScriptId" :script_id, }) 06/05/09 Sauce Labs Confidential 5 Run job
  • 26. # Check job status # -------------------------------------------------------------------------- status = db[job_id]["Status"] # 'status' will be one of: # "new" # "queued" # "in progress" # "complete" # "error” # Download result # -------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job result_id = db[job_id]['ResultId'] # Second, retrieve the complete result document result = db[result_id] # You can now introspect the results. # View standard output standard_output = result['Stdout'] # View standard error standard_error = result['Stderr'] 06/05/09 Sauce Labs Confidential 6 Download result
  • 27. # Delete result # ----------------------------------------------------------------- del db[result_id] # Delete script # ----------------------------------------------------------------- del db[script_id] 06/05/09 Sauce Labs Confidential 8 Delete result and script
  • 28. # Using CouchDB library by Michael Hendricks (not in CPAN, yet!) # http://git.ndrix.com/?p=Net-CouchDB use Net::CouchDB; # Link to user's database my $server = Net::CouchDB->new('http://localhost:5984'); my $db = $server->db('perltest'); # Upload a script # -------------------------------------------------------------------------- # A Sauce Labs script is simply a regular perl script wrapped in JSON my $script = $db->insert( { Type => "script", Name => "Google Search", Langage => "perl", Content => "open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')" }); my $script_id = $script->id; 06/05/09 Sauce Labs Confidential 4 Upload script
  • 29. # Run a job # ---------------------------------------------------------- # You run a job by uploading a new "job" document, linking to # the script id. # A job is instantly queued for execution upon upload. my $job = $db->insert( { Type => "job", ScriptId => $script_id }); my $job_id = $job->id; 06/05/09 Sauce Labs Confidential 5 Run job
  • 30. # Check job status # -------------------------------------------------------------------------- my $status = $db->document($job_id)->{'Status'}; # 'status' will be one of: # "new" # "queued" # "in progress" # "complete" # "error” # Download result # -------------------------------------------------------------------------- # Once the job is complete, a "result" document is created. The "job" document # is updated with a reference to the result. # First, retrieve the ResultId from the job my $result_id = $db->document($job_id)->{'ResultId'}; # Second, retrieve the complete result document: my $result = $db->document($result_id); # You can now introspect the results. # View standard output my $standard_output = result->{'Stdout'}; # View standard error my $standard_error = result->{'Stderr'}; 06/05/09 Sauce Labs Confidential 6 Download result
  • 31. # Delete result # ------------------------------------------------------------------ my $result = $db->document($result_id); $result->delete; # Delete script # ------------------------------------------------------------------ my $script = $db->document($script_id); $script->delete; 06/05/09 Sauce Labs Confidential 8 Delete result and script
  • 32. Curl command: curl -X POST - u jdoe:password -d ' { "Type":"script", "Name":"Google Search", "Language":"python", "Content":"open ('google.com')\ntype ('q', 'selenium')\nclick'btnG')\nwaitForPageToLoad()\nverifyTextPresent('openqa.org')", "CreatedBy":"jdoe", "CreatedDate":"Mon, 18 Aug 2008 14:26:10 +0000", "LastModifiedBy":"jdoe", "LastModifiedDate":"Mon, 18 Aug 2008 14:26:10 +0000" }' http://saucedb.com/jdoe/ 06/05/09 Sauce Labs Confidential 4 Upload script
  • 33. Curl returns: {"ok":true,"id":"4749f6c4159ae5a097e586f3e5040cbe","rev":"668367075"} To view in browser: (You'll probably need to provide name/password) http://jdoe.sauceapp.com/4749f6c4159ae5a097e586f3e5040cbe 06/05/09 Sauce Labs Confidential 4 Upload script
  • 34. Curl command: curl -X POST -u jdoe:password -d ' { "Type":"job", "Status":"new", "ScriptId":"3ece08113906d84325f9341e794caefa", "ResultId":null, "CreatedBy":"jdoe", "CreatedDate":"Mon, 18 Aug 2008 14:54:55 +0000" }' http://saucedb.com/jdoe/ 06/05/09 Sauce Labs Confidential 5 Run job
  • 35. Curl returns: {"ok":true,"id":"3c4c1f2f21ea4e346aebc244f21dde76","rev":"1359430379"} To view in browser: (You'll probably need to provide name/password) http://jdoe.sauceapp.com/3c4c1f2f21ea4e346aebc244f21dde76 06/05/09 Sauce Labs Confidential 5 Run job
  • 36. Partnering with Sauce Labs Sauce focuses on hosted testing Looking for independent consultants, and consulting firms, who use our service during their engagements Guru pricing, training, etc. available 06/05/09 Sauce Labs Confidential
  • 37. Agile is now mainstream Source: Dr. Dobb’s Journal. 5/7/08. http://bit.ly/4EjcDH 06/05/09 Sauce Labs Confidential
  • 38. Continuous Integration is now mainstream 06/05/09 Sauce Labs Confidential Source:VersionOne. 8/22/08. http://www.versionone.com/pdf/3rdAnnualStateOfAgile_FullDataReport.pdf
  • 39. Functional tests tend to run at end of day 06/05/09 Sauce Labs Confidential Source: Viewtier Systems. http://bit.ly/2qQ5LX
  • 40. Our current thinking about pricing (Subject to change) 06/05/09 Sauce Labs Confidential $ per test minute Tests queued no later than… Five minutes Express : Relatively high per test minute 8 hours Economy : Low amount per test minute
  • 41. Express entails lower chef utilization (We’ll need beta usage to quantify) 06/05/09 Sauce Labs Confidential Express Chef # minute Economy Chef # minute script 1 script 6 script 10 script 2 script 7 script 11 script 12 script 3 script 8 script 13 script 4 script 9 script 14 script 5 10 20 30 40 50 60 1 2 3 4 5 10 20 30 40 50 60 script 1 script 2 script 3 script 4 script 5 script 6 1
  • 42. Thinking about pricing the right way? How much Express would you use? How much Economy? 06/05/09 Sauce Labs Confidential