5

これは非常に基本的な質問ですが、それでも適切な答えを見つけることができません。私のテストでは、null値を持つ可能性があり、そのため、最終段階(Act)が少し奇妙に見え始めます(もはやactだけではありません)。私が意味するのは次のとおりです。

Assert.IsNotNull(variable);

var newVariable = variable.Property;
Assert.IsNotNull(newVariable);

var finalVariable = newVariable.AnotherProperty;
Assert.AreEqual(3, finalVariable.Count);

今、それらは明らかに関連しており、値がnullでないことを確認する必要がありますが、1つのテストに3つのアサートがあり、動作部分が正しくないように見え始めます。

では、そのような場合の一般的な解決策は何ですか?それぞれ1つのアサーションを使用して最後の2つのアサーションの前にnullをチェックする3つのテストよりも賢いものはありますか?

4

4 に答える 4

1

基本的に、問題に対処するには2つの方法があります。

  1. ガードアサーション:適切なテストが行​​われる前にデータが既知の状態にあることを確認する追加のアサーション(これが現在行っていることです)。
  2. ガードアサーションを独自のテストに移動します。

どのオプションを選択するかは、テスト対象のコードによって大きく異なります。前提条件が他のテストで重複する場合は、別のテストアプローチのヒントになります。前提条件が本番コードに反映されている場合は、別のテストアプローチのヒントになります。

一方、自信を高めるために行うことだけの場合は、個別のテストが多すぎる可能性があります(ただし、他の回答に記載されているように、テストを完全に制御していないか、または一度に多くのことを再テストします)。

于 2012-09-15T22:49:28.397 に答える
0

このテストを3つのテストに分割し、何が起こっているかに応じて名前を付ける必要があると思います。これらのテストでの行動が同じであっても、メソッドの戻り値をチェックすることでさまざまなシナリオをテストしている場合でも、完全に賢明です。

于 2012-09-15T21:09:12.497 に答える
0

ヌルは王室の痛みです。問題は、それらが合法的に存在できるかどうかです。

議論をコードとテストに分けましょう。

nullが存在してはならない場合は、テストではなくコード自体がnullでないことを確認して確認する必要があります。このため、私のコードのすべてのメソッドは、引数をチェックするスニペットを使用して構築されています。

    public VideoPosition(FrameRate theFrameRate, TimeSpan theAirTime)
    {

        Logger.LogMethod("theVideoMovie", theFrameRate, "theAirTime", theAirTime);
        try
        {
            #region VerifyInputs

            Validator.Verify(theFrameRate);
            Validator.Verify(theAirTime);
            Validator.VerifyTrue(theAirTime.Ticks >= 0, "theAirTime.Ticks >= 0");

nullがコードで正当であるが、戻り値がnullであってはならないシナリオをテストしている場合は、もちろん、テストコードでこれを確認する必要があります。

于 2012-09-15T21:10:07.303 に答える
0

ユニットテストでは、テスト対象のクラスへのすべての入力を制御できる必要があります。これは、変数に値があるかどうかを制御することを意味します。

したがって、変数をnullに強制する単体テストが1つあり、これをアサートします。

次に、変数に値があり、他のアサートが必要であることを確認できる別のテストがあります。

これについては少し前にブログを書きました。多分それは助けることができます:ユニットテスト、地獄または天国?

于 2012-09-15T21:11:29.860 に答える