列挙型は、カスタム(できれば意味のある)名を持つ単純な有限型です。列挙型には値が1つしかない場合があります。void
これには、値のみが含まれますnull
(一部の言語ではこれを呼び出しunit
、要素のないvoid
列挙型の名前を使用します!)。これには、which とのような2つの値があります。、およびのように、3つあります。等々。bool
false
true
colourChannel
red
green
blue
2つの列挙型の値の数が同じ場合、それらは「同型」です。つまり、すべての名前を体系的に切り替えると、別の名前の代わりに使用でき、プログラムの動作は変わりません。特に、テストの動作は変わりません!
たとえば、/ / result
を含むことは上記と同型です。たとえば、with 、with 、with 、with 、そしてどこでもそうする限り(プロデューサーとコンシューマー、パーサーとシリアライザー、データベースエントリー、ログファイルなど)を置き換えることができるからです。 )その後、プログラムに変更はありません。私たちが書いた「テスト」は、もうないにもかかわらず、合格します!win
lose
draw
colourChannel
colourChannel
result
red
win
green
lose
blue
draw
colourChannel
colourChannel
また、enumに複数の値が含まれる場合、それらの値をいつでも再配置して、同じ数の値を持つ新しいenumを取得できます。値の数は変更されていないため、新しい配置は古い配置と同型であり、したがってすべての名前を切り替えることができ、テストは引き続きパスします(定義を切り替えるだけではいけないことに注意してください。使用サイトもすべて切り替えます)。
これが意味するのは、マシンに関する限り、列挙型は「識別可能な名前」であり、それ以外は何もないということです。enumでできることは、2つの値が同じ(たとえばred
/ red
)か異なる(たとえばred
/ blue
)かによって分岐することだけです。それが、「ユニットテスト」ができる唯一のことです。例えば
( red == red ) || throw TestFailure;
(green == green) || throw TestFailure;
( blue == blue ) || throw TestFailure;
( red != green) || throw TestFailure;
( red != blue ) || throw TestFailure;
...
@ jesm00が言うように、そのようなテストはプログラムではなく言語の実装をチェックします。これらのテストは決して良いアイデアではありません。言語の実装を信頼していなくても、テストを正しく実行することは信頼できないため、外部からテストする必要があります。
それが理論です。練習はどうですか?この列挙型の特性化の主な問題は、「現実世界」のプログラムがめったに自己完結型ではないことです。レガシーバージョン、リモート/組み込み展開、履歴データ、バックアップ、ライブデータベースなどがあるため、実際に「切り替え」することはできませんいくつかの用途を逃さずに名前のすべての出現。
しかし、そのようなことは列挙型自体の「責任」ではありません。列挙型を変更すると、リモートシステムとの通信が切断される可能性がありますが、逆に列挙型を変更することで問題を解決できます!
そのようなシナリオでは、列挙型は赤字です。あるシステムがこのようにする必要があり、別のシステムがそのようにする必要がある場合はどうでしょうか。いくつのテストを書いても、両方にすることはできません!ここでの本当の犯人は入力/出力インターフェイスです。これは「解釈する整数が何であれ」ではなく、明確に定義されたフォーマットを生成/消費する必要があります。したがって、実際の解決策は、I / Oインターフェースをテストすることです。ユニットテストを使用して、期待される形式を解析/印刷していることを確認し、統合テストを使用して、形式が反対側で実際に受け入れられていることを確認します
列挙型が「十分に実行されている」かどうか疑問に思うかもしれませんが、この場合、列挙型は再びニシンです。私たちが実際に心配しているのは、テストスイートそのものです。ここでは、いくつかの方法で自信を得ることができます。
- コードカバレッジは、テストスイートからのさまざまな列挙値がコード内のさまざまなブランチをトリガーするのに十分かどうかを示します。そうでない場合は、カバーされていないブランチをトリガーするテストを追加するか、既存のテストでさまざまな列挙型を生成できます。
- プロパティチェックは、コード内のさまざまなブランチがランタイムの可能性を処理するのに十分かどうかを判断できます。たとえば、コードがのみを処理し
red
、でのみテストするred
場合、100%のカバレッジがあります。プロパティチェッカーは、テストを忘れた値green
やblue
値の生成など、アサーションに対する反例を生成(試行)します。
- 突然変異テストでは、分岐をたどってその違いを無視するのではなく、アサーションが実際に列挙型をチェックするかどうかを知ることができます。