Skip to content

Commit 1472a62

Browse files
anurgalievarenovate-bottsvettaverdelqtm
authored
Canary (#103)
* chore(deps): update dependency codeceptjs-resemblehelper to v1.9.5 * chore(deps): lock file maintenance * chore(deps): update dependency comment-json to v4.2.2 * chore(deps): update dependency esbuild to ^0.14.0 * chore(deps): update dependency axios to ^0.26.0 * chore(deps): update dependency webdriver-image-comparison to ^0.20.0 * Update version in testcafe * Codecept: add smartWait and waitForTimeout * feat: Добавлена возможность игнорировать стенды Kuberta стенды в периодических запусках * fix: Исправлено имя GitHub Workflow для периодических запусков * fix: Исправил опечатку в документации * Enable allure report by default * Allow to run tests on local selenium, remove playwright & testcafe * Script for windows to install local selenium * Script for mac to install local selenium * Change firefox capabilities for local selenium * Auto install & start local selenium * fix os import * add wget installation on mac * add retryTo plugin (#100) * fix: Добавил установку ExecutionPolicy при запуске Selenium под Windows * Run prettier * Define codecept plugins in e2e-tools.json (#101) * Fixed template for broken update-e2e GA (#102) * feat: Добавлена возможность передавать переменные окружения через секреты GitHub * Update nightwatch * Revert "Update nightwatch" This reverts commit 7bcf049. * feat: Добавлена возможность запускать все тесты в текущей папке через VSCode * fix: Пропуск хука AfterSuite, если в Feature пропущены все Scenario Co-authored-by: Renovate Bot <[email protected]> Co-authored-by: Tatyana Tsvetkova <[email protected]> Co-authored-by: Vadim Aleksandrov <[email protected]> Co-authored-by: Aleksandr Krutikov <[email protected]> Co-authored-by: Aleksandr Krutikov <[email protected]> Co-authored-by: Pavel Sidorov <[email protected]> Co-authored-by: Ilia Akimov <[email protected]>
1 parent 54a0393 commit 1472a62

File tree

26 files changed

+1741
-3503
lines changed

26 files changed

+1741
-3503
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text=auto eol=lf

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
node_modules/
22
*.log
33
!templates/**/.vscode/
4+
modules/codecept-playground

docs/CONFIGURATION.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,44 @@ Id браузера можно задать в файле `e2e-tools.json`:
7171
## Настройка для стендов с базовой авторизацией
7272

7373
В .env необходмо указать ссылку на стенд вместе с кредами `LAUNCH_URL=https://login:[email protected]/`
74+
75+
# Codecept: настройка плагинов
76+
77+
Плагины, включенные по умолчанию:
78+
79+
- `pauseOnFail`
80+
- `retryFailedStep`
81+
- `tryTo`
82+
- `retryTo`
83+
- `screenshotOnFail`
84+
- `allure`
85+
86+
Формат конфигурации:
87+
88+
```json
89+
"@csssr/e2e-tools-codecept": {
90+
"plugins": {
91+
"pluginName": {...pluginOptions}
92+
}
93+
}
94+
```
95+
96+
Пример конфигурации:
97+
98+
```json
99+
"@csssr/e2e-tools-codecept": {
100+
"plugins": {
101+
"retryTo": {
102+
"enabled": true,
103+
},
104+
"screenshotOnFail": {
105+
"enabled": false,
106+
},
107+
"allure": {
108+
"enabled": true,
109+
"outputDir": "./codecept/report/allure-reports",
110+
"enableScreenshotDiffPlugin": true,
111+
},
112+
},
113+
}
114+
```

docs/GA_CONFIGS.md

Lines changed: 123 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,19 @@
9797
"urls": ["{{url}}"],
9898
```
9999

100+
Если указан параметр {{url}}, то можно также игнорировать отдельные URL.
101+
102+
```json
103+
"ignoreUrls": ["cms"],
104+
```
105+
106+
В таком случае, если в процессе деплоя создаётся два стенда:
107+
108+
- `https://test-branch.test.cluster`: основной стенд проекта для ветки `test-branch`
109+
- `https://test-branch-cms.test.cluster`: стенд с CMS для ветки `test-branch`
110+
111+
То e2e тесты не будут запускаться для стенда с CMS
112+
100113
### Запуск при успешном деплое через GA
101114

102115
Только для деплоев при помощи GitHub Actions
@@ -147,6 +160,114 @@
147160

148161
Тесты не запускаются параллельно — если на момент запуска тестов другой запуск ещё идёт, то запуск попадёт в очередь и будет выполнен, когда первый запуск закончится
149162

163+
### Передача переменных окружения через GitHub Secret
164+
165+
#### GitHub Action для ручного запуска тестов
166+
167+
Переменные окружения, доступные во время запуска тестов задаются в блоке `env` в файле `e2e-tools.json`
168+
169+
```json
170+
"env": {
171+
"API_URL": {
172+
"type": "string",
173+
"default": "https://api.project.csssr.cloud/",
174+
"description": "Адрес API, к которому обращается стенд"
175+
},
176+
"AUTH_LOGIN": {
177+
"type": "string",
178+
"default": "user.autotest",
179+
"description": "Логин пользователя для обращения напрямую к API"
180+
},
181+
"AUTH_PASSWORD": {
182+
"type": "string",
183+
"default": "123456",
184+
"description": "Пароль пользователя для обращения напрямую к API"
185+
}
186+
}
187+
```
188+
189+
Если для переменной окружения `type` задан как `string` или `boolean`, в созданном GitHub Action переменные окружения задаются через `inputs`
190+
191+
```yaml
192+
name: Run CodeceptJS e2e tests
193+
concurrency: e2e-tests
194+
on:
195+
workflow_dispatch:
196+
inputs:
197+
launchUrl:
198+
description: Базовый URL сайта
199+
default: 'https://master.project.csssr.cloud/'
200+
required: true
201+
browserName:
202+
description: Название браузера как в e2e-tools.json
203+
default: remote_chrome
204+
required: true
205+
ALLURE_JOB_RUN_ID:
206+
description: Inner parameter for Allure TestOps
207+
required: false
208+
API_URL:
209+
description: 'Адрес API, к которму обращается стенд'
210+
default: 'https://master.api.mpss.csssr.cloud/'
211+
required: true
212+
AUTH_LOGIN:
213+
description: Логин пользователя для обращения напрямую к API
214+
default: user.autotest
215+
required: true
216+
AUTH_PASSWORD:
217+
description: Пароль пользователя для обращения напрямую к API
218+
default: '123456'
219+
required: true
220+
```
221+
222+
К сожалению GitHub ограничивает максимальное количество параметров, передаваемых через `inputs`. Можно передать не более 10 параметров.
223+
224+
Для обхода этого ограничения можно использовать передачу переменных окружения через GitHub Secrets
225+
226+
В настройках GitHub репозитория необходимо создать секрет, имя которого соответствуют имени переменной окружения
227+
![GitHub Secret](https://s.csssr.com/U019SC8BZAB/2022-08-12-12-34-40-UfpavObozgpu.jpg)
228+
229+
![GitHub Secret](https://s.csssr.com/U019SC8BZAB/2022-08-12-12-36-12-IEjrsW3Cakw9.jpg)
230+
231+
И изменить `type` переменной на `github`
232+
233+
```json
234+
"env": {
235+
"API_URL": {
236+
"type": "string",
237+
"default": "https://api.project.csssr.cloud/",
238+
"description": "Адрес API, к которому обращается стенд"
239+
},
240+
"AUTH_LOGIN": {
241+
"type": "github",
242+
"default": "user.autotest",
243+
"description": "Логин пользователя для обращения напрямую к API"
244+
},
245+
"AUTH_PASSWORD": {
246+
"type": "github",
247+
"default": "123456",
248+
"description": "Пароль пользователя для обращения напрямую к API"
249+
}
250+
}
251+
```
252+
253+
После этого необходимо пересоздать файлы GitHub Actions.
254+
Теперь переменные окружения в GitHub Actions будут передаваться не через `inputs`, а через секреты GitHub репозитория.
255+
256+
Если секрет в репозитории не задан, то для переменной окружения будет использоваться значение параметра `default`
257+
258+
```yaml
259+
- run: 'yarn et codecept:run --browser ${{ github.event.inputs.browserName }}'
260+
working-directory: e2e-tests
261+
env:
262+
API_URL: '${{ github.event.inputs.API_URL }}'
263+
AUTH_LOGIN: "${{ secrets.AUTH_LOGIN || 'user.autotest' }}"
264+
AUTH_PASSWORD: "${{ secrets.AUTH_PASSWORD || '123456' }}"
265+
```
266+
267+
#### GitHub Action для регулярного запуска тестов
268+
269+
Для случая с GitHub Action для регулярного запуска тестов, который создаётся командой `yarn et generate-periodic-runs`, использовать `inputs` нельзя. Все переменные окружения будут передаваться только через секреты репозитория GitHub вне зависимости от указанного `type` в `e2e-tools.json`
270+
150271
> _Обратите внимание!_
151272
>
152273
> Если в файле e2e-tools.json тип браузера “selenium” ("type": "selenium",) [пример](https://github.com/CSSSR/csssr.com/blob/46f58b18d54b7bb7e3733b72b482a5b1c9f18f55/e2e-tests/e2e-tools.json#L26), необходимо исправить имена переменных
@@ -155,7 +276,7 @@
155276
>
156277
> ```json
157278
> "basicAuth": {
158-
> "credentialsId": "chromedriver",
279+
> "credentialsId": "chromedriver",
159280
> "username_env": "CHROMEDRIVER_USERNAME",
160281
> "password_env": "CHROMEDRIVER_PASSWORD"
161282
> },
@@ -166,6 +287,6 @@
166287
> ```json
167288
> "seleniumBasicAuth": {
168289
> "username_env": "SELENIUM_USERNAME",
169-
> "password_env": "SELENIUM_PASSWORD"
290+
> "password_env": "SELENIUM_PASSWORD"
170291
> },
171292
> ```

docs/LOCAL_SELENIUM.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Настройка локального selenium для отладки тестов
2+
3+
Установка selenium и драйверов для chrome и firefox автоматизирована для windows и macos.
4+
При первом запуске запросит задать переменную окружения LOCAL_SELENIUM_PATH. Нужно указать папку в которую будет устанавливаться selenium.
5+
Папка будет создана и в нее загрузятся все необходимые зависимости для запуска selenium.
6+
7+
При последующих запусках тестов будет использоваться уже ранее запущенный selenium.
8+
9+
Важно чтобы порт 4444 в системе был свободен, иначе selenium не сможет запуститься.
10+
11+
## Правка e2e-tools.json
12+
13+
Чтобы использовать локальный selenium нужно изменить `local_chrome` и `local_firefox` в e2e-tools.json:
14+
15+
```json
16+
"local_chrome": {
17+
"type": "selenium",
18+
"url": "http://localhost",
19+
"port": 4444,
20+
"browser": "chrome",
21+
"windowSize": "1920x1680",
22+
"desiredCapabilities": {
23+
"goog:chromeOptions": {
24+
"args": [
25+
"--no-sandbox",
26+
"--disable-gpu",
27+
"--window-size=1200,800"
28+
]
29+
}
30+
}
31+
},
32+
"local_firefox": {
33+
"default": true,
34+
"type": "selenium",
35+
"url": "http://localhost",
36+
"port": 4444,
37+
"browser": "firefox",
38+
"windowSize": "1920x1680",
39+
"desiredCapabilities": {
40+
"browserName": "firefox",
41+
"moz:firefoxOptions": {
42+
"args": [
43+
"--window-size=1200,800"
44+
]
45+
}
46+
}
47+
},
48+
```

modules/codecept/config.js

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,25 @@ function getLaunchUrl() {
99

1010
function getBasicAuthAuthorizationHeader(browserName, browserConfig) {
1111
const { url, seleniumBasicAuth: sba } = browserConfig
12+
if (!sba) return
13+
1214
const username = getSeleniumBasicAuthEnv(browserName, sba.username_env, `Login for ${url}`)
1315
const password = getSeleniumBasicAuthEnv(browserName, sba.password_env, `Password for ${url}`)
1416
return `Basic ${Buffer.from(`${username}:${password}`, 'utf-8').toString('base64')}`
1517
}
1618

1719
function getBrowser(browserName, browserConfig) {
18-
const { type, default: isDefault, remote, url, seleniumBasicAuth, ...settings } = browserConfig
20+
const {
21+
type,
22+
default: isDefault,
23+
remote,
24+
url,
25+
seleniumBasicAuth,
26+
desiredCapabilities,
27+
...settings
28+
} = browserConfig
1929

2030
switch (type) {
21-
case 'playwright': {
22-
return {
23-
Playwright: {
24-
timeout: 10000,
25-
url: getLaunchUrl(),
26-
...settings,
27-
},
28-
}
29-
}
30-
3131
case 'puppeteer': {
3232
return {
3333
Puppeteer: {
@@ -42,6 +42,17 @@ function getBrowser(browserName, browserConfig) {
4242
throw new Error(`Selenium url is not specified for browser ${browserName}`)
4343
}
4444

45+
if (
46+
desiredCapabilities.browserName === 'firefox' &&
47+
url === 'http://localhost' &&
48+
process.platform === 'win32'
49+
) {
50+
desiredCapabilities['moz:firefoxOptions'].binary = getEnvVariable(
51+
'FIREFOX_BINARY',
52+
'Path to firefox binary'
53+
)
54+
}
55+
4556
const u = new URL(url)
4657
return {
4758
WebDriver: {
@@ -53,17 +64,9 @@ function getBrowser(browserName, browserConfig) {
5364
Authorization: getBasicAuthAuthorizationHeader(browserName, browserConfig),
5465
},
5566
uniqueScreenshotNames: true,
56-
...settings,
57-
},
58-
...helpers,
59-
}
60-
}
61-
62-
case 'testcafe': {
63-
return {
64-
TestCafe: {
65-
url: getLaunchUrl(),
66-
waitForTimeout: 3000,
67+
waitForTimeout: 15000,
68+
smartWait: 5000,
69+
desiredCapabilities,
6770
...settings,
6871
},
6972
...helpers,
@@ -75,7 +78,7 @@ function getBrowser(browserName, browserConfig) {
7578
}
7679
}
7780

78-
const { browsers, helpers } = config.tools['@csssr/e2e-tools-codecept']
81+
const { browsers, helpers, plugins } = config.tools['@csssr/e2e-tools-codecept']
7982

8083
function getBrowserName() {
8184
if (process.env.BROWSER) {
@@ -122,14 +125,18 @@ exports.config = {
122125
tryTo: {
123126
enabled: true,
124127
},
128+
retryTo: {
129+
enabled: true,
130+
},
125131
screenshotOnFail: {
126132
enabled: true,
127133
},
128134
allure: {
129-
enabled: !!process.env.ENABLE_ALLURE_REPORT,
135+
enabled: true,
130136
outputDir: './codecept/report/allure-reports',
131137
enableScreenshotDiffPlugin: true,
132138
},
139+
...plugins,
133140
},
134141

135142
include: {

modules/codecept/index.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,33 @@ function createToolConfig() {
1515
browsers: {
1616
local_chrome: {
1717
default: true,
18-
type: 'playwright',
19-
show: true,
20-
browser: 'chromium',
18+
type: 'selenium',
19+
20+
url: 'http://localhost',
21+
port: 4444,
22+
23+
browser: 'chrome',
24+
windowSize: '1920x1680',
25+
desiredCapabilities: {
26+
'goog:chromeOptions': {
27+
args: ['--no-sandbox', '--disable-gpu', '--window-size=1200,800'],
28+
},
29+
},
2130
},
2231
local_firefox: {
23-
type: 'playwright',
32+
type: 'selenium',
33+
34+
url: 'http://localhost',
35+
port: 4444,
36+
2437
browser: 'firefox',
25-
show: true,
38+
windowSize: '1920x1680',
39+
desiredCapabilities: {
40+
browserName: 'firefox',
41+
'moz:firefoxOptions': {
42+
args: ['--window-size=1200,800'],
43+
},
44+
},
2645
},
2746
remote_chrome: {
2847
remote: true,

0 commit comments

Comments
 (0)