unit-testing - Cypress 利用 Gitlab 变量

标签 unit-testing continuous-integration gitlab gitlab-ci cypress

我目前正在使用 Cypress作为我的测试工具,在 gitlab ci 上运行时遇到了一个小问题。

问题

我的部分 Cypress 测试目前使用敏感的信用卡信息,因此当我将其上传到 gitlab 存储库时,我不得不尝试找出一种方法来防止任何人查看所说的“敏感信息”。最终,我尝试利用 Gitlabs 方便的“ secret 变量”功能。

在设置完我需要隐藏的所有变量后,我进入我的 gitlab-ci.yml 文件并进行设置,以便 .gitlab-ci.yml 文件创建一个名为“cypress/support”的新文件/PaymentCredentials.js”,并且在该文件中,所有敏感的支付信息都将存储为 javascript 变量(如下所示)

image: bahmutov/cypress-image
# caching node_modules folder
# https://about.gitlab.com/2016/03/01/gitlab-runner-with-docker/
cache:
  paths:
  - node_modules/
before_script:
  - cypress verify
  - "echo -e \"export default {CARDHOLDER_NAME: '$CARDHOLDER_NAME', CARD_CC: '$CARD_CC', CARD_CC_MONTH: '$CARD_CC_MONTH', CARD_CC_YEAR: '$CARD_CC_YEAR', CARD_CC_CCV: '$CARD_CC_CCV'}\" > cypress/support/PaymentCredentials.js"
stages:
  - build
  - test
build-specs:
  stage: build
  script:
    - npm install
  artifacts:
    paths:
      - cypress/integration
.job_template: &e2e_test_definition
  script:
    - echo $CARDHOLDER_NAME
    - export $CARDHOLDER_NAME
    - cypress ci --spec "cypress/integration/$CI_BUILD_NAME.js"
Test_Project:
  <<: *e2e_test_definition

所以在 Cypress 中,我将集成文件设置为如下所示:

describe('Test', function(){

  afterEach(function(){

  })
  beforeEach(function(){

  })
  //The entire job
  context('Test - Full Functionality Test', function(){
    it('Front-end Walkthrough', function(){
    /*This is going to go through the first step on Test*/
    stepOne()
    /*This is going to go through the Second step on Test*/
    stepTwo()
    /*This is going to go through the Third step on Test*/
    stepThree()
    /*Page loads very slowly, needed some buffer*/
    cy.wait(5000) 
    /*This is going to go through the Fourth step on Test*/
      cy.then(function(){
        cy
        .get('[name=method]').select("CC") //select CC
        .get('#name').type(CARDHOLDER_NAME)
        .get('#number').type(CARD_CC)
        .get('#month').select(CARD_CC_MONTH)
        .get('#year').select(CARD_CC_YEAR)
        .get('#ccv').type(CARD_CC_CCV)
        .get('[type=checkbox]').check({force: true})
        .get('#scoreboard-enroll-form').submit()
      })
    })
  })
})

当我运行管道时,我仍然收到一条错误消息,指出“CARDHOLDER_NAME”尚未定义: Gitlab ci build report

是否有针对这种情况的建议方法?我是不是搞错了什么可笑的事?

无论如何,我感谢您的帮助!

最佳答案

There are multiple ways to pass a secret variable to a Cypress test.您可以通过以下几种方式做到这一点:

CLI 中的环境变量

  • 将 secret 变量作为参数传递给 cypress ci 命令以创建 Cypress 环境变量。

    cypress ci --env CARDHOLDER_NAME=$CARDHOLDER_NAME,CARD_CC=$CARD_CC
    
  • 稍后在您的测试中,访问 Cypress 环境变量。

    Cypress.env('CARDHOLDER_NAME')
    Cypress.env('CARD_CC')
    

导出为 CYPRESS_*

  • 您可以像您尝试的那样导出 secret 变量,但您需要将 CYPRESS_ 附加到变量,以便在您的测试中访问它。

    export CYPRESS_CARD_CC=$CARD_CC
    
  • 稍后在您的测试中,访问导出的变量。

    Cypress.env('CARD_CC')
    

cy.exec()

  • 使用 Cypress 的 exec 获取 secret 变量的内联。

    cy.exec("echo $CARDHOLDER_NAME").its("stdout").then(function(stdout){
       cy.get('#name').type(stdout)
    })
    

关于unit-testing - Cypress 利用 Gitlab 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601860/

相关文章:

java - 无法在 Jmockit 中使用通用返回类型模拟接口(interface)

java - 如何在selenium中使用By.tagName查找子标记名?

java - JUnit 5 @Nested 注释的目的是什么

go - Golang 的 Codeclimate 测试覆盖格式化程序

php - Behat with Jenkins - 如何为 PHP 应用程序提供服务?

gitlab - 如何将图像添加到 GitLab 上的自述文件?

git - 优化 GitLab CE 的高内存使用率

ruby-on-rails - 如何修复 : error: '<filename>' does not have a commit checked out fatal: adding files failed when inputting "git add ." in command prompt

python - 如何使用 pytest 测试无限 while 循环

c++ - 为什么我可以在本地使用 CMake 提供的模块(特别是 CMakeDependentOption.cmake),但不能在 CI 或 Docker 上使用?