내 (오픈 소스) 취미 프로젝트 중 하나는 GitHub, Bitbucket 등에서 리포지토리의 오프라인 백업을 수행하는 백업 도구입니다. 리포지토리
목록을 가져 오기 위해 호스팅 업체의 API를 호출 한 다음 Git / Mercurial / 무엇을 사용하여 복제 / 리포지토리를 로컬 컴퓨터로 가져옵니다.
그래서 인증을 통해 GitHub API를 호출하는 통합 테스트가 있습니다.
(그리고 복제 / 풀링 기능이 끝나면 GitHub에서 리포지토리를 복제하고 인증해야하는 테스트가있을 것입니다)
특히 이러한 통합 테스트에 사용할 사용자 와 조직을 만들었습니다 .
문제점 : 오픈 소스이기 때문에 소스 코드 어딘가에 암호를 하드 코딩 할 수 없으며 코드는 GitHub에서 공개됩니다.
내가 지금하고있는 일
테스트에서 환경 변수에서 모든 사용자 이름, 비밀번호 및 저장소 이름을 가져옵니다.
예를 들면 다음과 같습니다 .
config.Name = TestHelper.EnvVar("GithubApiTests_Name");
config.Password = TestHelper.EnvVar("GithubApiTests_PW");
( TestHelper.EnvVar
환경 변수의 값을 가져오고 존재하지 않을 때 예외를 throw하는 도우미 메소드입니다)
그런 다음 해당 환경 변수를 설정하는 배치 파일이 있습니다.
실제 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
실제 암호로 가짜 암호 를 바꾸면 모든 통합 테스트가 작동합니다.
이것은 Continuous Integration에서도 작동합니다. AppVeyor를 사용 하고 있으며 웹 UI에서 이러한 환경 변수를 설정할 수 있습니다 .
내가 싫어하는 것
나는 그것을 위해 OSS 프로젝트에 대한 좋은 해결책이 아니다, 특히하지 생각 이 프로젝트 :
이론적으로 내 프로젝트에 기여한 사람은 다음과 같은 방법으로 통합 테스트를 실행할 수 있습니다.
- GitHub에서 자체 테스트 사용자 및 테스트 조직 만들기
- 테스트 리포지토리 생성
environment-variables.bat
다른 가치 를 가진 자신의 버전을 만들기
문제는 내 응용 프로그램이 여러 소스 코드 호스트를 백업 할 수 있다는 것입니다.
지금은 GitHub 만 지원하지만 올바른 인터페이스를 구현하는 몇 가지 클래스를 추가하여 더 많은 호스트에 대한 지원을 쉽게 추가 할 수 있습니다.
나중에 더 많은 호스트에 대한 지원을 구현하면 환경 변수의 수가 증가합니다. 모든 통합 테스트
를 수행 할 수 있도록 잠재적 인 기여자는 GitHub, Bitbucket, GitLab 등에서 자신의 사용자, 조직 및 테스트 리포지토리를 생성하고 누가 더 많은 정보를 알고 있는지 자신의 버전에 추가합니다 . environment-variables.bat
코드가 공개 된 프로젝트 에서이 작업을 수행하는 방법에 대한 더 나은 솔루션이 있습니까?
다른 프로젝트가 현재하고있는 것과 비슷한 것을한다는 것을 알고 있습니다. 예를 들어
Octokit.net 에는 GitHub API를 호출하는 통합 테스트를위한 환경 변수 를 설정 하는 스크립트 가 있습니다.
그러나 그들은 한 명의 사용자와 하나의 조직 만 필요하며 더 많은 것이 필요합니다.
기고자가 실제로 모든 통합 테스트를 실행할 수있는 솔루션이 필요하지 않을 수도 있습니다 .
예를 들어, 누군가가 내 프로젝트의 GitHub 지원에 공헌하고 싶다면 GitHub 통합 테스트 만 실행할 수 있어야합니다.
통합 테스트를 무한한 수의 "그룹"(?)으로 나눈 다음 "Github"그룹에 속하는 모든 테스트를 실행할 수있는 방법이 필요할 것입니다.