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

COOKPAD and Test Automation

COOKPAD and Test Automation

ソフトウェアテストシンポジウム 2014 東北(JaSST'14 Tohoku)
2014年5月23日(金)

Naoto Takai

May 25, 2014
Tweet

More Decks by Naoto Takai

Other Decks in Programming

Transcript

  1. ΫοΫύουͱςετࣗಈԽ
    JaSST’14 Tohoku

    View Slide

  2. ߴҪ௚ਓ
    ΫοΫύουגࣜձࣾ

    View Slide

  3. ࢲͷཤྺॻ
    ೥ʙ ϝʔΧʔܥൢࣾ

    ೥ʙ ΢Σϒ੍࡞ձࣾ

    ೥ʙ େखγεςϜΠϯςάϨʔλʔ

    ೥ʙ ωοταʔϏεӡӦձࣾ

    View Slide

  4. ιϑτ΢ΣΞ඼࣭ͱͷग़ձ͍
    ΢Σϒ੍࡞ձࣾͰडୗ։ൃʹैࣄ͍ͯͨ͠
    ࢲ͸3VCZͷීٴɾൃలͷͨΊʹେखγε
    ςϜΠϯςάϨʔλ΁ͱస৬ͨ͠ͷ͕ͩɺ
    ԿͷҼՌ͔ιϑτ΢ΣΞඪ४Խ෦໳ʹ഑ଐ
    ͞ΕΔ͜ͱʹͳͬͨͷͩͬͨʜʜɻ

    View Slide

  5. View Slide

  6. View Slide

  7. ݄ؒϢχʔΫϒϥ΢β਺






    ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄ ݄
    1$
    ϞόΠϧ ສ6#
    ʢ೥݄ظୈ࢛൒ظܾࢉิ଍આ໌ࢿྉʣ

    View Slide

  8. εϚϗΞϓϦྦྷܭ%-਺
    ύζυϥ ສɺࠇೣ ສ
    J04 ສ "OESPJEສ
    ʢ೥݄࣌఺ʣ

    View Slide

  9. ౤ߘϨγϐ਺







    ݄ ݄ ݄ ݄ ݄ ݄ ݄
    Ϩγϐ਺
    ສ඼
    ʢ೥݄ظୈ࢛൒ظܾࢉิ଍આ໌ࢿྉʣ

    View Slide

  10. ΫοΫύουͷϢʔβʔ
    உੑ

    ঁੑ

    ঁੑ
    உੑ
    ੑผ
    ୅Ҏ্







    ୅ҎԼ

    ୅ҎԼ



    ୅Ҏ্
    ೥୅ʢঁੑʣ
    ʢ೥݄࣌఺ʣ

    View Slide

  11. .
    .
    .
    .
    .
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    ձһࣄۀ
    ޿ࠂࣄۀ
    ͦͷଞ
    ࢛൒ظച্ߴ
    ඦສԁʢ࿈݁ʣ
    ʢ೥݄ظୈ࢛൒ظܾࢉิ଍આ໌ࢿྉʣ

    View Slide

  12. ΞϓϦέʔγϣϯߏ੒ʢ8FCʣ
    MySQL
    Redis
    Memcached
    Unicorn
    Rails 3.2
    Ruby 2.0
    nginx
    Amazon Web Service
    Apache

    View Slide

  13. ΞϓϦέʔγϣϯن໛ʢ8FCʣ
    w Ϟσϧɹɹɹɹɹɹɹʜ Ϋϥε
    w ίϯτϩʔϥʔɹɹɹʜΫϥε
    w ϏϡʔςϯϓϨʔτɹʜ ϑΝΠϧ
    w ϧʔςΟϯάఆٛɹɹʜ ߦ
    w 34QFD&YBNQMF਺ɹɹʜ ݸ
    w σϓϩΠճ਺ɹɹɹɹʜճҎ্ʗ೔
    ʢ೥݄೔࣌఺ʣ

    View Slide

  14. View Slide

  15. ࠷ߴʹ͓͍͍͠ʮνϣίϨʔτέʔΩʯ͸
    Ͳ͏΍ͬͨΒͰ͖Δ͔Λߟ͍͑ͯͩ͘͞ɻ

    View Slide

  16. View Slide

  17. ʮຖ೔ͷྉཧΛָ͠Έʹʯ͸
    Ͳ͏΍ͬͨΒͰ͖Δ͔Λߟ͍͑ͯͩ͘͞ɻ

    View Slide

  18. ࣦഊ͢Δ΍Γํ
    ָ͠ΈʹͳΔͨΊͷཁ݅Λఆٛ͢Δ
    ্هΛຬͨ͢ػೳΛઃܭ͢Δ
    ιϑτ΢ΣΞΛ࣮૷͠ɺςετ͢Δ

    View Slide

  19. ͳࣦͥഊ͢Δͷ͔ʁ
    ָ͠ΈʹͳΔͨΊͷཁ݅Λఆٛ͢Δ
    ্هΛຬͨ͢ػೳΛઃܭ͢Δ
    ιϑτ΢ΣΞΛ࣮૷͠ɺςετ͢Δ
    ʮଥ౰ੑ֬ೝʯͷϓϩηε͕ͳ͍

    View Slide

  20. ̫ˍ̫ʢݕূͱଥ౰ੑ֬ೝʣ
    w ݕূ

    ٬؍తূڌΛఏࣔ͢Δ͜ͱʹΑͬͯɺنఆཁٻࣄ߲
    ͕ຬͨ͞Ε͍ͯΔ͜ͱΛ֬ೝ͢Δ͜ͱɻ
    w ଥ౰ੑ֬ೝ

    ٬؍తূڌΛఏࣔ͢Δ͜ͱʹΑͬͯɺಛఆͷҙਤ͞
    Εͨ༻్ຢ͸ద༻ʹؔ͢Δཁٻࣄ߲͕ຬͨ͞Ε͍ͯ
    Δ͜ͱΛ֬ೝ͢Δ͜ͱɻ

    View Slide

  21. ̫ࣈϞσϧͱ̫ˍ̫
    ଥ౰ੑ֬ೝ
    ཁ݅ఆٛ
    جຊઃܭ
    ৄࡉઃܭ
    ࣮૷ɾ୯ମςετ
    ݁߹ςετ
    γεςϜςετ
    ड͚ೖΕςετ
    اը ධՁ
    ݕূ

    View Slide

  22. ̫ࣈϞσϧͱ੹೚෼ք఺ʢ༨ஊʣ
    ൃ஫ଆൣғ
    ཁ݅ఆٛ
    جຊઃܭ
    ৄࡉઃܭ
    ࣮૷ɾ୯ମςετ
    ݁߹ςετ
    γεςϜςετ
    ड͚ೖΕςετ
    اը ධՁ
    डୗଆൣғ
    डୗ։ൃͰଥ౰ੑ֬ೝ͕
    ࿩୊ʹͳΒͳ͍ཧ༝
    ਖ਼֬ʹ͸ཁ݅ఆٛɾड͚ೖ
    Εςετ͸ൃ஫ଆ੹೚

    View Slide

  23. ੒ޭ͢Δ΍Γํ
    ιϑτ΢ΣΞΛ͔ͭͬͯ΋Β͏
    ָ͠Έʹͳ͔ͬͨΛௐ΂Δ
    Ͳ͏΍ͬͨΒ΋ͬͱָ͠ΈʹͳΔ
    ιϑτ΢ΣΞΛͭ͘ΕΔ͔ߟ͑Δ

    View Slide

  24. σΠϒɾτʔϚεᐌ͘ɺ
    " 8IFSFEPXFXBOUUPCF
    # 8IFSFBSFXF
    $ )PXEPXFJNQSPWFPVSQSPDFTT
    5IJTJT"HJMJUZ5IFSFJTOPNPSF

    View Slide

  25. ཁٻຬ଍ͷࣄޙੑ
    ιϑτ΢ΣΞ͕ཁٻΛຬ͍ͨͯ͠Δ͔͸ɺ
    ιϑτ΢ΣΞΛ࢖Θͳ͍ͱ൑அͰ͖ͳ͍ɻ

    View Slide

  26. ΋͠ɺ͓٬͞·ʹ๬Ή΋ͷΛฉ͍͍ͯͨΒɺ
    ͓٬͞·͸ʮ΋ͬͱ଎͍അ͕ཉ͍͠ʯͱ

    ౴͍͑ͯͨͩΖ͏ɻ
    ϔϯϦʔɾϑΥʔυʦཁग़యʧ

    View Slide

  27. ୭͕ސ٬ͳͷ͔͕Θ͔Βͳ͚Ε͹ɺԿ͕඼
    ࣭ͳͷ͔΋Θ͔Βͳ͍ɻ
    ΤϦοΫɾϦʔεʰϦʔϯελʔτΞοϓʱ
    ඼࣭͸୭͔ʹͱͬͯͷՁ஋Ͱ͋Δɻ
    δΣϥϧυɾϫΠϯόʔάʰιϑτ΢ΣΞจԽΛ૑Δ̍ʱ

    View Slide

  28. ߏங͢Δ
    ܭଌ͢Δ
    ֶͿ
    ੡඼
    σʔλ
    ΞΠσΞ
    ߏஙɾܭଌɾֶशͷϧʔϓ
    ͜ͷϧʔϓʹཁ͢Δ࣌ؒΛ࠷খԽ͢Δ

    View Slide

  29. ϧʔϓʹཁ͢Δ࣌ؒΛ࠷খԽ͢Δʹ͸ʁ
    ʢʹιϑτ΢ΣΞͷͭ͘Γํͷվળʣ

    View Slide

  30. ࣦഊ͢Δ΍Γํ
    ։ൃϓϩηεඪ४Λఆٛ͢Δɻ
    ։ൃϓϩηεඪ४ΛϓϩδΣΫτຖʹ
    ςʔϥϦϯά͢Δɻ

    View Slide

  31. ͳࣦͥഊ͢Δͷ͔ʁ
    ։ൃϓϩηεඪ४Λఆٛ͢Δɻ
    ։ൃϓϩηεඪ४ΛϓϩδΣΫτຖʹ
    ςʔϥϦϯά͢Δɻ
    ݱ࣮ͷ։ൃϓϩηεͷվળͰ͸ͳ͍

    View Slide

  32. ੒ޭ͢Δ΍Γํ
    ϦϦʔεՄೳͳঢ়ଶʹ͢Δ
    ιϑτ΢ΣΞΛ։ൃ͢Δ
    มߋΛՃ͔͑ͯΒϦϦʔεՄೳͳ
    ঢ়ଶʹͳΔ·ͰͷແବΛͳ͘͢

    View Slide

  33. ιϑτ΢ΣΞੜ࢈ੑ
    ιϑτ΢ΣΞͷੜ࢈ੑΛ޲্ͤ͞ΔͨΊͷ
    ޮՌతͳख๏͸͓Αͦࡾͭʹ෼ྨ͞ΕΔɻ
    w ෦඼Խʜͭ͘Βͳ͍Α͏ʹ͢Δ
    w ࣗಈԽʜ͠ͳ͍Α͏ʹ͢Δ
    w ՄࢹԽʜΘ͔ΔΑ͏ʹ͢Δ

    View Slide

  34. ܧଓతσϦόϦʔ
    ܧଓతσϦόϦʔ͸ιϑτ΢ΣΞ։ൃʹ͓
    ͚Δن཯ͷͻͱͭͩɻʜʜܧଓతσϦό
    ϦʔΛ࣮ݱ͢Δʹ͸ɺ։ൃνʔϜ͕ιϑτ
    ΢ΣΞΛܧଓతʹ౷߹͠ɺ࣮ߦϑΝΠϧΛ
    Ϗϧυ͠ɺ͞ΒʹͦΕΛࣗಈతʹςετ
    ͯ͠໰୊Λݕग़͢Ε͹͍͍ɻ
    IUUQDBQTDUSMRVFKQLENTOSXJLJCMJLJ $POUJOVPVT%FMJWFSZ

    View Slide

  35. ࣗಈςετͱඅ༻ରޮՌʢ༨ஊʣ
    ςετࣗಈԽ͸։ൃϓϩηεͷϜμऔΓͰ
    ͋Γɺͦ΋ͦ΋ϜμऔΓʹඅ༻ରޮՌͱ͍
    ͏֓೦͸͏·Εͳ͍ʢΩϦοʣ

    View Slide

  36. σϓϩΠϝϯτύΠϓϥΠϯ
    ੒Ռ෺ϦϙδτϦ
    όʔδϣϯίϯτϩʔϧ
    ιʔείʔυ ઃఆ
    ίϛοτεςʔδ ड͚ೖΕεςʔδ
    ड͚ೖΕςετ
    ؀ڥઃఆɺσϓϩΠɺ
    εϞʔΫςετ
    ੑೳςετ
    ؀ڥઃఆɺσϓϩΠɺ
    εϞʔΫςετ
    ຊ൪؀ڥ
    ؀ڥઃఆɺσϓϩΠɺ
    εϞʔΫςετ
    ίϯύΠϧ
    ίϛοτςετ
    ੒Ռ෺࡞੒
    ίʔυղੳ
    ؀ڥઃఆ
    σϓϩΠ
    εϞʔΫςετ
    ड͚ೖΕςετ
    ઃఆ
    +F[)VNCMFɺ%BWJE'BSMFZʰܧଓతσϦόϦʔʱ

    View Slide

  37. ΫοΫύουͷύΠϓϥΠϯ
    Source Code Review
    Continuous Integration
    Production Test
    Developement
    Production
    GitHub Git Repository
    merge
    pull req
    pull
    tag
    deploy
    deploy

    View Slide

  38. Developer Machine
    Redis
    Shared Development MySQL
    EC2
    Ruby on Rails
    memcached
    Remote Spec Workers
    remote_spec worker
    remote_spec worker

    GitHub Enterprise
    LAN
    Tokyo Tyrant
    Development App Server
    push
    rspec
    deploy
    HipChat
    ϩʔΧϧͷ։ൃ؀ڥ

    View Slide

  39. ։ൃऀʹΑΔςετ
    34QFDʹΑΔςετ

    ୯ମςετπʔϧʹΑͬͯɺσʔλϕ
    ʔε΋ؚΊͨςετΛ͢Δ
    $BQZCBSBʹΑΔςετ

    ը໘ͳ͠ͷ΢Σϒϒϥ΢βΛ༻͍ͯɺ
    γφϦΦϕʔεͷςετΛ͢Δ

    View Slide

  40. ։ൃऀςετɾ2"ςετʢ༨ஊʣ
    ։ൃऀςετͱ2"ςετ͸ରཱతͳ֓೦
    Ͱ͸ͳ͘ɺςετͷ͋Δଆ໘ʹ͗͢ͳ͍ɻ
    ෼ྨ͋Γ͖Ͱߟ͑ΔͷͰ͸ͳ͘ɺϦϦʔε
    ·ͰʹԿ͕ඞཁ͔Λߟ͑Α͏ɻ

    View Slide

  41. 34QFDͷಛ௃
    ;Δ·͍ۦಈ։ൃʢ#%%ʣͷͨΊͷςες
    ΟϯάϑϨʔϜϫʔΫɻ
    w σϑΝΫτελϯμʔυͰ͋Δ
    w ςετίʔυΛߏ଄Խ͠΍͍͢
    w ΤίγεςϜ͕ॆ࣮͍ͯ͠Δ

    View Slide

  42. 34QFDʹΑΔςετ
    describe SymbolStack do
    ...
    context 'when stack is empty' do
    subject(:empty_stack) { SymbolStack.new }
    describe '#size' do
    it { expect(empty_stack.size).to eq 0 }
    end

    View Slide

  43. $BQZCBSBʹΑΔςετ
    feature 'User login' do
    scenario 'successful login' do
    visit login_path
    fill_in 'Login', with: '[email protected]'
    fill_in 'Password', with: 'password'
    click_link 'Submit'
    expect(current_path).to root_path
    end

    View Slide

  44. LAN
    EC2
    CI Server
    Git Repository Production Test
    HipChat
    tag
    pull
    notify
    deploy
    Development DB
    schema
    Remote Spec
    distribute
    Git Repository
    clone pusher
    service hook pull
    push
    Developer
    merge
    ιʔείʔυͷྲྀΕ

    View Slide

  45. ίʔυϨϏϡʔ
    Team
    Pull Request
    Owner Developer
    Developer
    review
    open merge
    review
    ίʔυϨϏϡʔ͸νʔϜ୯ҐͰߦͳ͏͕ɺ
    શһ͕ϨϏϡʔ͢Δ͜ͱ΋Ͱ͖Δɻ

    View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. View Slide

  50. Repository
    Product Support
    Product Manager
    Issue
    Developer UI/UX Designer
    Pull Request
    file
    file
    review
    open
    open
    (JU)VC&OUFSQSJTFͷར༻
    ΤϯδχΞҎ֎ʹ΋σβΠφʔ৬ɺσΟϨ
    Ϋλʔ৬ɺαϙʔτ৬ͳͲ

    View Slide

  51. LAN
    EC2
    CI Server
    Git Repository Production Test
    HipChat
    tag
    pull
    notify
    deploy
    Development DB
    schema
    Remote Spec
    distribute
    Git Repository
    clone pusher
    service hook pull
    push
    Developer
    merge
    ιʔείʔυͷྲྀΕ

    View Slide

  52. $*αʔόʮ͓Ή͖Μ͢ʯ
    IUUQTHJUIVCDPNNBTBOPCVJNBJFNPUJPOBMKFOLJOTQMVHJO

    View Slide

  53. $*࣌ؒʹؔ͢Δܦݧଇ
    ։ൃऀ͸े෼ʹၗຫͳͷͰɺ
    ෼ͰΠϥΠϥ͠ɺ෼ͰΩϨΔɻ

    View Slide

  54. $*Λૣ͘͢Δ޻෉
    ϚϧνϓϩηεԽʢ[email protected]ʣ
    ෼ࢄԽ
    ୈ̍ੈ୅[email protected]
    ୈ̎ੈ୅[email protected]
    ୈ̏ੈ୅3334QFD

    View Slide

  55. 3334QFDͷಛ௃
    εϙοτΠϯελϯεΛར༻
    ϓϩηεఀࢭ͔Βͷࣗಈ෮ؼ
    ࣦഊͨ͠ςετͷࣗಈ࠶࣮ߦ
    ςετ࣮ߦॱংͷ࠷దԽ
    ௕͍ςετͷ౤ػత࣮ߦ
    Φʔϓϯιʔε
    IUUQTHJUIVCDPNDPPLQBESSSTQFDCMPCNBTUFS%&4*(/NE

    View Slide

  56. Master
    Slave
    Worker
    Slave
    Slave
    Worker
    ʜ ʜ
    DB
    3334QFDͷߏ੒
    &YBNQMF਺ʜ໿
    εϨʔϒ਺ʜ໿୆
    ϫʔΧʔ਺ʜ໿ฒྻ
    ࣮ߦ࣌ؒɹʜ໿෼

    View Slide

  57. ςετͷ඼࣭
    ػೳͷՁ஋͸ϦϦʔεͯ͠ॳΊͯΘ͔Δ
    ʹςετʹա৒ͳઌߦ౤ࢿ͸Ͱ͖ͳ͍
    w ςετઃܭ޻ఔΛಠཱͯ͠ઃ͚ͳ͍
    w ։ൃ޻ఔͷ͋ͱͷςετ޻ఔ͸ͳ͍
    ຊ൪؀ڥͰͷμϝʔδίϯτϩʔϧ͕ॏཁ

    View Slide

  58. View Slide

  59. View Slide

  60. View Slide

  61. View Slide

  62. View Slide

  63. σϕϩούʔͱϢʔβʔͷίϛϡχέʔγ
    ϣϯ΍ίϥϘϨʔγϣϯΛ્Ήน΋ͳ͘ͳ
    ͬͨɻόάͷण໋͸ɺ਺ϲ݄͔Β਺෼ʹ୹
    ॖ͞Εͨɻ
    ̟ɾ΢ΟςΧʔɺ̟ɾΞʔϘϯɺ̟ɾΩϟϩʔϩ

    ʰςετ͔Βݟ͑ͯ͘Δάʔάϧͷιϑτ΢ΣΞ։ൃʱ

    View Slide

  64. ͱɺ͍͏͓࿩ͩͬͨͷ͞ʜʜ

    View Slide

  65. ϞόΠϧΞϓϦέʔγϣϯ
    w ΑΓϢʔβʔΤΫεϖϦΤϯε͕ॏཁʹ
    w Ϧονͳ6*ɺෳࡶͳঢ়ଶͷςετ
    w ΞϓϦέʔγϣϯσϦόϦʔ໰୊͕࠶೩
    w ෳ਺όʔδϣϯ͕ซଘ
    w ϦϦʔεϑϩʔͷ࠶ߏங
    w ϦϦʔεظؒɺςετϑΣʔζ

    View Slide

  66. ෮श໰୊
    ສճʹճɺສԁ͕౰ͨΔεϩοτϚ
    γϯ͕͋Δ΋ͷͱ͠·͢ɻ͜ͷεϩοτϚ
    γϯͰ༡Ϳͱ͖ɺճ͋ͨΓ͍͘Βίετ
    Λ͔͚Δ΂͖͔ߟ͍͑ͯͩ͘͞ɻ

    View Slide

  67. ·ͱΊ
    w Ϣʔβʔͷཁٻ͸ɺϦϦʔεͯ͠ॳΊͯ
    ෼͔Δɻ
    w ߏஙɾܭଌɾֶशͷϧʔϓʹཁ͢Δ࣌ؒ
    Λ࠷খԽ͠ͳ͚Ε͹ͳΒͳ͍ɻ
    w ϦϦʔε·ͰͷϓϩηεΛఆٛ͠ɺͦ͜
    ͔ΒແବΛऔΓআ͘ɻ

    View Slide