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

テストと仲良くするためのCodeceptionのはじめかた #phpkansai

テストと仲良くするためのCodeceptionのはじめかた #phpkansai

PHPカンファレンス関西 2017の発表資料です。

Ippei Sumida

July 15, 2017
Tweet

More Decks by Ippei Sumida

Other Decks in Programming

Transcript

  1. ςετͱ஥ྑ͘͢ΔͨΊͷ
    Codeceptionͷ͸͡Ί͔ͨ
    PHP Conference Kansai 2017

    2017-07-15

    View Slide

  2. ࣗݾ঺հ
    • ֯ాɹҰฏʢ͢Έͩɹ͍ͬ΃͍ʣ
    • ϑϦʔϥϯεΤϯδχΞ

    ˠ͓࢓ࣄઈࢍืूதʂ
    • CoderDojoຕํɹ୅ද

    View Slide

  3. ࠓ೔ͷ໨ඪ
    • Codeceptionʹ͍ͭͯ஌ͬͯ΋Β͏
    • CodeceptionͷςετͷྲྀΕΛ஌ͬͯ΋Β͏
    • ʰCodeceptionͱҰॹʹ

    ɹςετͱ஥ྑ͘ͳΖ͏ʱͱࢥͬͯ΋Β͏

    View Slide

  4. ΞδΣϯμ
    • Codeceptionͱ͸
    • CodeceptionͰͷςετ࣮૷
    • Codeception Tips

    View Slide

  5. ςετॻ͍ͯ·͔͢ʁ

    View Slide

  6. –ݪాɹ߁ੜ
    “ςετ͸઒ͷਫ࣭ௐࠪͩͱࢥͬͨΒ͍͍
    Ͱ͢Α”

    View Slide

  7. ւˡ

    View Slide

  8. View Slide

  9. View Slide

  10. ୯ମςετ
    ػೳςετ
    γεςϜɾडೖςετ

    View Slide

  11. γεςϜςετ
    ػೳςετ
    ୯ମςετ

    View Slide

  12. దࡐదॴͳςετΛ༻ҙ

    View Slide

  13. దࡐదॴͷςετ͸…
    • ෆ۩߹ൃݟ͕༰қʹ
    • ૝ఆ֎ͷӨڹΛૣظൃݟ
    • ֎෦ύοέʔδΛ҆৺ͯ͠ߋ৽

    View Slide

  14. Codeceptionͱ͸

    View Slide

  15. 1.Codeceptionͱ͸
    ςεςΟϯάϑϨʔϜϫʔΫ

    (PHP੡)

    View Slide

  16. PHPer Readableͳ

    ςεςΟϯάϑϨʔϜϫʔΫ
    1.Codeceptionͱ͸

    View Slide

  17. public function registerTest(AcceptanceTester $I)
    {
    $I->wantToTest('ొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    $I->canSeeInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    ]);
    }
    1.Codeceptionͱ͸

    View Slide

  18. ςετͷ؅ཧָ͕
    1.Codeceptionͱ͸

    View Slide

  19. 1.Codeceptionͱ͸
    6OJU
    w ֤Ϋϥεɺϝιου
    w 1)16OJUΠϯετʔϧ

    ෆཁ
    1)16OJUΛར༻ͨ͠

    ୯ମςετ
    'VODUJPOBM
    w ػೳ୯Ґ
    w ϦΫΤετʹର͢Δ

    ݁ՌΛ֬ೝ
    w ֤'8ରԠ
    8FCαʔόΛհ͞ͳ
    ͍'8ςετ
    "DDFQUBODF
    w ػೳ୯Ґ
    w ը໘্ͷಈ࡞֬ೝ
    w ϒϥ΢βґଘ
    ϒϥ΢βΛར༻ͨ͠
    डೖςετ

    View Slide

  20. Codeception͚ͩͰ

    ֤छςετΛҰׅ؅ཧɺ࣮ߦ
    1.Codeceptionͱ͸

    View Slide

  21. ֤छϑϨʔϜϫʔΫαϙʔτ
    1.Codeceptionͱ͸

    View Slide

  22. 1.Codeceptionͱ͸
    And more…

    View Slide

  23. ͦͷ΄͔
    • REST APIςετՄ
    • ϨεϙϯγϒαΠτͷςετՄ
    • ֤छCIͱ࿈ܞՄ
    • Ωϟϓνϟऔಘ
    • ίʔυΧόϨοδऔಘ

    View Slide

  24. ଟػೳɾ؆୯
    1.Codeceptionͱ͸
    ςετͱ஥ྑ͘Ͱ͖ͦ͏ʂ

    View Slide

  25. Conclusion
    • Codeception͸ςεςΟϯάϑϨʔϜϫʔΫ
    • PHPer͕ಡΈ΍͍͢ςετίʔυ
    • ֤छςετΛҰׅ؅ཧɺ࣮ߦՄೳ
    • ֤छϑϨʔϜϫʔΫରԠ
    • ͦͷଞॾʑ༻ҙ͞ΕͯΔͷͰ஥ྑ͘ͳΕͦ͏

    View Slide

  26. CodeceptionͰͷςετ࣮૷

    View Slide

  27. 2.CodeceptionͰͷςετ࣮૷
    6OJU
    w ֤Ϋϥεɺϝιου
    w 1)16OJUΠϯετʔϧ

    ෆཁ
    1)16OJUΛར༻ͨ͠

    ୯ମςετ
    'VODUJPOBM
    w ػೳ୯Ґ
    w ϦΫΤετʹର͢Δ

    ݁ՌΛ֬ೝ
    w ֤'8ରԠ
    8FCαʔόΛհ͞ͳ
    ͍'8ςετ
    "DDFQUBODF
    w ػೳ୯Ґ
    w ը໘্ͷಈ࡞֬ೝ
    w ϒϥ΢βґଘ
    ϒϥ΢βΛར༻ͨ͠
    डೖςετ

    View Slide

  28. Unit
    ϝιου࣮ߦ
    ϝιουΛ࣮ߦͯ͠

    ࣮ߦ݁Ռʹରͯ͠ςετɻ

    2.CodeceptionͰͷςετ࣮૷

    View Slide

  29. Functional
    ϦΫΤετ
    FWʢϓϩάϥϜʣʹϦΫΤετΛ౉ͯ͠ɺ

    ࣮ߦ݁Ռʹରͯ͠ςετɻ

    = WebαʔόΛհ͞ͳ͍
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  30. Acceptance
    ϒϥ΢βΛ੍ޚͯ͠ɺ

    ϒϥ΢βදࣔ݁Ռʹରͯ͠ςετɻ

    㲈ਓͷखʹΑΔϒϥ΢βςετ
    2.CodeceptionͰͷςετ࣮૷
    ϦΫΤετ

    View Slide

  31. ࣮ߦ଎౓͸

    Unit > Functional > Acceptance
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  32. શͯΛAcceptanceͰ
    ߦΘͳ͍
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  33. Acceptance = Ϧϋʔαϧ
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  34. Πϯετʔϧ

    ؀ڥ४උ
    ࣮ߦ
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  35. 2.CodeceptionͰͷςετ࣮૷
    $ composer require —dev codeception/codeception
    Πϯετʔϧ

    View Slide

  36. 2.CodeceptionͰͷςετ࣮૷
    bootstrap - ؀ڥ࡞੒
    build - ઃఆ൓ө
    $ vendor/bin/codecept bootstrap
    $ vendor/bin/codecept build

    View Slide

  37. 2.CodeceptionͰͷςετ࣮૷
    $ vendor/bin/codecept run
    ςετ࣮ߦʢҰׅʣ

    View Slide

  38. 2.CodeceptionͰͷςετ࣮૷
    $ vendor/bin/codecept run acceptance HogeCest:hogeTest
    ςετ࣮ߦʢҰ෦ʣ
    TVJUF ςετϑΝΠϧɺϝιου

    View Slide

  39. 2.CodeceptionͰͷςετ࣮૷
    Acceptance (phpbrowser) Tests (2)
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    ---------------------
    Testing acceptance (phpbrowser)
    ✔ InquiryCest: Test ొ࿥ςετ (1.30s)
    ✔ InquiryCest: Test ॏෳొ࿥ςετ (1.04s)
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    -------------------------------------------------------
    Time: 2.59 seconds, Memory: 17.00MB
    OK (2 tests, 5 assertions)
    ࣮ߦ݁ՌʢOKʣ

    View Slide

  40. 2.CodeceptionͰͷςετ࣮૷
    Acceptance (phpbrowser) Tests (2)
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    ---------------------
    Testing acceptance (phpbrowser)
    ✖ InquiryCest: Test ొ࿥ςετ
    ✔ InquiryCest: Test ొ࿥ςετ[F] (2.10s)
    ✔ InquiryCest: Test ॏෳొ࿥ςετ (1.30s)
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    -------------------------------------------------------
    Time: 3.7 seconds, Memory: 17.25MB
    There was 1 failure:
    ࣮ߦ݁ՌʢNGʣ

    View Slide

  41. 2.CodeceptionͰͷςετ࣮૷
    ---------
    1) InquiryCest: Test ొ࿥ςετ
    Test tests/acceptance/InquiryCest.php:registerTest
    Failed asserting that any element by '#title' on page /inquiry/
    + ͓໰͍߹Θͤ
    contains text 'a͓໰͍߹Θͤ'
    ࣮ߦ݁ՌʢNGʣ
    ͲͷςετͰΤϥʔʹͳ͔ͬͨग़ྗ

    View Slide

  42. 2.CodeceptionͰͷςετ࣮૷
    ࣮ߦ݁ՌʢNGʣ
    Τϥʔ࣌ʹͲͷΑ͏ͳ݁Ռ͕ग़ྗ͞Ε͔ͨอଘ

    View Slide

  43. ֤ઃఆ
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  44. Unit Test
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  45. 2.CodeceptionͰͷςετ࣮૷
    unit.suite.yml
    # Codeception Test Suite Configuration
    #
    # Suite for unit or integration tests.
    actor: UnitTester
    modules:
    enabled:
    - Asserts
    - \Helper\Unit

    View Slide

  46. 2.CodeceptionͰͷςετ࣮૷
    generate:test - testϑΝΠϧ࡞੒
    $ vendor/bin/codecept generate:test unit HogeTest

    View Slide

  47. Functional Test
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  48. 2.CodeceptionͰͷςετ࣮૷
    functional.suite.yml
    actor: FunctionalTester
    modules:
    enabled:
    # add a framework module here
    - \Helper\Functional
    - Symfony:
    app_path: 'app'
    var_path: 'var'
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'

    View Slide

  49. actor: FunctionalTester
    modules:
    enabled:
    # add a framework module here
    - \Helper\Functional
    - Symfony:
    app_path: 'app'
    var_path: 'var'
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    2.CodeceptionͰͷςετ࣮૷
    ϑϨʔϜϫʔΫͷઃఆ
    functional.suite.yml

    View Slide

  50. actor: FunctionalTester
    modules:
    enabled:
    # add a framework module here
    - \Helper\Functional
    - Symfony:
    app_path: 'app'
    var_path: 'var'
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    2.CodeceptionͰͷςετ࣮૷
    %#ͷઃఆ
    functional.suite.yml

    View Slide

  51. 2.CodeceptionͰͷςετ࣮૷
    generate:cept - ceptϑΝΠϧ࡞੒
    generate:cest - cestϑΝΠϧ࡞੒
    $ vendor/bin/codecept generate:cept functional HogeCept
    $ vendor/bin/codecept generate:cest functional HogeCest

    View Slide

  52. Acceptance Test
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  53. 2.CodeceptionͰͷςετ࣮૷
    acceptance.suite.yml
    actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox

    View Slide

  54. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    2.CodeceptionͰͷςετ࣮૷
    acceptance.suite.yml
    ϒϥ΢βͷઃఆ

    View Slide

  55. 2.CodeceptionͰͷςετ࣮૷
    1)1#SPXTFS 1IBOUPN+4
    pSFGPY
    DISPNF
    +BWB4DSJQU º ˚ ̋
    #BTJDೝূ ̋ ˚ ̋
    ࣮ߦ଎౓ ̋ ˚ º

    View Slide

  56. 2.CodeceptionͰͷςετ࣮૷
    1)1

    #SPXTFS
    1IBOUPN+4 'JSFGPY $ISPNF
    4FMFOJVN4UBOEBMPOF
    4FSWFS
    ̋ ̋ ̋
    1IBOUPN+4 ̋
    DISPNFESJWFS ̋
    Required

    View Slide

  57. ϒϥ΢βࢦఆ
    PHPBrowser
    PhantomJS
    firefox/chrome
    2.CodeceptionͰͷςετ࣮૷
    modules:
    enabled:
    - PhpBrowser:
    url: http://localhost:8000
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: firefox

    View Slide

  58. 2.CodeceptionͰͷςετ࣮૷
    generate:cept - ceptϑΝΠϧ࡞੒
    generate:cest - cestϑΝΠϧ࡞੒
    $ vendor/bin/codecept generate:cept acceptance HogeCept
    $ vendor/bin/codecept generate:cest acceptance HogeCest

    View Slide

  59. ςετ࣮૷
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  60. CeptͱCest
    2.CodeceptionͰͷςετ࣮૷

    View Slide

  61. 2.CodeceptionͰͷςετ࣮૷
    $FQU
    w ্͔Βॱʹ࣮ߦ
    w ϑΝΠϧγφϦΦ
    w ؆୯ͳγφϦΦ޲͖
    γφϦΦϑΝΠϧ
    $FTU
    w 1)16OJUͷ༷ʹهड़
    w ϝιουγφϦΦ
    w ෳࡶͳγφϦΦ0,
    γφϦΦΫϥε

    View Slide

  62. 2.CodeceptionͰͷςετ࣮૷
    Cept
    $I = new FunctionalTester($scenario);
    $I->wantTo('͓໰͍߹Θͤొ࿥ςετ');
    $I->amOnPage('/inquiry');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');

    View Slide

  63. 2.CodeceptionͰͷςετ࣮૷
    Cest
    class InquiryFunctionalCest
    {
    // tests
    public function registrationTest(FunctionalTester $I)
    {
    $I->amOnPage('/inquiry');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    }
    }

    View Slide

  64. class InquiryFunctionalCest
    {
    public function _before(FunctionalTester $I)
    {
    }
    public function _after(FunctionalTester $I)
    {
    }
    // tests
    }
    2.CodeceptionͰͷςετ࣮૷
    Cest
    લॲཧʢ@CFGPSF

    ޙॲཧʢ@BGUFS

    View Slide

  65. 2.CodeceptionͰͷςετ࣮૷
    $FQU
    w ্͔Βॱʹ࣮ߦ
    w ϑΝΠϧγφϦΦ
    w ؆୯ͳγφϦΦ޲͖
    γφϦΦϑΝΠϧ
    $FTU
    w 1)16OJUͷ༷ʹهड़
    w ϝιουγφϦΦ
    w ෳࡶͳγφϦΦ0,
    γφϦΦΫϥε
    ɹ
    Φ
    ε
    ε
    ϝ
    ʂ
    ɹ

    View Slide

  66. ϝιου උߟ
    ࢦఆͷϖʔδʹҠಈ *BN0O1BHF l63-z

    BDDFQUBODFTVJUFZNM
    ʹࢦఆͨ͠63-ʹ௥Ճ͞
    ΕͯΞΫηεɻ
    ϖʔδʹࢦఆͷจࣈ͕͋
    Δ͔
    *TFF lจࣈྻz

    *TFF lจࣈྻz lཁ
    ૉz

    *DBO4FF lจࣈྻz

    DBOΛ͚ͭΔͱݟ͔ͭΒ
    ͳͯ͘΋ςετ͕ࢭ·Β
    ͳ͍
    ϖʔδʹࢦఆͷจࣈ͕ͳ
    ͍͔
    *EPOU4FF lจࣈྻz

    *EPOU4FF lจࣈྻz
    lཁૉz

    *DBOU4FF lจࣈྻz

    DBOΛ͚ͭΔͱݟ͔ͭΒ
    ͳͯ͘΋ςετ͕ࢭ·Β
    ͳ͍
    ΫϦοΫ
    *DMJDL lϩάΠϯz

    *DMJDL lMPHJOz

    จࣈྻ 9QBUI $44
    4FMFDUPSͰࢦఆ
    Α͘࢖͏ϝιου

    View Slide

  67. ϝιου උߟ
    ςΩετϘοΫεʹॻ͘
    *pMM'JFME lOBNFz
    lWBMVFz

    *pMM'JFME lOBNFz
    lWBMVFz

    ϑΟʔϧυ
    ໊ 9QBUI $444FMFDUPS
    Ͱࢦఆ
    ϥδΦϘλϯબ୒
    *
    DIFDL0QUJPO lOBNFz
    lWBMVFz

    *
    ϑΟʔϧυ
    ໊ 9QBUI $444FMFDUPS
    Ͱࢦఆ
    ηϨΫτϘοΫεɺ
    νΣοΫϘοΫεબ୒
    *
    TFMFDU0QUJPO lOBNFz
    lWBMVFz

    *
    ϑΟʔϧυ
    ໊ 9QBUI $444FMFDUPS
    Ͱࢦఆ
    ·ͱΊͯϑΥʔϜૹ৴
    *
    TVCNJU'PSN bGPSN`


    ϑΟʔϧυ
    ໊ 9QBUI $444FMFDUPS
    Ͱࢦఆ
    Α͘࢖͏ϝιουʢFormʣ

    View Slide

  68. ϝιου උߟ
    %#ʹࢦఆͷσʔλ͕͋
    Δ͔֬ೝ
    *TFF*O%BUBCBTF bςʔϒϧ
    ໊`

    DBOΛ͚ͭΔͱݟ͔ͭΒ
    ͳͯ͘΋ςετ͕ࢭ·Β
    ͳ͍
    %#ʹࢦఆͷσʔλ͕ͳ
    ͍͔֬ೝ
    *EPOU4FF*O%BUBCBTF bςʔ
    ϒϧ໊`

    DBOΛ͚ͭΔͱݟ͔ͭͬ
    ͯ΋ςετ͕ࢭ·Βͳ͍
    σʔλΛొ࿥͢Δ *IBWF*O%BUBCBTF bςʔϒϧ
    ໊`

    ςετσʔλ࡞੒࣌ʹ
    σʔλΛऔಘ͢Δ
    *HSBC'SPN%BUBCBTF
    bςʔϒϧ໊` bऔಘϑΟʔϧυ໊`


    Α͘࢖͏ϝιουʢDBʣ

    View Slide

  69. 2.CodeceptionͰͷςετ࣮૷
    /**
    * ొ࿥ςετ
    *
    * @param AcceptanceTester $I
    */
    public function registerTest(AcceptanceTester $I)
    {
    $I->wantToTest('ొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    $I->canSeeInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    ]);
    }

    View Slide

  70. /**
    * ొ࿥ςετ
    *
    * @param AcceptanceTester $I
    */
    public function registerTest(AcceptanceTester $I)
    {
    $I->wantToTest('ొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    $I->canSeeInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    ]);
    }
    2.CodeceptionͰͷςετ࣮૷
    JElUJUMFzʹʰ͓໰͍߹Θͤʱ
    ͱग़ྗ͞Ε͍ͯΔ͔ʁ

    View Slide

  71. /**
    * ొ࿥ςετ
    *
    * @param AcceptanceTester $I
    */
    public function registerTest(AcceptanceTester $I)
    {
    $I->wantToTest('ొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    $I->canSeeInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    ]);
    }
    2.CodeceptionͰͷςετ࣮૷
    [email protected]ʹʰ͢Έͩɹ͍ͬ΃͍ʱ
    Λೖྗ͢Δ

    View Slide

  72. /**
    * ొ࿥ςετ
    *
    * @param AcceptanceTester $I
    */
    public function registerTest(AcceptanceTester $I)
    {
    $I->wantToTest('ొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͓໰͍߹Θͤ׬ྃ͠·ͨ͠ɻ', '#title');
    $I->canSeeInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    ]);
    }
    2.CodeceptionͰͷςετ࣮૷
    l*ORVJSZzςʔϒϧʹ
    ࢦఆͷ಺༰Ͱొ࿥͞Εͨ

    σʔλ͕͋Δ͔֬ೝ

    View Slide

  73. id, classΛద੾ʹηοτ
    2.CodeceptionͰͷςετ࣮૷
    CodeceptionͰͷςετָ͕ʹʂ

    View Slide

  74. Conclusion
    • ઃఆϑΝΠϧͰɺFWɾϒϥ΢βͳͲΛઃఆ
    • Functional, Acceptance͸ςετͷॻ͖ํతʹ͸΄΅ಉ͡
    • Functional͸WebαʔόΛհ͞ͳ͍
    • ϒϥ΢βʹΑΓͰ͖ͳ͍͜ͱ΋͋Δ
    • CeptΑΓ΋Cest͕Φεεϝ
    • class, idΛద੾ʹηοτ͢Δͱςετ͠΍͍͢

    View Slide

  75. Codeception Tips
    ΋ͬͱ஥ྑ͘͢ΔͨΊͷ

    View Slide

  76. env
    3.Codeception Tips

    View Slide

  77. envͰ࣮ߦ؀ڥΛ੾Γସ͑

    View Slide

  78. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    ࢦఆͨ͠಺༰Ͱ্ॻ͖
    ͜͜Ͱ͸CSPXTFSΛpSFGPYʹ্ॻ͖
    3.Codeception Tips

    View Slide

  79. $ vendor/bin/codecept run acceptance —env=firefox
    ؀ڥ੾Γସ͑
    3.Codeception Tips

    View Slide

  80. /**
    * @param AcceptanceTester $I
    * @env firefox
    * @env chrome
    */
    public function tryToTest(AcceptanceTester $I)
    {
    // env=firefox or chrome͚ͩςετ
    }
    ΞϊςʔγϣϯͰ؀ڥΛࢦఆ
    3.Codeception Tips

    View Slide

  81. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    - Db:
    dsn: 'sqlite:var/data.sqlite'
    user: ''
    password: ''
    populate: true
    dump: 'tests/_data/dump.sql'
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    window_size: 1024x768
    3.Codeception Tips
    ΢Οϯυ΢αΠζมߋ

    View Slide

  82. disabled
    3.Codeception Tips

    View Slide

  83. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    phpbrowser:
    modules:
    enabled:
    - PhpBrowser:
    url: http://localhost:8000
    ͜Εͩͱ--env=phpbrowserͰΤϥʔʂ
    3.Codeception Tips

    View Slide

  84. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    phpbrowser:
    modules:
    enabled:
    - PhpBrowser:
    url: http://localhost:8000
    ͜Εͩͱ--env=phpbrowserͰΤϥʔʂ
    ͲͪΒͷϒϥ΢βͰςετ͢Ε͹

    Α͍͔Θ͔Βͳ͘ͳ͍ͬͯΔɻ
    3.Codeception Tips

    View Slide

  85. actor: AcceptanceTester
    modules:
    enabled:
    - WebDriver:
    url: http://localhost:8000
    browser: phantomjs
    - \Helper\Acceptance
    env:
    firefox:
    modules:
    config:
    WebDriver:
    browser: firefox
    phpbrowser:
    modules:
    disabled:
    - WebDriver
    enabled:
    - PhpBrowser:
    url: http://localhost:8000
    EJTBCMFEͰແޮԽ
    3.Codeception Tips

    View Slide

  86. CSSηϨΫλͷௐ΂ํ
    3.Codeception Tips

    View Slide

  87. 3.Codeception Tips

    View Slide

  88. 3.Codeception Tips
    ͜͜ͷCSSηϨΫλ͕Θ͔Βͳ͍

    View Slide

  89. 3.Codeception Tips
    CSSηϨΫλͷίϐʔ͕Մೳ

    View Slide

  90. 3.Codeception Tips
    $$(‘[ηϨΫλ]’); Ͱݕূ

    View Slide

  91. લɾޙॲཧϝιου
    3.Codeception Tips

    View Slide

  92. /**
    * ॏෳొ࿥ςετ
    * @param AcceptanceTester $I
    * @before createData
    * @after afterMethod
    */
    public function duplicateTest(AcceptanceTester $I)
    {
    $I->wantToTest('ॏෳొ࿥ςετ');
    $I->canSee('͓໰͍߹Θͤ', '#title');
    $I->fillField('#inquiry_name', '͢Έͩɹ͍ͬ΃͍');
    $I->fillField('#inquiry_email', '[email protected]');
    $I->fillField('#inquiry_question', '͓໰͍߹Θͤ಺༰');
    $I->click('ૹ৴');
    $I->canSee('͜ͷϝʔϧΞυϨε͸͢Ͱʹ࢖༻͞Ε͍ͯ·͢');
    }
    3.Codeception Tips

    View Slide

  93. /**
    * ॏෳςετ༻ͷσʔλΛ࡞੒͢Δ
    *
    * @param AcceptanceTester $I
    */
    protected function createData(AcceptanceTester $I)
    {
    $I->haveInDatabase('inquiry', [
    'name' => '͢Έͩɹ͍ͬ΃͍',
    'email' => '[email protected]',
    'question' => '͓໰͍߹Θͤ಺༰',
    'created_at' => \Carbon\Carbon::now()
    ]);
    }
    3.Codeception Tips
    લɾޙॲཧ༻ϝιου͸”protected”

    View Slide

  94. @CFGPSF

    !CFGPSFͭΊ
    !BGUFSͭΊ
    3.Codeception Tips
    @BGUFS

    !CFGPSFͭΊ
    !BGUFSͭΊ
    ςετϝιου

    View Slide

  95. Conclusion
    • envΛࢦఆ͢Δ͜ͱͰɺϒϥ΢βͳͲ؀ڥΛ੾
    Γସ͑
    • @before, @afterΛઃఆͯ͠ɺಠࣗͷલɾޙॲ
    ཧΛૠೖ
    • CSSηϨΫλͰࠔͬͨΒChrome։ൃπʔϧʂ

    View Slide

  96. CodeceptionͱҰॹʹ

    ςετͱ஥ྑ͘͠Α͏ʂ

    View Slide

  97. ͝੩ௌ

    ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide