Upgrade to Pro — share decks privately, control downloads, hide ads and more …

QA without QA

0bcca56338eafabadf57b0ce4a307eb7?s=47 Uri Nativ
February 18, 2013

QA without QA

My talk from #reversim 2013 conference.

I believe that the best way to improve the quality of your software is not to have a QA organization. It's not about not testing, on the contrary, it is about treating quality as a mindset, a way of working and a good set of tools. Not as a process or a gatekeeper. I'll talk about fixing bugs before writing new features, BDD, TDD, Unit tests, CI, CD, testing in production, the value of fast tests and more. I'll talk about tools and the methodology we use and the challenges we're facing with our no-QA approach.

0bcca56338eafabadf57b0ce4a307eb7?s=128

Uri Nativ

February 18, 2013
Tweet

Transcript

  1. None
  2. Dev to QA 1:1

  3. Dev to QA 2:1

  4. Dev to QA 3:1

  5. Dev to QA ∞:1

  6. Uri Nativ Head of Engineering & Site Manager Klarna Tel

    Aviv
  7. SAFE & SIMPLE payments online

  8. Stockholm SWEDEN Tel Aviv ISRAEL

  9. $1,000,000,000

  10. None
  11. None
  12. 1 2 3 3 steps to QUALITY

  13. The ABSURD in having a QA org.

  14. a WALL between ACTIONS and CONSEQUENCES

  15. devs are LAZY

  16. our job is NOT to CODE our job is NOT

    to TEST we are software engineers we SHIP software that SOLVES problems
  17. 1 2 3 3 steps to QUALITY

  18. 2 3 3 steps to QUALITY 1 NO QA

  19. Number of bugs Time High Medium Low BUGS over TIME

  20. Number of bugs Time High Medium Low BUGS over TIME

  21. Number of bugs Time High Medium Low Micro BUGS over

    TIME
  22. None
  23. None
  24. zero BUGS policy fix ALL bugs

  25. BUGS first FEATURES second zero BUGS policy

  26. DELETE bugs zero BUGS policy

  27. 2 3 3 steps to QUALITY 1 NO QA

  28. 3 3 steps to QUALITY 1 NO QA 2 ZERO

    BUGS POLICY
  29. Cost of fixing BUGS

  30. Requirements Design Code Test Production 10x 50x COST of bug

    fix 1x 5x 150x Phase detected Cost
  31. COST of bug fix 1x 5x 150x Phase detected Cost

    Requirements Design Code Test Production 10x 50x
  32. Requirements Design Code Test Production 1 YEAR

  33. Requirements Design Code Test Production 6 MONTHS

  34. Requirements Design Code Test Production 1 MONTH

  35. Requirements Design Code Test Production 1 WEEK

  36. Requirements Design Code Test Production HOURS

  37. Requirements Design Code Test Production HOURS 150x 1x 5x 10x

    50x
  38. Requirements Design Code Test Production HOURS 150x 1x 5x 10x

    50x
  39. Requirements Design Code Test Production HOURS 150x 1x 5x 10x

    50x
  40. Requirements Design Test Code Production HOURS 150x 1x 5x 50x

    10x
  41. Requirements Design Code Production Test HOURS 50x 1x 5x 10x

    150x
  42. Requirements Design Code Production Test HOURS 50x 1x 5x 10x

    150x
  43. QUALITY is in the EYE of the BEHOLDER

  44. 3 3 steps to QUALITY 1 NO QA 2 ZERO

    BUGS POLICY
  45. 3 2 1 NO QA ZERO BUGS POLICY SHORT FEEDBACK

    LOOP 3 steps to QUALITY
  46. Short feedback LOOP

  47. BDD & TDD

  48. CUCUMBER SCENARIO 1 Feature: Upsale for existing merchant Background: Given

    I have valid user for Klarna Scenario: Complete upsale flow Given I am on the login page When I login as a valid user Then I should see a pricing page When I accept the terms and conditions And I click the next button Then I should see the thank you page
  49. CUCUMBER SCENARIO 1 Feature: Upsale for existing merchant Background: Given

    I have valid user for Klarna Scenario: Complete upsale flow Given I am on the login page When I login as a valid user Then I should see a pricing page When I accept the terms and conditions And I click the next button Then I should see the thank you page
  50. CUCUMBER SCENARIO 1 Feature: Upsale for existing merchant Background: Given

    I have valid user for Klarna Scenario: Complete upsale flow Given I am on the login page When I login as a valid user Then I should see a pricing page When I accept the terms and conditions And I click the next button Then I should see the thank you page
  51. CUCUMBER SCENARIO 1 Feature: Upsale for existing merchant Background: Given

    I have valid user for Klarna Scenario: Complete upsale flow Given I am on the login page When I login as a valid user Then I should see a pricing page When I accept the terms and conditions And I click the next button Then I should see the thank you page
  52. CUCUMBER SCENARIO 2 Feature: Upsale for existing merchant Background: Given

    I have valid user for Klarna Scenario: Upsale dropout Given I am on the login page When I login as a valid user Then I should see a pricing page When I wait 24 hours Then a Lead is created in the CRM
  53. CUCUMBER STEP DEFINITON Given /^I am on the login page$/

    do url = “https://www.klarna.com/login” visit url end When /^I login as a valid user$/ do fill_in "uid", :with => @valid_user[:uname] fill_in "pass", :with => @valid_user[:pass] click_button "login" end Then /^I should see a pricing page$/ do page.should have_selector ("title", :text => 'Pricing Page Title') end
  54. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  55. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  56. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  57. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  58. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  59. RSPEC – CONTROLLER TEST describe ‘UpsaleController’ do describe ‘login endpoint’

    do it "should redirect to OAuth login" do OAuthAPI.stub(:get_login_url). and_return ("https://login.klarna.com") get :login response.should redirect_to ("https://login.klarna.com") end end
  60. CONTROLLER class UpsaleController < ApplicationController def login redirect_to OAuthAPI.get_login_url end

    end
  61. PAIR programming

  62. code REVIEW

  63. continuous INTEGRATION

  64. continuous DELIVERY

  65. DARK launch

  66. gradual ROLLOUT

  67. 100% Eng. Internal 1% gradual ROLLOUT 5%

  68. Short feedback LOOP

  69. “ YES, BUT…” - Guri Alfi

  70. take NOTHING FOR granted

  71. 3 2 1 NO QA ZERO BUGS POLICY SHORT FEEDBACK

    LOOP 3 steps to QUALITY
  72. THANK YOU @reversim

  73. THANK YOU @reversim

  74. Uri Nativ @unativ @ uri.nativ@klarna.com