ãã¹ãã®éèŠæ§ãåãã£ãŠã¯ããããã©ãããã¹ããããã®ã¯å€§å«ããªããšã§æåãªç§ã§ããã
CodeceptJSãšããE2Eãã¹ããã¬ãŒã ã¯ãŒã¯ã«æã蟌ãã§ããŸã£ãã®ã§
åæã«å®£äŒãããŠããã ããŸãïŒ
ãããããã¹ããã¬ãŒã ã¯ãŒã¯ã«ã€ããŠåå¿è
ã¬ãã«ãªã®ã§ã
æžããŠããå
å®¹ã¯æµ
ãããšã°ãããªã®ã§ãäºæ¿ãã ããð
CodeceptJSãšã¯
CodeceptJSã¯Node.jsã§åäœããE2Eãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãã
ïŒÂŽ-`ïŒ.oOïŒE2Eãã¹ãã«ã€ããŠããããã£ãŠæ¹ã¯ããã£ãŠãã ããã
CodeceptJSã«æã蟌ãã 3ã€ã®çç±
CodeceptJSã«æã蟌ãã§ããŸã£ãäž»ãª3ã€ã®çç±ã¯ä»¥äžã®éãã§ãïŒ
- ç°¡åã«ãã¹ãã³ãŒããæžãã
- ç°¡åã«ç°å¢æ§ç¯ã§ãã
- ææ§ãªèŠçŽ æå®ã§ãå€å¥ããŠããã
ç°¡åã«ãã¹ãã³ãŒããæžãã
CodeceptJSã®äžçªã®ç¹åŸŽã¯äœããšèšããšããç°¡åã«ãã¹ãã³ãŒããæžãããããšã§ãã
ç°¡åã«ãã¹ãã³ãŒãæžããã£ãŠã©ãããããšãããïŒéšãããžããïŒïŒãšããæ¹ã®ããã«ã
SeleniumãšCodeceptJSã§æžãããã¹ãã³ãŒããæ¯èŒããŠã¿ãŸããã
Seleniumã§ã®ãã¹ãã³ãŒã
Seleniumã®å ¬åŒããã¥ã¡ã³ãã«èšèŒãããŠãããµã³ãã«ã³ãŒããåŒçšãããŠããããŸããã
const {Builder, By, Key, until} = require('selenium-webdriver');
(async function example() {
let driver = await new Builder().forBrowser('firefox').build();
try {
// Navigate to Url
await driver.get('https://www.google.com');
// Enter text "cheese" and perform keyboard action "Enter"
await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
let firstResult = await driver.wait(until.elementLocated(By.css('h3')), 10000);
console.log(await firstResult.getAttribute('textContent'));
}
finally{
driver.quit();
}
})();
ãã£ãŠããããšã¯ä»¥äžã®éãã§ãã
- https://www.google.comã«ã¢ã¯ã»ã¹ãã
- name屿§ãqãã®èŠçŽ ãæ¢ã
- ãcheeseããšå ¥åãã
- ãEnterãããŒãæŒäžãã
- ã¿ã°ãh3ãã®èŠçŽ ããæåã«çºèŠãããèŠçŽ ãååŸãã
- ååŸããèŠçŽ ããããã¹ããååŸããŠè¡šç€ºãã
Seleniumã®ãã¹ãã³ãŒãã§ãååã«èªã¿ãããã§ããã
CodeceptJSã ãšæŽã«èªã¿ãããæžããŠããŸããŸãïŒ
CodeceptJSã§ã®ãã¹ãã³ãŒã
å ã»ã©ã®Seleniumã®ãã¹ãã³ãŒããCodeceptJSã§æžãçŽãããã®ã§ãã
Feature('ã¯ãããŠã®CodeceptJS');
Scenario('Googleã§æ€çŽ¢ãã', async({ I }) => {
I.amOnPage('https://www.google.com');
I.fillField('q', 'cheese');
I.pressKey('Enter');
I.wait(1);
let firstResult = await I.grabTextFrom('h3');
console.log(firstResult);
});
SeleniumãšCodeceptJSã®ãã¹ãã³ãŒããæ¯èŒããŠã¿ããš
Seleniumã§ã¯ã¡ãœãããã§ãŒã³ã§ã³ãŒãã£ã³ã°ãããŠããéšåããããŸãããã
CodeceptJSã§ã¯åè¡ã®åŠçãçããŸãšãŸã£ãŠããŸãã
ãŸãããã¹ãã³ãŒãã®æµããCodeceptJSã®æ¹ãçŽæçã«çè§£ããããæããŸãã
å人çã«ã¯CodeceptJSã®æ¹ã奜ãã§ã(ÂŽâïœ*)ïŸïŸïœ¯
å®è¡çµæ
ãã¹ãã³ãŒãã®å®è¡çµæã¯ä»¥äžã®éãã§ãã
å®è¡çµæã¯å¯Ÿå¿ããåœã®èšèªã«ç¿»èš³ããŠè¡šç€ºãããããšãã§ããŸãã
ããŸã
翻蚳ãããŠããã¡ãœããã§ããã°ã以äžã®ããã«ãæžãã¡ãããŸãã
Feature('ã¯ãããŠã®CodeceptJS');
Scenario('Googleã§æ€çŽ¢ãã', async({ I }) => {
I.ããŒãžãç§»åãã('https://www.google.com');
I.ãã£ãŒã«ãã«å
¥åãã('q','cheese');
I.ããŒå
¥åãã('Enter');
I.åŸ
ã€(1);
let firstResult = await I.ããã¹ããååŸãã('h3');
console.log(firstResult);
});
çšæãããŠããã¡ãœããå
šãŠã翻蚳ãããŠããããã§ã¯ãªãã®ã§ã
åºæ¬ã¯è±èªã®ã¡ãœããåãå©çšããæ¹ãè¯ãæ°ãããŠããŸãã
ç°¡åã«ç°å¢æ§ç¯ã§ãã
éåžžã«ç°¡åã«CodeceptJSã®å®è¡ç°å¢ãæ§ç¯ããããšãã§ããŸãã
Node.jsãã€ã³ã¹ããŒã«ãããŠããã°ã
PowerShellãªã©ã§ä»¥äžã®ã³ãã³ããå®è¡ããã ãã§ã»ãŒå®äºã§ãã
npx create-codeceptjs .
ããè©³çŽ°ãªæ§ç¯æé ã¯åŸã§èª¬æããŸãïŒ
ææ§ãªèŠçŽ æå®ã§ãå€å¥ããŠããã
Webãµã€ãã®ãã¹ãã³ãŒããäœæããã«ããã£ãŠã
察åŠãšãªããµã€ãã»ããŒãžã®HTMLèŠçŽ ãCSSãªã©ãææ¡ããŠããå¿
èŠããããŸããã
ã§ãããCodeceptJSã ãšãã¹ã察象ã®Webãµã€ãã«ã€ããŠ
çè§£ããŠããªããŠã倧äœãã¹ãã³ãŒãæžããŠããŸããŸãã
ææ§ãªèŠçŽ æå®ã«ã€ããŠ
ããã§ã¯ãYahoo! JAPANã®ãããããŒãžãäŸã«ç޹ä»ããŸãã
Yahoo! Japanã®ãããããŒãžã«è¡šç€ºãããŠãã
èµ€æ ã§å²ãã ãITã»ç§åŠã¿ãããã¯ãªãã¯ãããã¹ãã³ãŒãã¯ä»¥äžã®éãã§ãã
I.amOnPage('https://www.yahoo.co.jp/');
I.click('ITã»ç§åŠ', 'li#tabTopics7');
å¿è«ãYahoo! Japanã®ãããããŒãžã®HTMLæ§æãªããŠç¥ã£ãŠããããããªãã®ã§
li#tabTopics7ã«ã€ããŠã¯éçºè
ããŒã«ãçšããŠèª¿ã¹ãŸããã
ããã¿ãã®é çªãå€ãã£ãå Žåã«ã¯ããã®ãã¹ãã³ãŒãã¯åããªããªã£ãŠããŸããŸãã
ãŸããä»ã®ç®æããã¹ãããã«ãéçºè
ããŒã«ãç«ã¡äžããŠèŠçŽ ã調ã¹äžããªããã°ãªããªããªããããããŸããã
ã§ãããCodeceptJSã ãšä»¥äžã®ã³ãŒãã§ãåãæäœãããŠãããŸãã
I.amOnPage('https://www.yahoo.co.jp/');
I.click('IT');
åäœã«ã€ããŠã¯ä»¥äžã®éãã§ãã
- ããŒãžã®äžãããITãã®æèšãå«ãŸããŠããèŠçŽ ãæ¢ã
- æåã«æ¢ãåºãããèŠçŽ ãã¯ãªãã¯ãã
ãã®ããã«HTMLã¿ã°ãIDãã¯ã©ã¹ãæå®ããªããŠã
ç»é¢ã«è¡šç€ºãããŠããæèšã ãã§ãã¹ãã³ãŒããæžããŠããŸããŸãã
ãã¡ãããã¡ãªããããã
å¯ãã®è¯ãæ¹ã¯æ°ã¥ããŠãããšæããŸããã
äœãèããã«CodeceptJSã«é Œãéãããšçãç®ãèŠãããšã«ãªããŸãã
- ä»ã«ãITããšèšèŒãããŠããèŠçŽ ããã£ãå Žåã«ã
ãã¡ããåªå ããŠã¯ãªãã¯ãããå¯èœæ§ãããã - 該åœã®èŠçŽ ãèŠã€ãããŸã§å
šèŠçŽ ãæ¢çŽ¢ããå Žåãããã®ã§ã
åŠçãé ããªãå¯èœæ§ãããã
以äžã®ãã¡ãªãããããã®ã§ã
ãŸãåãããŠã¿ãïŒãšããå Žåã«ã¯èŠçŽ ãæå®ããªããŠãè¯ãã§ããã
æ¬çªçšã®ãã¹ãã³ãŒããäœæããéã«ã¯æäœéã®èŠçŽ æå®ããŠãããæ¹ãè¯ãã§ãããã
ã©ããªæã«åœ¹ç«ã€ïŒ
以äžã®ãããªWebãµã€ããE2Eãã¹ãããå Žåã«ã¯ã
ç©åã圹ã«ç«ã€ãšèããŠããŸãã
- HTMLèŠçŽ ã«å¯ŸããŠIDãã¯ã©ã¹æå®ããããŠããªãå Žå
- HTMLæ§é ããŽãã£ãŽãã£ãªå Žå
ç°å¢æ§ç¯
ãããŸã§èªãã§ã¿ãŠäœ¿ã£ãŠã¿ããã£ãŠæ¹ã¯CodeceptJSãã»ããã¢ãããã¡ãããŸãããã
Node.js ã€ã³ã¹ããŒã«
ããŠã³ããŒãããŒãžãã
察象OSåãã®ã€ã³ã¹ããŒã©ãŒãããŠã³ããŒãããŠãã€ã³ã¹ããŒã«ããŠãã ããã
â»ã§ããã°ææ°çããšã·ãïŒ
CodeceptJS ã»ããã¢ãã
ã³ãã³ãããã³ãããPowerShellãã¿ãŒããã«ã®ãããããéãã以äžã®ã³ãã³ããå®è¡ããŸãã
npx create-codeceptjs .
ã.ããŸã§å ¥åãå¿ èŠã§ãã
ã³ãã³ãå®è¡åŸã«ä»¥äžã®ã€ã«ããã¬ã€ã³ããŒãªæåã衚瀺ããããã
åçš®ã¢ãžã¥ãŒã«ãããŠã³ããŒããããã®ãåŸ
ã¡ãŸãã
ããŠã³ããŒããå®äºããã°ãããç°å¢æ§ç¯å®äºã§ãïŒ
ããã§æºåå®äºã§ãã
ãïŒç°¡åã§ããïŒ
CodeceptJSã®äœ¿ãæ¹
ããŠãå®éã«äœ¿ã£ãŠã¿ãŸãããã
å¿ èŠãã¡ã€ã«ã®äœæ
ãŸãã¯ãã¹ãå®è¡ã«å¿ èŠãªãã¡ã€ã«ãäœæããããã«ã以äžã®ã³ãã³ããå®è¡ããŸãã
npx codeceptjs init
å質åã«çãã€ã€ãèšå®ãã¡ã€ã«ããã¹ããã¡ã€ã«ãªã©ãäœæããŸãã
éäžã§å
¥åãã¹ãããšããŠããåŸã§èšå®ãã¡ã€ã«ãçŽæ¥ç·šéããã°è¯ãã®ã§çŠããªããŠã倧äžå€«ã§ãã
# ãã¹ããã¡ã€ã«ã¯ã©ãã«é 眮ããïŒããšãã¹ããã¡ã€ã«åã®ãã©ãŒãããæããŠã ? Where are your tests located? ./*_test.js # ã©ã®ãã¹ãããŒã«äœ¿ãïŒ ? What helpers do you want to use? Playwright # ã¹ã¯ãªãŒã³ã·ã§ãããšããã°ãšãã©ãã®ãã©ã«ãã«åºåããïŒ ? Where should logs, screenshots, and reports to be stored? ./output # äœèªã«ç¿»èš³ããŠã»ãããïŒ ? Do you want localization for tests? (See https://codecept.io/translation/) ja-JP Configure helpers... # ãã¹ã察象ã®ãµã€ãURLæããŠã¡ã ? [Playwright] Base url of site to be tested http://localhost # ãã¹ãæã«ãã©ãŠã¶ç»é¢è¡šç€ºããïŒ ? [Playwright] Show browser window Yes # ãã©ãŠã¶ã©ã䜿ã£ãŠããã°è¯ãïŒchromiumãfirefoxãšã䜿ããã§ã ? [Playwright] Browser in which testing will be performed. Possible options: chromium, firefox, webkit or electron chromium # ãã¹ããã¡ã€ã«äœæããã¹ãåããŠã®ãã¹ãã¯ã©ããªããšããïŒ ? Feature which is being tested (ex: account, login, etc) search # ãã¹ããã¡ã€ã«åã©ãããïŒ ? Filename of a test search_test.js
ãã¹ãã³ãŒãã®äœæ
äœæãããã¹ãã³ãŒããéããŸããããå ã»ã©ã®äŸã ãšãsearch_test.jsãããã©ã«ãå ã«äœæãããŠããŸãã
æåã«ç޹ä»ãããµã³ãã«ã³ãŒããæžããŠã¿ãŸãããã
Feature('ã¯ãããŠã®CodeceptJS');
Scenario('Googleã§æ€çŽ¢ãã', async({ I }) => {
I.amOnPage('https://www.google.com');
I.fillField('q', 'cheese');
I.pressKey('Enter');
I.wait(1);
let firstResult = await I.grabTextFrom('h3');
console.log(firstResult);
});
å®è¡
以äžã®ã³ãã³ããå®è¡ããŠãã¹ãããŠã¿ãŸãããã
npx codeceptjs run --steps
æåããã°OKã§ããå€åãšã©ãŒã«ãªããªãã¯ãã§ãã
ã¡ãœããã«ã€ããŠ
ãµã³ãã«ã³ãŒãã§å©çšããã³ãã³ãã«ã€ããŠå°ã解説ããŸãã
amOnPage
æå®ãããURLã«ã¢ã¯ã»ã¹ããã¡ãœããã§ãã
絶察URLãŸãã¯çžå¯ŸURLã§æå®ããæ¹æ³ããããŸãã
çžå¯ŸURLã§æå®ããå Žåã«ã¯/ããå§ãŸãæååãæå®ããŸããååèšå®æã«èšå®ããURLãããŒã¹URLã«ãªããŸãã
Scenario('amOnPageã«ã€ããŠ', async({ I }) => {
// 絶察URL
I.amOnPage('https://www.google.com');
// çžå¯ŸURL
I.amOnPage('/hoge'); // => http://localhost/hoge
});
fillField
ããã¹ããã£ãŒã«ãã«å€ãå
¥åããã¡ãœããã§ãã
第äžåŒæ°ã«å
¥å察象ã®èŠçŽ ãæå®ãã第äºåŒæ°ã«å
¥åããæååãæå®ããŸãã
Scenario('fillFieldã«ã€ããŠ', async({ I }) => {
I.amOnPage('https://github.com/login');
// IDåããå€å¥ãã
I.fillField('login', 'hogehoge_id');
// ã©ãã«åããå€å¥ãã
I.fillField('Username or email address', 'hogehoge_label');
});
pressKey
ãã©ãŒã«ã¹ãããèŠçŽ äžã§ããŒå ¥åããŸãã
Scenario('pressKeyã«ã€ããŠ', async({ I }) => {
// EnterããŒãæŒäžããŸã
I.pressKey('Enter');
// Ctrl + SããŒãæŒäžããŸã
I.pressKey(['Control', 'S']);
});
äžéšã§ããã以äžã®ããŒã察å¿ããŠããŸãã
- Alt
- Delete
- End
- Enter
- Escape
- F1 to F12
- Home
- PageDown
- Shift
- Space
- Tab
wait
æå®ããç§æ°åŸ ã€ã¡ãœããã§ãã
Scenario('waitã«ã€ããŠ', async({ I }) => {
// 1ç§åŸ
ã¡ãŸã
I.wait(1);
});
grabTextFrom
æå®ããèŠçŽ ããããã¹ããååŸããã¡ãœããã§ãã
è€æ°ã®èŠçŽ ãèŠã€ãã£ãå Žåã«ã¯ãæåã®èŠçŽ ããååŸãããŸãã
å
šãŠã®èŠçŽ ãååŸããã«ã¯grabTextFromAllã¡ãœãããå©çšããŸãã
Scenario('grabTextFromã«ã€ããŠ', async({ I }) => {
// #hogeããããã¹ããååŸããŸã
let hoge = await I.grabTextFrom('#hoge');
console.log(hoge);
// h3èŠçŽ ã®ããã¹ããå
šãŠååŸããŸã
let allH3 = await I.grabTextFromAll('h3');
console.log(allH3);
});
ãã以å€ã«ãæ°å€ãã®ã¡ãœãããçšæãããŠããã®ã§ã
å
¬åŒãªãã¡ã¬ã³ã¹ãäžåºŠèªãã§ã¿ãŠãã ããïŒ
ãã¡ã€ã«èª¬æ
äž»ã«å©çšãããã¡ã€ã«ã«ã€ããŠèª¬æããŸãã
codecept.conf.js
CodeceptJSã®èšå®ãã¡ã€ã«ã§ããnpx codeceptjs initã§èšå®ããå
容ãç»é²ãããŠããŸãã
å¿
èŠã«å¿ããŠèšå®å€ãæžãæããŸãã
const { setHeadlessWhen } = require('@codeceptjs/configure');
setHeadlessWhen(process.env.HEADLESS);
exports.config = {
tests: './tests/**/*_test.js',
output: './output',
helpers: {
Playwright: {
url: 'http://localhost',
show: true,
browser: 'chromium'
}
},
include: {
I: './libs/steps_file.js'
},
bootstrap: null,
mocha: {},
name: 'codeceptjs',
translation: 'ja-JP',
plugins: {
pauseOnFail: {},
retryFailedStep: {
enabled: true
},
tryTo: {
enabled: true
},
screenshotOnFail: {
enabled: true
},
stepByStepReport: {
enabled: false
}
}
}
tests
ãã¹ããã¡ã€ã«ãèŠã€ããããã®æ£èŠè¡šçŸïŒglobãã¿ãŒã³ïŒãæå®ããŸãã
./tests/**/*_test.jsãšæå®ããããšã§
testsãã©ã«ãå
ã«ããããã€*_test.jsã®ãã¿ãŒã³ãšäžèŽãããã¡ã€ã«ã
ãã¹ããã¡ã€ã«ãšããŠèªèããŸãã
ããŒãžã§ã³3.1.2ããé
åã§è€æ°ãã¿ãŒã³ãæå®ã§ããããã«ãªããŸããã
tests: ['./*_test.js','./sampleTest.js']
steps_file.js
è€æ°ã®æäœããŸãšããã¡ãœãããå®çŸ©ã§ããŸãã
ããã§å®çŸ©ãããšI.login('mailaddress', 'password123456');ãšãã£ãæãã«
ç¬èªã®ã¡ãœãããšããŠäœ¿ããããã«ãªããŸãã
module.exports = function() {
return actor({
login: function(email, password) {
this.fillField('Email', email);
this.fillField('Password', password);
this.click('ãã°ã€ã³');
}
});
}
steps.d.ts
VSCodeãªã©ã®IDEã§èªåè£å®æ©èœã䜿ããããã«ãªãå®çŸ©ãã¡ã€ã«ã§ãã
npx codeceptjs defã³ãã³ãã§å®çŸ©ãã¡ã€ã«ã®æŽæ°ãã§ããŸãã
Helper
åçš®ã©ã€ãã©ãªã®ã©ãããŒã¯ã©ã¹ãäœæã§ããŸãã
以äžã®ã³ãã³ããå®è¡ããããšã§ãã«ããŒãã¡ã€ã«ãäœæããèšå®ãã¡ã€ã«ã«ãã»ã¯ã·ã§ã³ã远å ããŠãããŸãã
npx codeceptjs gh
ãµã³ãã«ã³ãŒã
PostgreSQLãæäœããããã®ã©ãããŒã¯ã©ã¹ã®ãµã³ãã«ã玹ä»ããŸãã
const { Client, Pool } = require('pg');
class postgresHelper {
async connect(config) {
const pool = new Pool(config);
this.client = await pool.connect();
}
async close() {
await this.client.end();
}
async query(query, parameters = {}) {
const res = await this.client.query(query);
return res.rows;
}
}
module.exports = postgresHelper;
äœ¿ãæ¹
以äžã®ã³ãŒãã®éãã«Iãããã«ããŒãã¡ã€ã«ã§çšæããã¡ãœãããåŒã³åºãããšãã§ããŸãã
Scenario('ããŒã¿ããŒã¹ããå€ãååŸãã', async({ I }) => {
// ã³ã³ãã£ã°ã®èšå®
const config = {hoge: "hoge"};
await I.connect(config);
const queryString = 'SELECT * FROM hoge';
let result = await I.query(queryString);
console.log(result);
await I.close();
});
å€éšãµãŒãã¹ãšã®é£æºããã¡ã€ã«æäœãªã©E2Eãã¹ããå®è¡ããã«ããã£ãŠ
å¿
èŠãšãªãã©ã€ãã©ãªã®ã©ãããŒãäœæãããšãã䟿å©ã«æŽ»çšã§ããŸãã
ã³ãã¥ããã£ã«ãã£ãŠäœæããããã«ããŒ
ãã¡ãã®ããŒãžã§ã³ãã¥ããã£ã®äººãã¡ã«ãã£ãŠäœæããããã«ããŒã玹ä»ãããŠããŸãã
WebhookãåŒã³åºããã«ããŒãã¡ãŒã«ãã¹ãçšã®ãã«ããŒãªã©ãããã远å ãç°¡åã§ãã
ïŒÂŽ-`ïŒ.oOïŒdbåãã®ãã«ããŒãããã®ã§ãããèªåã®ç°å¢ã§ã¯äœ¿ããªãã£ãã®ã§èªäœãã¡ãããŸããâŠãæ°ãåãããå ¬éããŸãã
Plugin
ãã©ã°ã€ã³ãå©çšããããšã§CodeceptJSã®æ©èœãæ¡åŒµã§ããŸãã
ãã©ã°ã€ã³ã®äœææ¹æ³ã¯ãŸãä»åºŠç޹ä»ããããšæã£ãŠããã®ã§ã
CodeceptJSã§æºåãããŠãããã©ã°ã€ã³ãäžéšç޹ä»ããŸãã
retryFailedStep
retryFailedStepã¯ã¹ããã倱ææã«ã¹ããããåå®è¡ãããã©ã°ã€ã³ã§ãã
ãã®ãã©ã°ã€ã³ã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã
screenshotOnFail
screenshotonfailã¯ãã¹ã倱ææã®ã¹ã¯ãªãŒã³ã·ã§ãããæ®åœ±ããŠããããã©ã°ã€ã³ã§ãã
ãã®ãã©ã°ã€ã³ã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã
tryTo
tryToã¯ã¹ãããã®å®è¡çµæãtrue/falseã§è¿ããŠããããã©ã°ã€ã³ã§ãã
ã¹ãããã倱æããå Žåã«ã¯ããã®ã¿ã€ãã³ã°ã§ãã¹ããäžæãããŠããŸããŸãã
ããããtryToã䜿ã£ãŠä»¥äžã®ããã«ã³ãŒããæžãããšã§æåæã«ã¯trueã倱ææã«ã¯falseãè¿ã£ãŠããŸãã
const result = await tryTo(() => I.see('æ¬æ°åºããªã'));
ãããã«
E2Eãã¹ããå°å ¥ããããã©ä»¥äžã®ããšã§æå¿µãããšããæ¹ãå€ãã®ã§ã¯ãªãã§ããããã
- ç°å¢æ§ç¯ããã®ãé¢åâŠã
- 察象ã®ã·ã¹ãã ã®HTMLèŠçŽ ããŽãã£ãŽãã£ã§ç¡çâŠã
- éå»ã«E2Eãã¹ãããããšãããã©æå¿µããâŠð€
- åŠç¿ã³ã¹ããé«ãã®ã¯å«âŠããããªæéããªãâŠã
CodeceptJSã¯ãããã®åé¡ã解決ããŠãããçŽ æŽãããããŒã«ã ãšæããŠããã®ã§ã
E2Eãã¹ãå°å
¥ããŠã¿ããããŸããšããããè§Šã£ãŠã¿ãããšããæ¹ã¯
æ¯éCodeceptJSã䜿ã£ãŠã¿ãŠãã ããã
ãŸã ãŸã 玹ä»ã§ããŠããªã䟿å©ãªæ©èœãå€ãããã®ã§ã
ãŸã次ã®èšäºã§ç޹ä»ããããšæã£ãŠããŸãïŒ
ïŒÂŽ-`ïŒ.oOïŒå¹Žå ã«ã¯æçš¿ãããã




