我的一个开源项目是一个备份工具,该工具可从GitHub,Bitbucket等进行脱机存储库备份。
它调用托管者的API来获取存储库列表,然后使用Git / Mercurial /任何克隆/将存储库拉到本地计算机。
因此,我在集成测试中通过身份验证调用了GitHub API。
(并且当克隆/拉动功能完成时,可能会有测试从GitHub克隆存储库,并且还需要进行身份验证)
问题:我不能只是在源代码中的某个地方对密码进行硬编码,因为它是开源的,并且代码在GitHub上是公开的。
我现在在做什么
在测试中,我从环境变量中获取所有用户名,密码和存储库名称。
这是一个例子:
config.Name = TestHelper.EnvVar("GithubApiTests_Name");
config.Password = TestHelper.EnvVar("GithubApiTests_PW");
(TestHelper.EnvVar
是一个帮助程序方法,它获取环境变量的值并在不存在环境变量时引发异常)
然后,我有一个批处理文件,用于设置这些环境变量。
真正的(environment-variables.bat
)在构建脚本中以及在执行测试之前被调用,但是在源代码控制中被忽略,因此它实际上不在我的存储库中。
什么是源控制environment-variables.bat.sample
,它设定了相同的环境变量,而是用假密码:
rem copy/rename this file to environment-variables.bat
echo Setting environment variables for integration tests...
set GithubApiTests_Name=scm-backup-testuser
set GithubApiTests_OrgName=scm-backup-testorg
set GithubApiTests_PW=not-the-real-password
set GithubApiTests_Repo=scm-backup
因此,我可以将存储库克隆到我的计算机上,将此文件重命名为environment-variables.bat
,用真实的密码替换假密码,所有集成测试都将起作用。
这也适用于持续集成-我正在使用AppVeyor,并且可以在Web UI中设置这些环境变量。
我对此不满意
我认为这对于OSS项目不是一个好的解决方案,尤其是对于该项目不是这样:
从理论上讲,我的项目的贡献者现在可以通过以下方式运行集成测试:
- 在GitHub上创建自己的测试用户和测试组织
- 创建一些测试库
- 创建
environment-variables.bat
具有不同价值的自己的版本
问题是我的应用程序将能够备份多个源代码托管者。
目前,它仅支持GitHub,但是通过添加一些实现正确接口的类,可以轻松地添加对更多托管者的支持。
因此,当我稍后实现对更多主机的支持时,环境变量的数量将会增加。
为了能够执行所有集成测试,潜在的贡献者可以在GitHub,Bitbucket,GitLab等...上创建自己的用户,组织和测试存储库,并且知道多少,并将所有这些添加到他的environment-variables.bat
版本中。
在代码公开的项目上,有没有更好的解决方案?
我知道其他项目所做的事情与我目前正在做的事情相似。例如,
Octokit.net有一个脚本来设置环境变量,以用于调用GitHub API的集成测试。
但是他们只需要一个用户和一个组织,而我将需要更多。
也许我不需要使贡献者能够实际运行所有集成测试的解决方案。
例如,如果某人想为我的项目的GitHub支持做出贡献,那么他只需要能够运行GitHub集成测试。
因此,也许我只需要一种明智的方法就可以将集成测试划分为无数个“组”(?),然后说“现在执行所有属于'Github'组的测试”。