2017-11-07 4 views
3

単体テストを試してみましたが、簡単な例を書いています。ユニットテストには減算を行うのに時間がかかります

テスト済みコード:

public class Operations 
{ 
    public static double Subtraction(double number1, double number2) 
    { 
     return number1 - number2; 
    } 

    public static double Addition(double number1, double number2) 
    { 
     return number1 + number2; 
    } 

    public static double Division(double number1, double number2) 
    { 
     if (number2 != 0) 
     { 
      return number1/number2; 
     } 
     else 
     { 
      return number1; 
     } 
    } 

    public static double Multiplication(double number1, double number2) 
    { 
     return number1 * number2; 
    } 
} 

試験方法:

[TestClass()] 
public class OperationsTests 
{ 
    [TestMethod()] 
    public void SubtractionTest1() 
    { 
     double number1 = 0; 
     double number2 = 10; 
     double result = Operations.Subtraction(number1, number2); 
     Assert.AreEqual(-10, result); 
    } 

    [TestMethod()] 
    public void SubtractionTest2() 
    { 
     double number1 = 10; 
     double number2 = 0; 
     double result = Operations.Subtraction(number1, number2); 
     Assert.AreEqual(10, result); 
    } 

    [TestMethod()] 
    public void SubtractionTest3() 
    { 
     double number1 = 10; 
     double number2 = 10; 
     double result = Operations.Subtraction(number1, number2); 
     Assert.AreEqual(0, result); 
    } 

    [TestMethod()] 
    public void AdditionTest1() 
    { 
     double number1 = 0; 
     double number2 = 10; 
     double result = Operations.Addition(number1, number2); 
     Assert.AreEqual(10, result); 
    } 

    [TestMethod()] 
    public void AdditionTest2() 
    { 
     double number1 = 10; 
     double number2 = 0; 
     double result = Operations.Addition(number1, number2); 
     Assert.AreEqual(10, result); 
    } 

    [TestMethod()] 
    public void AdditionTest3() 
    { 
     double number1 = 10; 
     double number2 = 10; 
     double result = Operations.Addition(number1, number2); 
     Assert.AreEqual(20, result); 
    } 

    [TestMethod()] 
    public void DivisionTest1() 
    { 
     double number1 = 0; 
     double number2 = 10; 
     double result = Operations.Division(number1, number2); 
     Assert.AreEqual(0, result); 
    } 

    [TestMethod()] 
    public void DivisionTest2() 
    { 
     double number1 = 10; 
     double number2 = 0; 
     double result = Operations.Division(number1, number2); 
     Assert.AreEqual(10, result); 
    } 

    [TestMethod()] 
    public void DivisionTest3() 
    { 
     double number1 = 10; 
     double number2 = 10; 
     double result = Operations.Division(number1, number2); 
     Assert.AreEqual(1, result); 
    } 

    [TestMethod()] 
    public void MultiplicationTest1() 
    { 
     double number1 = 0; 
     double number2 = 10; 
     double result = Operations.Multiplication(number1, number2); 
     Assert.AreEqual(0, result); 
    } 

    [TestMethod()] 
    public void MultiplicationTest2() 
    { 
     double number1 = 10; 
     double number2 = 0; 
     double result = Operations.Multiplication(number1, number2); 
     Assert.AreEqual(0, result); 
    } 

    [TestMethod()] 
    public void MultiplicationTest3() 
    { 
     double number1 = 10; 
     double number2 = 10; 
     double result = Operations.Multiplication(number1, number2); 
     Assert.AreEqual(100, result); 
    } 
} 

すべてのテストがエラーなしで実行されているが、私は他の人が1ミリ秒未満を取るながらSubtractionTest1は常に7-8-9msたことに気づきましたなぜあなたは私に説明することができますか?

試験は結果:

enter image description here

+2

おそらく、いくつかのテスト初期化のためです。もしあなたが本当にそれを気にしていれば、DotTraceのようなプロファイラを使って、どのメソッドコールに時間差があるかを判断することができます。 – HimBromBeere

+1

@HimBromBeereが正しいです。テストを実行するたびに、テストランナーや関連する他のコンポーネントが一度初期化されるため、そのうちの1つが他のテストよりも長く実行されるように見えます。それが決定論的に最初に実行される場合は、毎回1つの同じテストになる可能性があります。これは、パフォーマンスに関して実装に間違いがあることを意味するものではありません。 –

+0

しかし、SubtractionTest1が最初に実行されたテストではないことを考慮すると、これは私にとっては不公平です。 –

答えて

3

MSTestを、これは時々タイミングまたは共有状態のバグを公開できるようにユニットテストは、で実行する順序をランダム化します。

最初に実行するテストは、それぞれのメソッドと型をJITコンパイルするために必要なものであり、実行する静的な初期化がある場合はこれもトリガーされるので時間がかかります。

私は、依存性注入フレームとモッキングフレームワークの両方を初期化していたため、最初のテストでは常に約0.5秒かかる単体テストがありました。テストポストの初期化はすべて、約1ms〜2msかかるでしょう。あなたがここで見る行動は全く正常です。

パフォーマンステストでは、結果を平均化して最初の結果を破棄し、初期化時間を削除する必要があります。それがアプリケーションに関連する場合は、初期化の速度もテストする必要がありますが、一度起動してからオンラインにして準備ができているサーバーには通常は関係ありません。

関連する問題