【问题标题】:Why e2e database tests failing within CI but not locally?为什么 e2e 数据库测试在 CI 内失败,而不是在本地?
【发布时间】:2020-12-21 16:08:02
【问题描述】:

我有用于开发、登台和生产的管道。

暂存管道是我遇到问题的地方。管道在 dev 上构建得很好(在 CI 运行器上和关闭),但暂存代码仅在本地和实时服务器上构建,但会失败 在 CI 运行器中。我用<-- 表示怀疑代码。

我已经检查了数据库容器在测试时是否正在运行,并且它已启动并正在运行。日志显示没有异常。

赛普拉斯测试在与数据库交互的测试中失败:

test-ci.sh:

#!/bin/bash

env=$1
fails=""

inspect() {
  if [ $1 -ne 0 ]; then
    fails="${fails} $2"
  fi
}

# run server-side tests

dev() {
  docker-compose up -d --build
  docker-compose exec -T users python manage.py recreate_db
  docker-compose exec -T users python manage.py test
  inspect $? users
  docker-compose exec -T client npm test -- --coverage --watchAll --watchAll=false
  inspect $? client
  docker-compose down
}

# run e2e tests

e2e() {
  if [ "${env}" = "staging" ]; then
    docker-compose -f docker-compose-stage.yml up -d --build
    docker-compose -f docker-compose-stage.yml exec -T users python manage.py recreate_db  # <--
    docker run -e REACT_APP_USERS_SERVICE_URL=$REACT_APP_USERS_SERVICE_URL -v $PWD:/e2e -w /e2e -e CYPRESS_VIDEO=$CYPRESS_VIDEO --network flaskondocker_default cypress/included:6.0.0 --config baseUrl=http://nginx
    inspect $? e2e
    docker-compose -f docker-compose-stage.yml down
  else
    docker-compose -f docker-compose-prod.yml up -d --build
    docker-compose -f docker-compose-prod.yml exec -T users python manage.py recreate_db
    docker run -e REACT_APP_USERS_SERVICE_URL=$REACT_APP_USERS_SERVICE_URL -v $PWD:/e2e -w /e2e -e CYPRESS_VIDEO=$CYPRESS_VIDEO --network flaskondocker_default cypress/included:6.0.0 --config baseUrl=http://nginx
    inspect $? e2e
    docker-compose -f docker-compose-prod.yml down
  fi
  }

# run specific tests

if [ "${env}" = "staging" ]; then
  echo "****************************************"
  echo "Running e2e tests ..."
  echo "****************************************"
  e2e
elif [ "${env}" = "production" ]; then
  echo "****************************************"
  echo "Running e2e tests ..."
  echo "****************************************"
  e2e
else
  echo "****************************************"
  echo "Running client and server-side tests ..."
  echo "****************************************"
  dev
fi

if [ -n "${fails}" ]; then
  echo "Test failed: ${fails}"
  exit 1
else
  echo "Tests passed!"
  exit 0
fi

测试的行为类似于 docker-compose -f docker-compose-stage.yml exec -T users python manage.py recreate_db 失败或尚未执行,但日志显示没有错误。

gitlab-ci.yml文件:

image: docker:stable

services:
  - docker:19.03.12-dind

variables:
  COMMIT: ${CI_COMMIT_SHORT_SHA}
  MAIN_REPO: https://gitlab.com/coding_hedgehog/flaskondocker.git
  USERS: training-users
  USERS_REPO: ${MAIN_REPO}#${CI_COMMIT_BRANCH}:services/users
  USERS_DB: training-users-db
  USERS_DB_REPO: ${MAIN_REPO}#${CI_COMMIT_BRANCH}:services/users-db
  CLIENT: training-client
  CLIENT_REPO: ${MAIN_REPO}#${CI_COMMIT_BRANCH}:services/client
  SWAGGER: training-swagger
  SWAGGER_REPO: ${MAIN_REPO}#${CI_COMMIT_BRANCH}:services/swagger

stages:
  - build
  - push

before_script:
  - export REACT_APP_USERS_SERVICE_URL=http://127.0.0.1
  - export CYPRESS_VIDEO=false
  - export SECRET_KEY=pythonrocks
  - export AWS_ACCOUNT_ID=nada
  - export AWS_ACCESS_KEY_ID=nada
  - export AWS_SECRET_ACCESS_KEY=nada
  - apk add --no-cache py-pip python2-dev python3-dev libffi-dev openssl-dev gcc libc-dev make npm
  - pip install docker-compose
  - npm install

compile:
  stage: build
  script:
    - docker pull cypress/included:6.0.0
    - sh test-ci.sh $CI_COMMIT_BRANCH

deployment:
  stage: push
  script:
    - sh ./docker-push.sh
  when: on_success

让我强调一下,测试是在我的计算机本地以及实时服务器上通过的。在 CI 中无头运行时,与数据库相关的 e2e 测试会失败。

知道没有容器崩溃、日志显示没有错误、相同的代码在本地构建并且可以正常运行但在 CI 中失败,我可以采取哪些调试步骤?

【问题讨论】:

    标签: docker docker-compose gitlab-ci cypress


    【解决方案1】:

    我们遇到了一些问题,数据库检查在本地工作,但在无头 CI 中没有。我们发现这是因为日期时间字段。 CI 中的标记响应与本地不同。因此,所有检查日期的断言都失败了。我们通过编写格式化日期时间结果的 MySQL 查询来解决这个问题。然后相应地调整赛普拉斯中的断言。也许你的问题与这个问题有关。

    SELECT DATE_FORMAT(columnname, "%d-%c-%Y") as columnname FROM table
    

    那么,为了进一步调试,你有什么简单的测试可以在 CI 中正确运行吗?还是什么都没用?

    【讨论】:

    • 到目前为止,我已经对所有与数据库无关的内容进行了测试。就像在加载时检查标题元素是否包含某些单词,或者如果您单击某个锚标记,页面是否包含它应该包含的所有链接。就像我说的那样,失败的测试是那些测试与数据库交互的测试。
    • 我的应用此时在模型中没有 DateTime 字段。您的建议有效,但不适用于我的情况。还是谢谢你。
    猜你喜欢
    • 2022-12-16
    • 2017-10-09
    • 1970-01-01
    • 2017-04-02
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-06-13
    相关资源
    最近更新 更多