У меня есть набор тестов Cypress, которые используют один и тот же базовый URL-адрес, за исключением одного устаревшего теста. В устаревшем тесте используется перехватчик before, у которого cy.visit равен http://e2etest.dev.my-company.com:8081/company/sign-in
. Проблема в том, что этот тест запускает e2etest.dev, даже если он выполняется на промежуточном этапе.
Я создал оператор if в соответствующем коде:
if (Cypress.env('CYPRESS_ENV') === 'test') {
cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in');
} else {
cy.visit('http://e2etest.staging.my-company.com:8081/company/sign-in');
}
У меня также есть Github Actions ci.yaml. У меня нет e2e.yaml. Принцип работы ci.yaml заключается в том, что он принимает имя ветки и запускает следующее:
echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
BUILD_REF = "${GITHUB_REF_NAME}"
FORMATTED_BUILD_REF = "$(echo $BUILD_REF | sed 's/[^a-zA-Z0-9]/-/g')"
VERSION = "$(date -u +'%Y%m%d')-$GITHUB_RUN_NUMBER-${GITHUB_SHA:0-7}"
SERVICE='my-company-pro'
case "${GITHUB_REF_NAME}" in
"master")
BASE_URL = "https://e2etest.my-company.com"
API_HOST = "api.my-company.com"
NAMESPACE = "app-prod"
;;
"staging")
BASE_URL = "https://e2etest.staging.my-company.com"
API_HOST = "api.staging.my-company.com"
NAMESPACE = "app-staging"
CF_WORKER_ENV = "staging"
;;
"sandbox")
BASE_URL = "http://e2etest.sandbox.my-company.com"
API_HOST = "api.sandbox.my-company.com"
NAMESPACE = "app-sandbox"
;;
*)
BASE_URL = "https://e2etest.dev.my-company.com:3003"
API_HOST = "api.staging.my-company.com"
NAMESPACE = "app-test"
CF_WORKER_ENV = "test"
;;
В задании cypress я распечатал доступные переменные и получил это обратно, указывая, что я правильно отредактировал yaml:
Run echo "CF Worker Env: staging"
CF Worker Env: staging
и
Run echo "CYPRESS_ENV=${CYPRESS_ENV}"
CYPRESS_ENV=staging
Эти значения говорят о тестировании в функциональной ветке и промежуточной версии в промежуточной ветке. На панели инструментов Cypress я вижу, что в ветке функций он переходит к оператору if для среды разработки, и я вижу, что мой console.info(Cypress.env('CYPRESS_ENV')) распечатывает слово test.
Однако когда тест объединяется с промежуточным этапом в моем конвейере, он все равно печатает слово test и переходит в среду разработки.
Вот мой cypress.config.ts
import { defineConfig } from 'cypress';
export default defineConfig({
chromeWebSecurity: false,
pageLoadTimeout: 60000,
blockHosts: '*datadoghq.com',
projectId: '5cwnfh',
defaultCommandTimeout: 40000,
requestTimeout: 40000,
responseTimeout: 40000,
execTimeout: 15000,
taskTimeout: 15000,
viewportWidth: 1440,
viewportHeight: 900,
numTestsKeptInMemory: 0,
retries: {
runMode: 2,
},
env: {
COMPANY_API_BASE_URL: 'api.staging.my-company.com',
CYPRESS_ENV: 'test',
},
e2e: {
fixturesFolder: 'fixtures',
baseUrl: 'https://e2etest.dev.my-company.com:3003',
specPattern: 'cypress/e2e/**/*.{ts,tsx}',
},
component: {
devServer: {
framework: 'next',
bundler: 'webpack',
},
},
});
Я думаю, что тест в CI не пройден из-за моего CYPRESS_ENV, который я вставил в свой cypress.config.ts во время устранения неполадок. Однако, если я удалю CYPRESS_ENV из моего config.ts, тест перейдет к блоку else и запустится в промежуточном режиме, когда я запускаю его локально, потому что в console.info, когда я запускаю локально, он печатает «неопределено».
Как заставить Cypress запускать «тестовую» среду для CYPRESS_ENV локально, «тестовую» среду для CYPRESS_ENV, когда GITHUB_REF не промежуточный в CI, и «промежуточную» среду для CYPRESS_ENV, когда GITHUB_REF промежуточный в CI?
В других проектах у меня есть команда в задании кипариса в CI, где я могу корректировать значения в командной строке, но этот тест запускает кипарис автоматически. Вот моя кипарисовая работа в CI:
cypress-test:
needs: [workflow-info, build]
runs-on: ubuntu-latest
env:
WORKER_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}
BASE_URL: ${{ needs.workflow-info.outputs.base-url }}
API_BASE_URL: ${{ needs.workflow-info.outputs.api-host }}
CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}
strategy:
fail-fast: false
matrix:
containers: [1, 2, 3, 4, 5, 6, 7, 8, 9]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
cache: 'yarn'
node-version: '20.9.0'
- name: Install Specific Chrome Version
run: |
sudo apt-get install -y wget
sudo wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt-get install ./google-chrome-stable_current_amd64.deb
- name: Get yarn cache directory path
id: yarn-cache-dir-path
shell: bash
run: |
echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-
- name: Restore next build and deps
uses: actions/cache@v4
with:
path: |
./next/.next
./next/node_modules
./legacy/node_modules
./node_modules
~/.cache/Cypress
key: next-build-${{ github.sha }}
- name: Setup /etc/hosts
run: sudo echo "127.0.0.1 e2etest.dev.my-company.com" | sudo tee -a /etc/hosts
- name: Print CF Worker Env
run: |
echo "CF Worker Env: ${{ needs.workflow-info.outputs.cf-worker-env }}"
- name: Print CYPRESS_ENV
run: echo "CYPRESS_ENV=${CYPRESS_ENV}"
- name: Run App
run: yarn dev &
- name: Run Cypress Tests
uses: cypress-io/github-action@v6
with:
browser: chrome
working-directory: next
record: true
parallel: true
config: baseUrl=${{ needs.workflow-info.outputs.base-url }}
ci-build-id: ${{ needs.workflow-info.outputs.cypress-run-id }}-${{ github.run_attempt }}
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_DASHBOARD_KEY_NEXT }}
DEBUG: '@cypress/github-action'
CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}
🤔 А знаете ли вы, что...
С Node.js можно создавать приложения, работающие в режиме реального времени, такие как чаты и игры.
Окружение var CYPESS_ENV
не попадает в тестовый код, скорее всего, потому, что env
является зарезервированным словом и поэтому отклоняется.
Экспериментирование
В чистом проекте (синтаксис Windows)
// package.json
{
"dependencies": {
"cypress": "^13.11.0"
},
"scripts": {
"start1": "SET CYPRESS_ENV=legacy && npx cypress open",
"start2": "SET CYPRESS_CYPRESS_ENV=legacy && npx cypress open",
}
}
it('logs all Cypress.env()', () => {
console.info('Cypress.env()', Cypress.env())
})
Запустив yarn start1
с CYPRESS_ENV=legacy
, приведенный выше тест регистрирует пустой объект среды:
Cypress.env() ➤ {}
Запустив yarn start2
с CYPRESS_CYPRESS_ENV=legacy
, приведенный выше тест регистрирует нужное значение среды:
Cypress.env() ➤ { CYPRESS_ENV: 'legacy' }
Обратите внимание, что по какой-то странной причине в конце значения есть дополнительный пробел.
Если вы добавите двойной префикс переменной окружения, то ваш код before()
должен работать с .trim()
в операторе if ()
:
if (Cypress.env('CYPRESS_ENV').trim() === 'legacy') {
cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in');
} else {
cy.visit('http://e2etest.staging.my-company.com:8081/company/sign-in');
}
Мне не удалось использовать для этого переменные CYPRESS_ENV в моем CI, но я смог использовать это, потому что в нем вызывается baseUrl.
config: baseUrl=${{ needs.workflow-info.outputs.base-url }}
в моем КИ. Я распечатал `console.info('base Url is', Cypress.config().baseUrl); чтобы получить это значение.
cy.window().then((window) => {
const baseUrl = Cypress.config().baseUrl;
console.info('base Url is', baseUrl);
if (baseUrl === 'https://e2etest.dev.updater.com:3003') {
cy.visit('http://e2etest.dev.updater.com:8081/company/sign-in');
} else if (baseUrl === 'https://e2etest.staging.updater.com') {
cy.visit('http://e2etest.staging.updater.com/company/sign-in');
} else {
cy.visit('http://e2etest.updater.com/company/sign-in');
}
});
Надеюсь, кто-то найдет это полезным.