如何在dredd.yml文件中为dredd测试设置环境变量?

时间:2016-08-12 17:31:18

标签: node.js yaml circleci apiblueprint dredd

我尝试使用dreddapi blueprint来测试网站,以便运行多个api调用。我想在circleCI上运行测试,因为Selenium测试在同一个地方运行。每个交易都需要附带两个令牌,这两个令牌在标题中设置为cookie。理想情况下,这些将在dredd.yml文件中设置。在本地计算机上运行时,如果我将ACCESS_TOKENREFRESH_TOKEN替换为实际值,则测试将按预期运行。

circle.yml:

test:
    override:
            - dredd

dredd.yml标题

header: ['Cookie: access_token=ACCESS_TOKEN; refresh_token=REFRESH_TOKEN']

其中ACCESS_TOKEN和REFRESH_TOKEN被circleCI的环境变量中设置的实际值替换。我还尝试过:access_token=$[ACCESS_TOKEN]access_token=$["ACCESS_TOKEN"]access_token=$ACCESS_TOKEN。第一个api调用的标头中没有替换它们。

标题如下:{"Content-Type":"application/json; charset=utf-8","User-Agent":"Dredd/1.4.0 (Darwin 14.5.0; x64)","Cookie":" access_token=$ACCESS_TOKEN; refresh_token=$REFRESH_TOKEN"}

我是yaml文件的新手,所以我可能遗漏了一些基本的东西,但我确实搜索了一段时间。钩子文件是用node.js编写的,所以我不认为ruby / rails帮助在这里很有用。如果我遗漏了问题,请不要犹豫,告诉我。

2 个答案:

答案 0 :(得分:3)

YAML是一种数据表示语言,而不是模板语言(或模板处理器)。虽然单个程序可能支持加载环境变量或配置中指定的其他参数,但YAML解析器(可能,除非它是自定义模块)不是注入它们的内容。在略读dredd文档时,我没有看到任何对环境变量或参数的引用,可能值得在项目上创建一个问题,并开始与开发人员讨论是否支持。

我可以想出多种方法来解决您的具体问题,但它们都涉及额外的工具来渲染YAML并注入您的变量。也许最简单的解决方案是在CircleCI web configuration(不是版本控制的circle.yml)中设置环境变量。然后,设置预构建步骤,其中生成YAML配置。为此,将YAML包装在BASH脚本中,其中包含的YAML文档为here-doc

#!/bin/bash

# ACCESS_TOKEN and REFRESH_TOKEN are injected by CircleCI

cat <<EOF > config.yml
---
header: ['Cookie: access_token=${ACCESS_TOKEN}; refresh_token=${REFRESH_TOKEN}']
EOF

然后正常运行其余的工作,可能会删除配置文件或在创建任何工件之前从版本控制中恢复它,以避免泄露您的凭据。

答案 1 :(得分:0)

使用标头的更好方法是Hook files设置标头before each请求。在使用Node.js时,请尝试设置节点环境变量:

var hooks = require('hooks');

hooks.beforeEach(function(transaction) {

  transaction.request.headers.Cookie = 
    'access_token=' + ACCESS_TOKEN + 
    '; refresh_token=' + REFRESH_TOKEN;

}