У меня есть набор тестов 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 }}
Похоже, что тест не пройден локально, и если я это сделаю, console.info вернется неопределенным. Я собираюсь предположить то же самое и в CI, пока жду, пока это пройдет.





Окружение 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');
}
спасибо, но если вы посмотрите на мой yaml выше, то там негде запустить скрипт. Он берет переменную непосредственно из задания workflow-info и запускает ее как для разработки, так и для промежуточной обработки. Я не использую сценарий, я использую файлы конфигурации, поэтому это может быть полезно для тех, кто использует другую настройку CI, но это не решает мою проблему.
Взгляните еще раз на ответ, сценарий предназначен только для иллюстрации проблемы.
Я попытался установить CYPRESS_CYPRESs_ENV в своем файле конфигурации и обернуть его в оператор if if (Cypress.env('CYPRESS_ENV').trim() === 'test') {, и я получил Cannot read properties of undefined (reading 'trim') обратно из теста, и тест не удалось запустить. Кроме того, это полезно, но мне все равно нужно знать, как использовать его с действиями github. вставлен выше, потому что мне нужен оператор if для разработки, if else для постановки и else для производства. Моя проблема связана с переменными окружения и действиями github, а не только с переменными окружения.
Это работает, я запускал его в локальной системе, но, к сожалению, не могу понять, в чем ваша проблема, из комментария.
Действие GH устанавливает env точно так же, как и локальные сценарии, поэтому, очевидно, вы хотите CYPRESS_CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }} предположить, что ${{ needs.workflow-info.outputs.cf-worker-env }} правильный синтаксис - скорее всего, так оно и есть, если другие переменные env работают.
Мне не удалось использовать для этого переменные 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');
}
});
Надеюсь, кто-то найдет это полезным.
Cypress будет анализировать любые переменные среды
CYPRESS_*как переменные среды Cypress, удаляя часть переменной средыCYPRESS_. Вы пытались установить переменную среды какCYPRESS_CYPRESS_ENV? docs.cypress.io/guides/guides/…