私の(オープンソースの)趣味プロジェクトの1つは、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を呼び出す統合テストの環境変数を設定するスクリプトがあります。
しかし、必要なのは1人のユーザーと1つの組織だけであり、さらに多くのものが必要になります。
多分私は貢献者が実際にすべての統合テストを実行することを可能にするソリューションを必要としません。
たとえば、誰かが私のプロジェクトのGitHubサポートに貢献したい場合、GitHub統合テストを実行できれば十分です。
統合テストを無数の「グループ」(?)に分割し、「グループ 'Github'に属するすべてのテストを実行する」という適切な方法が必要かもしれません。