web-dev-qa-db-ja.com

生成されたコードをテストする必要がありますか?

私のチームは、生成されたコード(一部のPOJOなど)のテストを記述していません。私が最近非常に尊敬しているエンジニアがこの件についてこれを書いた:

過去10年間の調査により、生成されたコードは他のコードと同じくらいバグが発生しやすく、多くの場合、生成されたコードのバグはトリアージにはるかにコストがかかります。したがって、生成されたコードに関する一般的な推奨事項は、次のいずれかの方法で単体テストする必要があるということです。

  1. 生成された単体テスト(生成されたコードと一緒に提供されます)

  2. 統合コードによって提供される単体テスト

ほとんどの場合、#1は利用できませんが、上記の#2は通常、生成されたコードを使用するクラス用に記述された単体テストに固有のものであり、消費/拡張されたクラス用に適切に記述された単体テストは、生成されたコードのカバレッジを高くします。

Coberturaの後継者であるJaCoCoがオプションとして除外さえ提供していないという事実によって証明されるように、この推奨はコードカバレッジコミュニティによって普遍的に(多かれ少なかれ)取り上げられました。

私はこの問題についての研究を見つけることができませんでしたが、それでもまた、私はテストに深く関わっていません。この質問に関するデータはありますか?もしそうなら、どのような影響がありますか?

5
Justin R.

これに対する正解はありません。生成されたコードがあり、次に生成されたコードがあります。少しのフレームワークコード、デザイナーで一緒にドラッグしたものの初期化、または1つの言語/プラットフォームから別の言語/プラットフォームへの本格的なアプリケーションの自動変換について話している可能性があります。後者の場合、確かに動作が変化するかどうかをテストして確認する必要があります。

コード生成には多くのアプリケーションがあります。テストは適切で必要な場合もあれば、無意味な場合もあります。

6
Martin Maat

いいえ、生成されたコードはテストしないでください。そして、あなたreallyはPOJOをテストすべきではありません-テストする振る舞いはありません。

しかし、おそらくコード生成をテストして、それが正しいことを実行し、コーナーケースを処理し、不良データを処理することなどを確認する必要があります。codegenツールがあなたのものではなく、その入力が単純​​な場合は、いくつかのスポットチェックまたは手動テスト十分です.

また、POJOを生成して他のインターフェイスにマップしている可能性があるため、(おそらく手動で)統合テストを実行して、POJOを作成するためのシリアル化または他の動機付けが、作成したものによって満たされることを確認する必要があります。

それはちょっとした知識かもしれませんが、ツールの出力だけに焦点を合わせると、出力が自分のものであると断言するだけの悪いテストをする可能性がありますexpect、あなたがするものではない必要

4
Telastyn

何をしたかをテストすることは常に良いことですが、ジェネレータへの入力が意味があることをテストする必要があります。生成結果が正しいことをテストする必要はありません。生成された単体テストは最初にのみ実行できるため、意味がありません。統合またはより「関連性のある」単体テストは、はるかに優れたソリューションです。

コード生成またはフレームワークを使用する理由は抽象化です。データベーススキーマやシリアライゼーションコードなどの定型コードの記述を避け、より高いレベルでアプリケーションの設計を表現したいとします。 (ドメイン固有の言語を考えてください。実際のプログラミング言語にはまったく触れたくないが、ドメインレベルにとどまるだけです。)

テストでは、コンポーネントを「内部」で見ようとして、この抽象化を壊してはなりません。あなたの抽象化が健全で完全であれば、同じレベルであなたが持っている期待を表現する方法があるはずです。そうでない場合、抽象化が壊れている可能性があります。

たとえば、永続性から抽象化したいデータベースマッピングを取り上げます。したがって、インメモリデータベースまたは偽のデータベースを接続し、それに対してすべての単体テストを実行することは、まったく問題ありません。これはユニットテストの最も一般的な解釈ではありませんが、(Martin Fowlerがこれを呼び出します "sociable" unit-tests )利点は、生成されたコードまたはフレームワークコードがテストのたびに実行されることです。

もちろん、これは統合テストレベルでも実行できますが、永続性などの場合は、さらに高いレベルで非常に多くのテストが必要になります。

1
ArtGod

POJOをテストする必要がありますか?
おそらくそうではありません。

ジェネレータープログラムからのoutputをテストする必要がありますか?
はいぜったいに!

ジェネレータプログラムが、テストの作成を選択するかどうかに関係なく、他のコードを生成するかどうかは無関係です。誰かがジェネレータープログラムを変更した場合、あなたは確実に出てくるものがbreak何でも。

0
Phill W.