Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit test takes more time to do a subtraction

I was trying Unit Tests by writing simple examples.

Tested code:

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;
    }
}

Test Methods:

[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);
    }
}

Every test is executing without any error but i noticed that SubtractionTest1 took always 7-8-9ms while the others take less than 1ms, can you explain me why?

Tests result:

enter image description here

like image 561
Marco Salerno Avatar asked Nov 17 '25 22:11

Marco Salerno


1 Answers

MSTest will randomise the order that unit tests run in, as this can sometimes expose bugs in timing or shared state.

Which ever test you run first will take longer because it will be the one required to both JIT compile each of your methods and types and if any of those types have static initialisation to perform then this will also trigger.

I had a unit test suite where the first test would always take approximately 0.5s because I was initialising both the dependency injection and mocking frameworks. Every test post initialisation would take approximately 1ms to 2ms. So the behaviour you see here is totally normal.

For performance testing you must average your results and discard your first result to remove intialisation time from them. You should also test your initialisation speed if that is relevant to your application, but it's usually irrelevant for a server that boots once then stays online and ready.

like image 178
Spence Avatar answered Nov 19 '25 11:11

Spence