![](https://habrastorage.org/webt/6i/tn/qr/6itnqr2hvow7-env6jpt-ro2odi.jpeg)
2018幎ã«æ³šç®ãã䟡å€ã®ããJSãããžã§ã¯ãã§æãåºã䜿çšãããŠãããã¹ãããŒã«ã®æŠèŠãã玹ä»ããŸãã
æ±çšãã¹ãããŒã«
âJsdom
Jsdomã¯ãWHATWG DOMããã³HTMLæšæºã®JavaScriptå®è£ ã§ãã èšãæããã°ãjsdomã¯éåžžã®JS以å€ã®ããšãè¡ããã«ãã©ãŠã¶ãŒç°å¢ãæš¡å£ããŸãã
ãã®ãããªç°å¢ã§ã¯ããã¹ããéåžžã«è¿ éã«å®è¡ã§ããŸãã jsdomã®æ¬ ç¹ã¯ããã¹ãŠãå®éã®ãã©ãŠã¶ãŒã®å€éšã§ã·ãã¥ã¬ãŒãã§ããããã§ã¯ãªãïŒããšãã°ããã®ã¢ãããŒãã§ã¯ã¹ã¯ãªãŒã³ã·ã§ãããæ®ãããšãã§ããªãïŒããããã®ããŒã«ã䜿çšãããšãã¹ãã®å¯èœæ§ãå¶éãããŸãã
JSã³ãã¥ããã£ãjsdomã«éäžçã«åãçµãã§ããããã®ããŒã«ãæ¹åããŠããããšã«èšåãã䟡å€ããããŸãã çŸåšã®ããŒãžã§ã³ã®æ©èœã¯ãå®éã®ãã©ãŠã¶ã«éåžžã«è¿ããã®ã§ãã
âã€ã¹ã¿ã³ããŒã«
ã€ã¹ã¿ã³ããŒã«ã®ããŒã«ã䜿çšãããšãåäœãã¹ãã§ã³ãŒãã«ãã¬ããžãåæã§ããŸãã 圌ã¯è©³çŽ°ãªã¬ããŒãã衚瀺ããŸãããã®ã¬ããŒãã«çŠç¹ãåœãŠããšããããžã§ã¯ãã§ãŸã ãã¹ããããŠããªããã®ãæ£ç¢ºã«ææ¡ããç¶æ³ãæ¹åããããã«å¿ èŠãªäœæ¥éãè©äŸ¡ã§ããŸãã
âã«ã«ã
Karmaã䜿çšãããšããã©ãŠã¶ãŒããã³jsdomãå«ããã©ãŠã¶ãŒã«äŒŒãç°å¢ã§ãã¹ããå®è¡ã§ããŸãã
Karmaã¯ããã¹ããå®è¡ãããç°å¢ã§ç¹å¥ãªWebããŒãžãæã€ãã¹ããµãŒããŒããµããŒãããŸãã ãã®ããŒãžã¯å€ãã®ãã©ãŠã¶ã§éãããšãã§ããŸãã ããã«ãããã¯BrowserStackãªã©ã®ãµãŒãã¹ã䜿çšããŠãã¹ãããªã¢ãŒãã§å®è¡ã§ããããšãæå³ããŸãã
âãã£ã€
ãã£ã€ã¯ãæã人æ°ã®ããã¯ã¬ãŒã äœæã©ã€ãã©ãªã§ãã
âäºæããªã
Unexpectedã¯ãæ§æãChaiãšãããã«ç°ãªãã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªã§ãã ããã«ããã®ã©ã€ãã©ãªã¯æ¡åŒµå¯èœã§ãããããããé«åºŠãªã¹ããŒãã¡ã³ããäœæã§ããŸãã ç¹ã«ã unexpected-reactãªã©ã®äºæããªãããšã«åºã¥ããŠã©ã€ãã©ãªã䜿çšããããšã«ã€ããŠè©±ããŠããŸãã詳现ã«ã€ããŠã¯ããã¡ããåç §ããŠãã ããã
âSinon.JS
Sinon.JSã¯ãããããã¹ãã€ãã¹ã¿ããããã³ã¢ãã¯ã¢ããã䜿çšããŠJavaScriptãããžã§ã¯ãããã¹ãããæ©èœãæäŸãã匷åãªã¹ã¿ã³ãã¢ãã³ã·ã¹ãã ã§ãã ãã®ã·ã¹ãã ã¯ãåäœãã¹ãã®ãã¬ãŒã ã¯ãŒã¯ãšé£æºã§ããŸãã
âTestdouble.js
Testdouble.jsã¯ãSinonãšåãæ©èœãå®è¡ããããŸã人æ°ã®ãªãã©ã€ãã©ãªã§ãããéçºè ã¯ãSinonãããåæ§ã®åé¡ããããã解決ãããšè¿°ã¹ãŠããŸãã ããã¯ãäžé£ã®æ©èœãããã€ãã®ã¢ãŒããã¯ãã£æ©èœãããã³ãã¹ããžã®ã¢ãããŒãã«ãã£ãŠåºå¥ãããå€ãã®ç¶æ³ã§åœ¹ç«ã€ããšãã§ããŸãã testdoubleã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ã ã ãã¡ã ã ãã¡ããã芧ãã ãã ã
âã¯ã©ããŒ
Wallabyã泚ç®ãã¹ãããŒã«ã§ãã ããã¯ç¡æã§ã¯ãããŸããããå€ãã®ãŠãŒã¶ãŒã¯ã圌ãããããæ±ãããéã®äŸ¡å€ããããšä¿¡ããŠããŸãã Wallabyã¯IDEã§å®è¡ããïŒãã¹ãŠã®äž»èŠãªIDEããµããŒããããŠããŸãïŒãã³ãŒãã®å€æŽãšäžèŽãããã¹ããå®è¡ããŸãã ãã¹ãçµæã®ããŒã¿ã¯ãã³ãŒããšåãå Žæã«ãªã¢ã«ã¿ã€ã ã§è¡šç€ºãããŸãã
![](https://habrastorage.org/getpro/habr/post_images/cbc/cd4/fd6/cbccd4fd6dbb500b91b01c9ad21bf8ae.png)
ã¯ã©ããŒ
âãã¥ãŠãª
Cucumberã¯ãéçºè ãBDDã§ãã¹ããäœæããã®ã«åœ¹ç«ã¡ãŸãã ãã¹ãã¯ãGherkinæ§æã䜿çšããŠæºåãããåãå ¥ãåºæºãã¡ã€ã«ãšãããã«å¯Ÿå¿ããå®éã®ãã¹ããã¡ã€ã«ã«åããããŸãã ãã¹ãã¯ãJSãå«ããã¬ãŒã ã¯ãŒã¯ããµããŒãããããŸããŸãªèšèªã§äœæã§ããŸãã
like-article.feature
äŸã次ã«ç€ºã
like-article.feature
ã
Feature: A reader can share an article to social networks As a reader I want to share articles So that I can notify my friends about an article I liked Scenario: An article was opened Given I'm inside an article When I share the article Then the article should change to a "shared" state
like-article.steps.js
äŸã次ã«ç€ºã
like-article.steps.js
ã
module.exports = function() { this.Given(/^I'm inside an article$/, function(callback) { // }) this.When(/^I share the article$/, function(callback) { // }) this.Then(/^the article should change to a "shared" state$/, function(callback) { // }) }
å€ãã®ããŒã ã¯ããã®æ§æãTDDããã䟿å©ã ãšæããŠããŸãã
ãŠãããããã³çµ±åãã¹ããã¬ãŒã ã¯ãŒã¯
é©åãªãã¹ãããŒã«ãæ€çŽ¢ãããšãã«ããããæåã«éžæããå¿ èŠãããã®ã¯ãããããµããŒããããã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã§ãã ç¬èªã®ããŒã«ãå¿ èŠã«ãªããŸã§ãéžæãããã¬ãŒã ã¯ãŒã¯ãæäŸãããã®ã䜿çšããããšããå§ãããŸãã äžè¬çãªã¬ã€ãã©ã€ã³ã次ã«ç€ºããŸãã
- ããçš®ã®åºçºç¹ãæ¢ããŠããå ŽåããŸãã¯å€§èŠæš¡ãªãããžã§ã¯ãã«è¿
éãªãã¬ãŒã ã¯ãŒã¯ãå¿
èŠãªå Žåã¯ãJestãéžæããŠãã ããã
- æ§æã®æè»æ§ãšæ¡åŒµæ§ã«é¢å¿ãããå Žåã¯ãMochaãã芧ãã ããã
- ã·ã³ãã«ã«ãããå Žåã¯ãAvaãè©ŠããŠãã ããã
- äœã¬ãã«ã®ãã¹ãã¡ã«ããºã ãå¶åŸ¡ããå¿
èŠãããå Žåã¯ãããŒãã«æ³šæããŠãã ããã
ãã®ã«ããŽãªã§æãæåãªããŒã«ã®æŠèŠã以äžã«ç€ºããŸãã
âã¢ã«
Mochaã¯çŸåšãæãåºã䜿çšãããŠããã©ã€ãã©ãªã§ãã åŸã§èª¬æããJasmineã©ã€ãã©ãªãšã¯ç°ãªãããã®ã©ã€ãã©ãªã¯ããµãŒãããŒãã£ã®ã¢ãµãŒã·ã§ã³ããŒã«ãšå€éšããŒã«ã䜿çšããŠãã·ãã¥ã¬ãŒã·ã§ã³ãšã¹ãã€æ©èœïŒéåžžã¯EnzymeãšChaiïŒãäœæããŸãã ããã¯ãMochaãã»ããã¢ããããéã®ããã€ãã®è¿œå ã®å°é£æ§ãšãçµæã®æ©èœãç°ãªãã©ã€ãã©ãªéã§å ±æããããšããäºå®ãæå³ããŸããããã®ãã¬ãŒã ã¯ãŒã¯ã¯Jasmineãšæ¯èŒããŠããæè»ã§æ¡åŒµå¯èœã§ãã
ããšãã°ã ç¹å¥ãªã¹ããŒãã¡ã³ãããžãã¯ãå¿ èŠãªå Žåã¯ãChaiããã©ãŒã¯ããŠãããŒã«ããã¯ã¹å ã®Chaiã®ã¿ãç¬èªã®ã¹ããŒãã¡ã³ãã©ã€ãã©ãªã«çœ®ãæããããšãã§ããŸãã ããã¯ãžã£ã¹ãã³ã§è¡ãããšãã§ããŸãããã¢ã«ã§ã¯ãã®å€åã¯ããæçœã«ãªããŸãã
以äžã¯ãæ°ãä»ããã¹ãMochaã®æ©èœã®äžéšã§ãã
- ã³ãã¥ããã£ã ã³ãã¥ããã£ã¯ãç¬èªã®ãã¹ãã·ããªãªã§äœ¿çšããããã®å€ãã®ãã©ã°ã€ã³ãšæ¡åŒµæ©èœãéçºããŸããã
- æ¡åŒµæ§ã Sinonãªã©ãMochaã§äœ¿çšã§ãããã©ã°ã€ã³ãæ¡åŒµæ©èœãããã³ã©ã€ãã©ãªã«ã¯ãJasmineã«ã¯ãªãæ©èœãå«ãŸããŠããŸãã
- ã°ããŒãã«å€æ°ã Mochaã¯ãããã©ã«ãã§ã¯ãã°ããŒãã«ãã¥ãŒã§ãã¹ãæ§é ãäœæããŸãã ããã¯ãã¢ã«ãšãžã£ã¹ãã³ãåºå¥ããã¹ããŒãã¡ã³ããæš¡å£ãã¹ãã€æ©èœã«ã¯é©çšãããŸããã ã°ããŒãã«ãªããžã§ã¯ãã®ãã®ãããªäžåäžæ§ã¯ãäžéšã®äººã«ãšã£ãŠã¯éè«ççãªããã§ãã
âJest
Jestã¯ãFacebookãéçºãããã¹ããã¬ãŒã ã¯ãŒã¯ã§ãã ããã¯ãžã£ã¹ãã³ã«åºã¥ããŠããŸãã ä»æ¥ãFacebookã¯æ©èœã®ã»ãšãã©ãåèšèšããããã«åºã¥ããŠå€ãã®æ°æ©èœãäœæããŸããã
Jestã«é¢ããèšå€§ãªè³æãåæããåŸãå€ãã®éçºè ããã®ãã¬ãŒã ã¯ãŒã¯ã®é床ãšå©äŸ¿æ§ã«æéãåããŠãããšçµè«ä»ããããšãã§ããŸãã Jestã®æ©èœã«ã¯æ¬¡ã®ãã®ããããŸãã
- ããã©ãŒãã³ã¹ã ãŸããJestãã¬ãŒã ã¯ãŒã¯ã¯ãã€ã³ããªãžã§ã³ããªäžŠåãã¹ãã¡ã«ããºã ã®å®è£
ã«ãããå€ãã®ãã¹ããã¡ã€ã«ãæã€å€§èŠæš¡ãããžã§ã¯ããžã®ã¢ããªã±ãŒã·ã§ã³ã§æéãšããŠèªèãããŠããããšã«èšåãã䟡å€ããããŸãã ããã«ã ãã ã ãã ã ãã ã ãã ã ããã§ã®çµè«ãè£ä»ããè³æ㧠ãç§ãã¡èªèº«ã®çµéšã§ããã確èªã§ããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ Jestã€ã³ã¿ãŒãã§ãŒã¹ã¯æ確ã§äŸ¿å©ã§ãã
- ä»äºãå§ããã®ã«å¿
èŠãªãã¹ãŠã®ååšã Jestã«ã¯ãã¢ãµãŒã·ã§ã³ãã¹ãã€ãŠã§ã¢ãããã³ã·ãã¥ã¬ãŒã·ã§ã³ããŒã«ãä»å±ããŠããããããã¯åãããšãè¡ãSinonã®ãããªåå¥ã®ã©ã€ãã©ãªãšåçã§ãã æšæºæ©èœãé©åã§ã¯ãªããç¹å¥ãªãã®ãå¿
èŠãªå Žåã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšã§ããŸãã
- ã°ããŒãã«å€æ°ã Jasmineãšåæ§ã«ãJestã¯ããã©ã«ãã§ã°ããŒãã«ãã¹ãå€æ°ãäœæãããããæ瀺çã«æ¥ç¶ããå¿
èŠã¯ãããŸããã åæ§ã®ã¢ãããŒãã¯ãã¹ãã®æè»æ§ãšãã¹ãã®ç®¡çèœåãæãªãããããã®æ©èœã¯æ¬ ç¹ãšããŠèªèãããŸãããã»ãšãã©ã®å Žåãäœæ¥ãåçŽåããŸãã
// "describe" // : // import { describe } from 'jest' // import { describe } from 'jasmine' describe('calculator', function() { ... })
- ã¹ãããã·ã§ããã䜿çšãããã¹ãã Facebookã«ãã£ãŠéçºãããjest-snapshotã©ã€ãã©ãªããããŸãã ã¹ãããã·ã§ãããã¹ãã䜿çšããŠãã¹ããæŽçããããã«ãããšãã°é©åãªãã©ã°ã€ã³ãä»ããŠãä»ã®ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšã§ããŸãã
- ã¢ãžã¥ãŒã«ã®æ¹åãããã·ãã¥ã¬ãŒã·ã§ã³ã Jestã¯ãéããã¢ãžã¥ãŒã«ã®ã·ãã¥ã¬ãŒã·ã§ã³ãç°¡çŽ åãããã¹ãã®é床ãåäžãããŸãã ããšãã°ãJestããŒã«ã䜿çšããŠããããã¯ãŒã¯èŠæ±ãå®è¡ããç¹å®ã®ãµãŒãã¹ã®ãã¹ã¿ãããäœæã§ããŸããããã«ãããèŠæ±ã®å®éã®å®è¡ã«æ¯ã¹ãŠã¯ããã«é«éã«ãªããŸãã
- ãã¹ãã«ããã³ãŒãã«ãã¬ããžã®åæã Jestã«ã¯ã ã€ã¹ã¿ã³ããŒã«ã«åºã¥ããã¹ãã§ã³ãŒãã«ãã¬ããžãåæããããã®åŒ·åã§é«éãªçµã¿èŸŒã¿ããŒã«ããããŸãã
- ä¿¡é Œæ§ Jestã¯æ¯èŒçæ°ããã©ã€ãã©ãªã§ããã2017幎ã«ã¯ãã®å®å®æ§ã«ã€ããŠå€ãã®äœæ¥ãè¡ãããçŸåšã§ã¯ä¿¡é Œã§ãããšèŠãªãããããã«ãªããŸããã çŸåšãããšãã°ããã¹ãŠã®äž»èŠãªIDEããµããŒãããŠããŸãã
- éçºã ãããžã§ã¯ãã®éçºäžãã·ã¹ãã ã¯ãã¡ã€ã«ã®å€æŽãç£èŠããäžå¿
èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããªãããããã¹ãã¯éåžžã«è¿
éã«å®è¡ãããŸãã
âãžã£ã¹ãã³
Jasmineã¯ãJestã®ããŒã¹ãšãªã£ãŠãããã¹ããã¬ãŒã ã¯ãŒã¯ã§ãã ãžã§ã¹ããããå Žå-誰ããžã£ã¹ãã³ãå¿ èŠãšããå¯èœæ§ããããŸããïŒ åé¡ã¯ãJasmineãJestãããæ©ãç»å Žããããšãèšå€§ãªæ°ã®åºçç©ããããå€ãã®ããŒã«ãäœæãããŠããããšã§ãã
ããã«ãAngularã®äœæè ã¯Jestã§ã¯ãªãJasmineã䜿çšããããšãæšå¥šããŠããŸãããJestã¯Angularãããžã§ã¯ãã®ãã¹ãã«æé©ã§ãããå€ãã®äººãããã䜿çšããŠããŸãã Jasmineã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- ä»äºãå§ããã®ã«å¿
èŠãªãã¹ãŠã®ååšã Jasmineã«ã¯ããã¹ããéå§ããããã«å¿
èŠãªãã®ããã¹ãŠå«ãŸããŠããŸãã
- ã°ããŒãã«å€æ°ã ãžã£ã¹ãã³ã§ã¯ããã¹ãŠã®éèŠãªãã¹ãããŒã«ãã°ããŒãã«ãªç¯å²ã§å©çšå¯èœã§ãã
- ã³ãã¥ããã£ã ãžã£ã¹ãã³ã¯2009幎ããååšããŠããããã®éã«ãã®ãã¬ãŒã ã¯ãŒã¯ã«é¢ããå€ãã®åºçç©ãå
¬éãããŠããŸãã ããã«ãå€ãã®JasmineããŒã¹ã®ããŒã«ãäœæãããŠããŸãã
- è§åºŠãµããŒãã Angularã®ãã¹ãŠã®ããŒãžã§ã³ã¯JasmineããµããŒãããAngularã®å
¬åŒããã¥ã¡ã³ããæšå¥šããã®ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
vaAva
Avaã¯ã䞊åãã¹ãå®è¡ããµããŒãããæå°éã®ãã¹ãã©ã€ãã©ãªã§ãã äž»ãªç¹åŸŽã¯æ¬¡ã®ãšããã§ãã
- ä»äºãå§ããã®ã«å¿
èŠãªãã¹ãŠã®ååšã Avaã«ã¯ããã¹ããéå§ããããã«å¿
èŠãªãã¹ãŠãä»å±ããŠããŸãïŒAvaã«ç°¡åã«çµ±åã§ããã¹ãã€æ©èœãšã·ãã¥ã¬ãŒã·ã§ã³ãäœæããããã®ããŒã«ã«å ããŠïŒã Avaãã¹ãã¯Node.jsã§å®è¡ã§ããŸãã ããã§ã¯ã次ã®æ§æã䜿çšããŠããã¹ãããã³ãã«ãã¹ããŒãã¡ã³ãã®æ§é ã圢æããŸãã
import test from 'ava' test('arrays are equal', t => { t.deepEqual([1, 2], [1, 2]) })
- ã°ããŒãã«å€æ°ã äžèšã®ã³ãŒããã©ã°ã¡ã³ããããããããã«ãã©ã€ãã©ãªã¯ã°ããŒãã«å€æ°ãäœæããŸãããã€ãŸããéçºè
ã¯äœãèµ·ãã£ãŠããããããé©åã«å¶åŸ¡ã§ããŸãã
- ã·ã³ãã«ã Avaã®æ§é ãšã¹ããŒãã¡ã³ãã¢ãã«ã¯åçŽã§ãã é床ã«è€éãªAPIã¯ãããŸããããå€ãã®é«åºŠãªæ©èœããµããŒãããŠããŸãã
- éçºã ã·ã¹ãã ã¯å€æŽãããã³ãŒãããã°ãããã¹ãã§ãããããAvaã¯éçºããã»ã¹ã§ã®äœ¿çšã«äŸ¿å©ã§ã...
- ã¹ããŒãã ãã¹ãã¯ãå¥ã
ã®Node.jsããã»ã¹ãšããŠäžŠè¡ããŠå®è¡ãããŸãã
- ã¹ãããã·ã§ããã䜿çšãããã¹ãã ãã®æ©èœã¯ããã¬ãŒã ã¯ãŒã¯ã®äžéšãšããŠãµããŒããããŠããŸãã
âããŒã
ããŒãã¯ãããã§èª¬æãããã¹ããã¬ãŒã ã¯ãŒã¯ã®äžã§æãåçŽã§ãå°ããç解ããããAPIãåããŠããŸãã ããã¯Node.jsã§æ©èœããéåžžã®JSãã¡ã€ã«ã§ãã ããŒãã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- ã·ã³ãã«ã ãã¹ããšã¢ãµãŒã·ã§ã³ã®æå°éã®æ§é ãè€éãªAPIã®æ¬ åŠã ããã§ã¯ãã¹ãŠãAvaãããç°¡åã§ãã
- ã°ããŒãã«å€æ°ã ã°ããŒãã«å€æ°ã¯äœæãããŸãããããã«ããããã¹ããããé©åã«å¶åŸ¡ã§ããŸãã
- äžè¬çãªç¶æ
ã®æ¬ åŠã ããŒãã¯
beforeEach
ãããªé¢æ°ã®äœ¿çšãæè¿ããŸãããããã¯ãåäœãã¹ããšãã¹ãããã»ã¹ãæ倧éã«å¶åŸ¡ããããšããèŠæãåæ ããŠããŸãã
- ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã¯å¿
èŠãããŸããã ããŒãã©ã€ãã©ãªã¯ãJSãå®è¡ã§ããå Žæã§ããã°ã©ãã§ãæ©èœããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¹ãããŒã«
ãŸãã ãããšããã§ã¯ãã¯ãã¹ãã©ãããã©ãŒã ããã³ã¯ãã¹ãã©ãŠã¶ãã¹ãã®å®è¡ã«äœ¿çšã§ããæ©èœãæã€ãµãŒãã¹ãããã€ããŒã«é¢ããåªããè³æãèŠã€ããããšãã§ããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã¹ãããããã®æ¢åã®ããŒã«ã¯äºãã«éåžžã«ç°ãªããããã€ã³ã¿ãŒãã§ã€ã¹ã®ãã¹ã察象ãéžæããåã«ãå®éšããããšããå§ãããŸãã äžèšã§èšãã°ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã¹ãããããã®ç°å¢ãéžæãã人åãã®äžè¬çãªæšå¥šäºé ãè¡šãããã«ã次ã®ããã«èšããŸãã
- ã·ã³ãã«ã§ä¿¡é Œæ§ã®é«ããŠãããŒãµã«ããŒã«ãæ¢ããŠããå ŽåããŸãã¯é©åãªãã¬ãŒã ã¯ãŒã¯ãèŠã€ããããã®åºçºç¹ãæ¢ããŠããå Žåã¯ãTestCafeãè©ŠããŠãã ããã
- æ代ã«è¿œãã€ããéçºè
ã³ãã¥ããã£ã®ãµããŒãã楜ãã¿ããå Žåã¯ãWebdriverIOãã芧ãã ããã
- ãã©ãŠã¶ãŒéã®ãµããŒãã«é¢å¿ããªãå Žåã¯ãPuppeteerã䜿çšããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã«ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®è€éãªã·ããªãªããããŒãžããã«ãã©ãŒã ãããã²ãŒã·ã§ã³èŠçŽ ãªã©ã®è€éãªã€ã³ã¿ãŒãã§ã€ã¹ããªãå Žåã¯ãCasperã®ãããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãªãã§ã¯ãã¹ãã©ãŠã¶ããŒã«ã䜿çšããŸãã
âã»ã¬ã³
Seleniumã䜿çšãããšããã©ãŠã¶ãšã®å¯Ÿè©±ãèªååããŠããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãã§ããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãã¹ãå°çšã«èšèšããããã®ã§ã¯ãªããããŸããŸãªç®çã§ãã©ãŠã¶ãå¶åŸ¡ãããœãããŠã§ã¢ã¡ã«ããºã ã䜿çšããŠãã©ãŠã¶ã§ã®ãŠãŒã¶ãŒã®åäœãã·ãã¥ã¬ãŒããããµãŒããŒãæäŸã§ããŸãã
Seleniumã®æ©èœã¯ãå€ãã®ããã°ã©ãã³ã°èšèªã䜿çšããŠããŸããŸãªæ¹æ³ã§å¶åŸ¡ã§ããŸããäžéšã®ããŒã«ã䜿çšãããšãããã°ã©ãã³ã°ãªãã§Seleniumãæäœã§ããŸãã
ãã ããSeleniumãµãŒããŒãSelenium WebDriverã䜿çšããŠç®¡çãããæ§æã«é¢å¿ããããŸããããã¯ãNode.jsãšãã©ãŠã¶ãŒãå¶åŸ¡ãããµãŒããŒéã®å¯Ÿè©±ã®ã¬ã€ã€ãŒãšããŠæ©èœããŸãã ã·ã¹ãã ã®ããŸããŸãªéšåã®çžäºäœçšã¹ããŒã ã¯ã次ã®ããã«èª¬æã§ããŸãã
Node.js <=> WebDriver <=> Selenium Server <=> FF/Chrome/IE/Safari
WebDriverã¯ããã¹ãã®ããã«éžæãããã¬ãŒã ã¯ãŒã¯ã«ã€ã³ããŒãã§ããŸãã ãã¹ãã¯ããã©ãŠã¶ãŒç®¡çæ©èœã䜿çšããŠäœæã§ããŸãã
describe('login form', () => { before(() => { return driver.navigate().to('http://path.to.test.app/') }) it('autocompletes the name field', () => { driver .findElement(By.css('.autocomplete')) .sendKeys('John') driver.wait(until.elementLocated(By.css('.suggestion'))) driver.findElement(By.css('.suggestion')).click() return driver .findElement(By.css('.autocomplete')) .getAttribute('value') .then(inputValue => { expect(inputValue).to.equal('John Doe') }) }) after(() => { return driver.quit() }) })
ãšããã§ãWebDriverèªäœã§ãã¹ããå®è¡ããããšãã§ããŸãã ãªãªãžãã«ã®åœ¢åŒã§WebDriverã䜿çšããããšãå§ããèè ã®æšå¥šäºé ããããŸãã
ãã ããWebDriverã®æ©èœãæ¡åŒµããã©ã€ãã©ãªãååšãããšããäºå®ãç¡èŠããããšã¯ã§ããŸãããWebDriverã®ãã©ãŒã¯ãŸãã¯ã©ãããŒã«ãã£ãŠæäŸãããŸãã
ã©ãããŒã©ã€ãã©ãªã®æ¬ ç¹ã¯ãã·ã¹ãã ãè€éã«ããããšã§ãã ãã©ãŒã¯ã®å€èŠ³ã¯æªãã§ãããªããªãããã©ãŒã¯ã«è²»ããããåªåã¯ãWebDriverèªäœã®éçºã«æè³ãããå¯èœæ§ãé«ãããã§ãã
ãã ããSeleniumã«ã€ããŠèšãã°ãå€ãã®äººã¯SeleniumãçŽæ¥äœ¿çšããªãããšã奜ã¿ãŸãã Seleniumã®æ©èœã䜿çšããŠããã©ã€ãã©ãªãã芧ãã ããã
ã¢ããŠã
Appiumã¯ãSelenium APIã«äŒŒãAPIãæäŸããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ã次ã®ããŒã«ã䜿çšããŠã¢ãã€ã«ãããžã§ã¯ãã®ãã¹ããæŽçããããã«èšèšãããŠããŸãã
- iOS 9.3以éã Appleã®XCUITest ã
- iOS 9.3ããåã Appleã®UIAutomation ã
- Android 4.2以éã Googleã®UiAutomator / UiAutomator2 ã
- Android 2.3以éã Googleããã®èšæž¬ ã ïŒèšè£
ãµããŒãã¯Selendroidãä»ããŠå®è£
ãããŸã ïŒã
- Windows Phone Microsoftã®WinAppDriver ã
ãããã£ãŠãSeleniumããŒã¹ã®ããŒã«ã䜿çšããå ŽåãAppiumã䜿çšããŠã¢ãã€ã«ãããžã§ã¯ãããã¹ãã§ããŸãã
å床åš
å床åšã¯ãAngularã«çŠç¹ãåœãŠãSeleniumã®ã©ãããŒã©ã€ãã©ãªã§ãã ãã®ã©ã€ãã©ãªã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- è§åºŠãµããŒãã å床åšã¯Angularã«çŠç¹ãåœãŠãŠããŸããããã®ã©ã€ãã©ãªã¯ä»ã®JSãã¬ãŒã ã¯ãŒã¯ã§æ£åžžã«äœ¿çšã§ããŸãã å
¬åŒã®Angular ããã¥ã¡ã³ãã¯ãã®ç¹å®ã®ã©ã€ãã©ãªãæšå¥šããŠããŸãã
- ãã°ã¬ããŒãã ã¬ããŒããäœæããããã®äŸ¿å©ãªã¡ã«ããºã ããããŸãã
- ã³ãã¥ããã£ãšãã¯ãããžãŒã TypeScriptãµããŒãã¯å床åšã§å©çšå¯èœã§ãã ãã®ã©ã€ãã©ãªã¯ã巚倧ãªAngularããŒã ã«ãã£ãŠéçºãããŸããã
WebdriverIO
WebdriverIOã¯ãSelenium WebDriveræ©èœã䜿çšããç¬èªã®ã¢ãããŒããæäŸããŸãã ãã®ã©ã€ãã©ãªã¯Node.jsçšã§ãã ãã®ãããžã§ã¯ãã®æ©èœã«ã¯æ¬¡ã®ãã®ããããŸãã
- æ§æ WebDriverIOã«ã¯ãéåžžã«ã·ã³ãã«ã§èªã¿ãããæ§ææ§é ããããŸãã
- æè»æ§ã WebDriverIOã¯ãæè»ã§æ¡åŒµå¯èœãªã©ã€ãã©ãªã§ãã
- ã³ãã¥ããã£ã ãã®ã©ã€ãã©ãªã¯ãWebDriverIOã®ç¯å²ãæ¡å€§ããããã®ãã©ã°ã€ã³ãšæ¡åŒµæ©èœãäœæããéçºè
ã®åªãããµããŒããšç±ççãªã³ãã¥ããã£ãæã£ãŠããŸãã
ãã€ããŠã©ãã
Nightwatchã«ã¯ãSelenium WebDriverãæäœããç¬èªã®ã¢ãããŒãããããŸãã ãã®ããŒã«ã¯ããµãŒããŒãã¢ãµãŒã·ã§ã³ããŒã«ãããŸããŸãªãµããŒãããŒã«ãåããç¬èªã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãæäŸããŸãã Nightwatchã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- æ çµã¿ Nightwatchã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ãšãšãã«ãç¬ç«ããããŒã«ãšããŠäœ¿çšã§ããŸããããã¯ãä»ã®ãã¯ãããžãŒã䜿çšããã«ããã®ããŒã«ã䜿çšããŠæ©èœãã¹ããå®è¡ããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
- æ§æ ãã€ããŠã©ããã«ã¯ãéåžžã«ã·ã³ãã«ã§èªã¿ãããæ§æããããŸãã
- ãµããŒããšãã¯ãããžãŒã TypeScriptã®ãµããŒãã¯ãããŸããã ãã®ã©ã€ãã©ãªã¯ãä»ã®ã©ã€ãã©ãªããããµããŒããããå°ãªããšããæããããããšã«æ³šæããŠãã ããã
TestCafe
TestCafeã¯ãSeleniumããŒã¹ã®ããŒã«ã®åªãã代æ¿æ段ã§ãã ãã®ã©ã€ãã©ãªã®ã³ãŒãã¯ã2016幎ã®çµããã«å ¬éãããŸããã ããã°ã©ãã³ã°ãå¿ èŠãšããªããã¹ãããŒã«ãæäŸããTestCafeã®ææçããŸã ããããšã«æ³šæããŠãã ããã ããšãã°ããããã¯ãã¹ããèšé²ããããã®ããŒã«ã§ãã ææçã¯ãŠãŒã¶ãŒãµããŒããæäŸããŸãã ã©ã€ãã©ãªã³ãŒããéãããåã«åºãããå€ãã®å€ãåºçç©ããããéããããã³ãŒãããã®æ¬ é¥ã§ãããšèŠãªãããããšã«æ³šæããå¿ èŠããããŸãã
TestCafeã¯JSã¹ã¯ãªãããšããŠããŒãžã«åã蟌ãŸããSeleniumã®ããã«ãã©ãŠã¶ãå¶åŸ¡ããŸããã ããã«ãããTestCafeãã¢ãã€ã«ãå«ãä»»æã®ãã©ãŠã¶ãŒã§å®è¡ã§ããJavaScriptã®åäœãå®å šã«å¶åŸ¡ã§ããŸãã
TestCafeã©ã€ãã©ãªã¯JavaScriptã§èšè¿°ãããŠããããã¹ãã«çŠç¹ãåœãŠãŠããŸãã çŸåšã¯å®å®ããŠãããååãªæ°ã®æ©äŒããããšèããããŠããŸãããçŸåšæŽ»æ³ãåããŠããŸãã äž»ãªæ©èœãæ€èšããŠãã ããã
- äœæ¥ç°å¢ã®ã¯ã€ãã¯ã»ããã¢ããã ãããããTestCafeã䜿çšããããã®äœæ¥ç°å¢ã®ç¹å¥ãªã»ããã¢ããã¯å¿
èŠãªããšèšããŸãã ãã©ãŠã¶ãéããŠãã¹ããéå§ããã ãã§ãã
- ããŸããŸãªãã©ãŠã¶ãŒã®ãµããŒãããã¹ãèªååã®ãã©ãããã©ãŒã ãµããŒãã TestCafeã¯å€ãã®ãã©ãŠã¶ãŒãšããã€ã¹ããµããŒãããããŸããŸãªããã€ã¹ãšãã©ãŠã¶ãŒãžã®ã¢ã¯ã»ã¹ãæäŸããSourceLabsãŸãã¯BrowserStackãã©ãããã©ãŒã ã§äœ¿çšã§ããŸãã ç¹ã«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãªãã§ChromeãšFirefoxã§ãã¹ããå®è¡ããããšã«ã€ããŠè©±ããŸãã
- 䞊åãã¹ãã TestCafeã¯ãè€æ°ã®ãã©ãŠã¶ãŒã€ã³ã¹ã¿ã³ã¹ã§åæã«ãã¹ããå®è¡ã§ããŸã ã ãã®ã¢ãããŒãã«ããããã¹ãæéã倧å¹
ã«ççž®ã§ããŸãã
- ãã°ã¬ããŒãã TestCafeã¯ããšã©ãŒãå ±åããããã®äŸ¿å©ãªããŒã«ãæäŸããŸãã
- çæ
ç³» TestCafeã¯ãç¬èªã®ãã¹ãæ§é ã䜿çšããŸãã ããã¯éåžžã«äŸ¿å©ã§ããç¹ã«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¹ãã¯éåžžââãä»ã®ãã¹ããšã¯å¥ã«å®è¡ãããŸããã 誰ãã奜ãããã§ã¯ãããŸãã ã
import { Selector } from 'testcafe'; fixture `Getting Started` .page `https://devexpress.github.io/testcafe/example` // test('My first test', async t => { await t .typeText('#developer-name', 'John Smith') .click('#submit-button') .expect(Selector('#article-header').innerText) .eql('Thank you, John Smith!') })
âãµã€ãã¬ã¹
ãµã€ãã¬ã¹ã¯TestCafeãšçŽæ¥ç«¶åããŠããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ã»ãŒåãããã«æ©èœããããŒãžã®ã³ãŒãã«ãã¹ããå°å ¥ããŸãããããçŸä»£çã§æè»ã§äŸ¿å©ãªæ¹æ³ã§ãã¹ããè©Šã¿ãŸãã ãµã€ãã¬ã¹ã¯ããæ°ããããã®ãã¬ãŒã ã¯ãŒã¯ã¯æè¿ ãã¯ããŒãºãããŒã¿ãããããªãã¯ããŒã¿ã«ç§»è¡ããŸããïŒ2017幎10æïŒãã å€ãã®äººããã§ã«ããã䜿çšããŠããŸãã ãµã€ãã¬ã¹ã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- ã¯ãã¹ãã©ãŠã¶ã®ãµããŒãã¯ãããŸããã çŸåšãµããŒããããŠããã®ã¯Chromeã®ã¿ã§ãïŒãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ãªãããŒãžã§ã³ã¯ãµããŒããããŠããŸããïŒã ãã©ãŠã¶éã®ãµããŒãã«åããéçºãé²è¡äžã§ã ã
- é«åºŠãªãã¹ãæ©èœã®æ¬ åŠã ããã§ã¯ãTestCafeãšæ¯èŒããŠããŸã ååãªäžŠåãã¹ãæ©èœãšããã€ãã®è¿œå ããŒã«ã¯ãããŸããããããããã¹ãŠã®å€èŠ³ã¯éçºè
ã®èšç»ã«ãããŸãã
- ããã¥ã¡ã³ããŒã·ã§ã³ ãµã€ãã¬ã¹ã«ã¯ãããæžãããããããããããã¥ã¡ã³ãããããŸãã
- . .
- Mocha. Mocha . , , Mocha, , .
describe('My First Cypress Test', function() { it("Gets, types and asserts", function() { cy.visit('https://example.cypress.io') cy.contains('type').click() // URL, '/commands/actions' cy.url().should('include', '/commands/actions') // , . cy.get('.action-email') .type('fake@email.com') .should('have.value', 'fake@email.com') }) })
âPuppeteer
Puppeteer â Node.js, Google. Node.js API Chrome .
â Chrome v59+,
--headless
. , API , Puppeteer â , , JS-, Google .
, Firefox , 2017-, .
, Chrome Firefox . , TestCafe Karma.
Puppeteer :
- . Puppeteer â , , .
- ããã©ãŒãã³ã¹ã Puppeteer , Chrome, , , PhantomJS, WebKit.
- . Chrome (, , Puppeteer) , Flash. , .
âPhantomJS
PhantomJS Chromium , Chrome.
Puppeteer PhantomJS, , , PhantomJS, 2017, , - .
PhantomJS, Puppeteer? :
- , , .
- PhantomJS CasperJS. , PhantomJS.
- PhantomJS WebKit, Chrome.
- PhantomJS Flash, Chrome â .
âNightmare
Nightmare â , .
Nightmare Electron , PhantomJS, , Chromium . , Electron, , - JavaScript, HTML CSS.
, , Nightmare Chrome . Nightmare PhantomJS.
Nightmare:
yield Nightmare() .goto('http://yahoo.com') .type('input[title="Search"]', 'github nightmare') .click('.searchsubmit')
PhantomJS:
phantom.create(function (ph) { ph.createPage(function (page) { page.open('http://yahoo.com', function (status) { page.evaluate( function () { var el = document.querySelector('input[title="Search"]') el.value = 'github nightmare' }, function (result) { page.evaluate( function () { var el = document.querySelector('.searchsubmit') var event = document.createEvent('MouseEvent') event.initEvent('click', true, false) el.dispatchEvent(event) }, function (result) { ph.exit() } ) // page.evaluate } ) // page.evaluate }) // page.open }) // ph.createPage }) // phantom.create
âCasper
Casper â , PhantomJS SlimerJS ( , Phantom, Firefox Gecko). Casper -, , Phantom Slimer.
Slimer , . 2017- -, 1.0.0-beta.1, Firefox . Slimer.
, , , Casper PhantomJS Puppeteer Chrome, Firefox. , .
âCodeceptJS
CodeceptJS , CucumberJS, API. , , .
CodeceptJS:
Scenario('login with generated password', async (I) => { I.fillField('email', 'miles@davis.com'); I.click('Generate Password'); const password = await I.grabTextFrom('#password'); I.click('Login'); I.fillField('email', 'miles@davis.com'); I.fillField('password', password); I.click('Log in!'); I.see('Hello, Miles'); });
, : WebDriverIO , Protractor , Nightmare , Appium , Puppeteer . .
, , CodeceptJS.
ãŸãšã
-. ? , , - , , , . , , : , , .
芪æãªãèªè ïŒ JS-?
![](https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png)