赛普拉斯利用 Gitlab 变量

Posted

技术标签:

【中文标题】赛普拉斯利用 Gitlab 变量【英文标题】:Cypress utilizing Gitlab Variables 【发布时间】:2017-01-28 20:04:54 【问题描述】:

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

问题

我的赛普拉斯测试的一部分目前使用敏感的信用卡信息,所以当我将它上传到 gitlab 存储库时,我不得不尝试找出一种方法来阻止任何人查看所说的“敏感信息”。最终,我尝试利用 Gitlabs 方便的“秘密变量”功能。

设置完所有需要隐藏的变量后,我进入 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

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

无论哪种方式,我都感谢您的帮助!

【问题讨论】:

我知道这与您的问题无关,但我真的很好奇。使用仅支持 Chrome 的东西的决定是什么?赛普拉斯有什么更好的地方?我一直在从事开源项目 Courgette github.com/canvaspixels/courgette 工作,想知道是什么功能吸引了所有人使用赛普拉斯。 【参考方案1】:

There are multiple ways to pass a secret variable to a Cypress test.这里有几种方法可以做到:

CLI 中的环境变量

将秘密变量作为参数传递给cypress ci 命令以创建赛普拉斯环境变量。

cypress ci --env CARDHOLDER_NAME=$CARDHOLDER_NAME,CARD_CC=$CARD_CC

稍后在您的测试中,访问赛普拉斯环境变量。

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

导出为 CYPRESS_*

您可以像尝试那样导出秘密变量,但您需要将CYPRESS_ 附加到变量中才能在测试中访问它。

export CYPRESS_CARD_CC=$CARD_CC

稍后在您的测试中,访问导出的变量。

Cypress.env('CARD_CC')

cy.exec()

使用 Cypress 的 exec 获取秘密变量的内联。

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

【讨论】:

以上是关于赛普拉斯利用 Gitlab 变量的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯,页面内容和变量

如何将环境名称传递给赛普拉斯测试以加载一组环境变量?

如何将环境变量添加到服务器,由赛普拉斯测试运行?

赛普拉斯 IO- 编写 For 循环

赛普拉斯可以运行在赛普拉斯文件夹之外导入的测试文件吗?

如何在赛普拉斯运行的浏览器中使用 process.env 变量