テストデータをバージョン管理にチェックインする必要がありますか?


40

PDFファイルを処理する機能のテストコードを書いています。テストの背後にある基本的な考え方は、特別に選択したいくつかのPDFにそれらを向け、それらを処理し、出力が期待どおりであることを確認することです。

私の質問は、これらの大きなPDFをどこに保存すればよいのかということです。コードとともにバージョン管理にチェックインする必要がありますか?または、それらを別の場所に配置しますか?明らかに、テストコードはPDFなしでは(または異なるPDFでさえ)役に立たないのですが、それでもリポジトリにそれらを入れることは間違っていると感じています。



19
@MichaelKjörling:Tests != Test Data
ロバート・ハーベイ14年

4
@RobertHarvey本当ですが、テストが機能するためにテストデータが必要な場合、それはテストの一部と見なされるべきだと思います。私が理解しているように、これはこれまでの3つの回答すべてで採用されているアプローチでもあります。
CVn 14年

回答:


84

バージョン管理システムには、配布用のアプリケーション(MSI、RPMなど)をビルド、コンパイル、テスト、およびパッケージ化するために必要なものがすべて含まれている必要があります。また、ビルド構成や他のスクリプトもバージョン管理する必要があると主張します。

プロジェクトをチェックアウトし、完全なコンパイル、ビルド、およびテスト環境を用意できるはずです。

テストデータをチェックインするには、2つの方法があります。最初に、テストデータ自体(この場合はPDF)をチェックインできます。次に、テストデータの生成に使用できるソースデータをチェックインできます(該当する場合)。これは、テストデータを含む空のデータベースにロードされたSQLスクリプト、またはPDFやその他のファイルにコンパイルできるテキストベースのファイルである可能性があります。

他のものはすべてをバージョン管理にチェックインすることに同意しないかもしれませんが、私はプロの経験で、完全な環境をゼロから再構築できるようにすることが重要であると感じました。


20
はい。はいぜったいに。2014年です。バイナリファイルをシームレスに処理しないリビジョン管理を使用する正当な理由はありません。
キリアンフォス14年

4
同意しますが、ジャンクアイテムをチェックインしている状況も避けたいです。たとえば、テストによって生成されたすべてのpdfファイルを含む「出力」フォルダーがテストデータに含まれている場合、それをリポジトリに含めないようにする必要があります。しかし、テスト自体がレポの一部であり、それを実行するために必要なパッケージであることに同意します。
ケネスガルザ14年

1
@KennethGarza本当に難しくありません。経験則として、元のコンテンツ(ソースコード、テストソースコード、テストデータ、メディア、[実際の]ドキュメント、サードパーティライブラリ、ビルドスクリプト、ツールスクリプト、変換スクリプトなど)はすべて含める必要があります。元のデータから妥当な時間内に生成できるものではありません。これらは、テスト出力されている与えられた、また、彼らはおそらく唯一意味をなすそう、あなたのプログラムをテストしていない、あなたがあなたのファイルの整合性を維持するためにVCSソフトウェアの能力をテストしている:)、テストを自分で実行している
トーマス・

1
@ MarnenLaibow-Koser:植え込まれたペースメーカーのリード線の電気的障害を検出するために取り組んだプロジェクトには、40GBを超えるテストスイートがありました。それに対処することが不快ではないVCSは存在しません。リポジトリを2つ持つことは、それ自体が管理の面倒ですが、時にはより良い選択になります。
-whatsisname

1
@ MarnenLaibow-Koserあなたはそれを得た。統合テストは別のリポジトリにあり、ユーザーがローカルで実行したい場合、依存関係管理はzipファイルを取得して解凍します。通常、継続的インテグレーションサーバー/ファームは、統合テストを行うタスクを担当し、統合テストに合格するまでマージ機能の分岐を防ぎます。
user482745

15

準備したセットアップファイルがないとテストが役に立たない場合は、VCSにテストコードとともにファイルを含めるのが理にかなっています。

テストで使用されるファイルはコードではありませんが、コードが依存する依存関係として表示できます。そのため、すべてをまとめておくことにはメリットがあります。


カウンターポイントとして、一部のVCSは大きなバイナリファイルを適切に処理できません。また、VCSにあらゆる種類のバイナリファイルを含めることに反対しているVCSもあります。これらのケースのいずれかが当てはまる場合は、簡単にアクセスできる既知の場所にテストファイルを保存するのも理にかなっています。

また、テストコードに「foo.pdfすべてのテストを実行するために依存している」というコメントを入れることも検討します。


テストでテストデータをチェックしても問題は見当たりません。見つからない場合は(URLなどから)取得しようとしますが、どちらも機能しない場合は失敗します。ネットワークに依存すると、テストが遅くなり脆弱になるため、悪い考えです。しかし、試行することはそれほど脆弱ではなく、適切なデータを自動的に取得(およびローカルにキャッシュ)することは、ドキュメント/コメントを手動で読み取り、取得して所定の場所に配置するよりも高速です。
ウォーボ14年

7

静的データの場合は、バージョン管理に入れます。これらのファイルは、チェックインしても実際には変更されません。それらの機能が不要になった場合は削除されるか、新しいテストファイルが追加されます。いずれにせよ、スペースを占有するバイナリの差分の問題を心配する必要はありません。

たとえば、テストデータを生成している場合 ランダムに、テストが失敗したときに自動的に保存する必要がありますが、そうでなければ破棄します。この方法で保存されたデータは、通常の回帰テストに変換する必要があります。これにより、これらのエッジケースは、抽選の運に頼るのではなく、将来的に確実にテストされます。


2
テストデータをランダムに生成する場合は、再現性のある自動テストの作成に関する本を実際に購入する必要があります。
ダウードはモニカ回復言う

5
@DavidWallaceでは、ファズテスト、プロパティチェック、統計ソフトウェアテストなどの分野全体が間違っているだけでなく、有害であると言っているのですか?
ウォーボ14年

5
@DavidWallace random!=再現不能。
コンガスボン14年

5
@DavidWallaceあなたはそれを好きなように呼ぶことができます。ランダムなテストデータ、入力の記録、必要に応じてリサイクル、再現性のある人間工学。怪我の世界につながることはありません。
コンガスボンガス14年

2
@DavidWallace「実際にどのテストケースが必要かを考えるのをやめる代わりに」は「ランダムテストなし」を意味するのではなく、「ランダムテストだけでなく」を意味します。「バグを発見したデータを再現することはできません」に関しては、あなたがコメントしている答えを実際に読みましたか?;)
Warbo 14年

0

そのデータをテストとメインアプリケーションコードに明確に含めます。非常によく整理されたテストスイートを用意するのに役立ちます-pdf抽出をテストしている場合(そして、そのコードがうまくカプセル化されている場合)、アプリコードへのパスに基づいて、テストデータへのパスを構築できるはずです-それはいつも私のために働いています。

gitを使用すると、.gitignoreを設定して、一時出力またはテストロギングがレポを汚染しないようにすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.