Почему некоторые из моих модульных тестов выполняются несколько раз? - PullRequest
0 голосов
/ 02 мая 2018

Когда я запускаю все модульные тесты в своем решении с помощью встроенного в Visual Studio механизма тестирования, я вижу, что некоторые тесты запускаются несколько раз, а другие - только один раз:

Окно результатов теста

Похоже, что если в одном файле несколько TestClass, все становится запутанным. В этом файле, например:

[TestClass]
public class AerationEngineTests
{
    protected IAerationEngine aerationEngine;
    protected AerationPackage aerationPackage;
    protected BinPackage bin;

    [TestInitialize]
    public void TestInitialize()
    {
        aerationEngine = new AerationEngine();
        aerationPackage = new AerationPackage();
        bin = new BinPackage();
        bin.Children.Add(new Shell {ShellDiameter = 75, RingCount = 15, RingHeight = RingHeights.RingHeight32});
    }

    [TestMethod]
    public void ShouldCalculateFloorArea()
    {
        // Arrange


        // Act
        var floorArea = aerationEngine.CalculateFloorArea(aerationPackage, bin);

        // Assert
        floorArea.ShouldBeInRange(4417.86, 4417.87);
    }

    [TestMethod]
    public void ShouldCalculateBinCapacity()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Peaked;
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);
        var floorArea = aerationEngine.CalculateFloorArea(aerationPackage, bin);
        var calculations = new FanCalculations {GrainDepth = grainDepth, FloorArea = floorArea};

        // Act
        var binCapacity = aerationEngine.CalculateMaxBinCapacity(calculations);

        // Assert
        binCapacity.ShouldBeInRange(175525.88, 175525.9);
    }

    [TestMethod]
    public void ShouldCalculateTargetAirFlow()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Peaked;
        aerationPackage.DesiredAirFlow = AirFlowRates.AirFlowOne4th;
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);
        var floorArea = aerationEngine.CalculateFloorArea(aerationPackage, bin);
        var calculations = new FanCalculations {GrainDepth = grainDepth, FloorArea = floorArea};
        var binCapacity = aerationEngine.CalculateMaxBinCapacity(calculations);
        calculations.MaxBinCapacity = binCapacity;

        // Act
        var airflow = aerationEngine.CalculateTargetAirflow(aerationPackage, calculations);

        // Assert
        airflow.ShouldBeInRange(43881.46, 43881.48);
    }

    [TestMethod]
    public void ShouldCalculateTargetAirFlowPerFan()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Peaked;
        aerationPackage.DesiredAirFlow = AirFlowRates.AirFlowOne4th;
        aerationPackage.FanCount = 4;
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);
        var floorArea = aerationEngine.CalculateFloorArea(aerationPackage, bin);
        var calculations = new FanCalculations {GrainDepth = grainDepth, FloorArea = floorArea};
        var binCapacity = aerationEngine.CalculateMaxBinCapacity(calculations);
        calculations.MaxBinCapacity = binCapacity;
        var airflow = aerationEngine.CalculateTargetAirflow(aerationPackage, calculations);
        calculations.TargetAirFlow = airflow;
        // Act
        var flowPerFan = aerationEngine.CalculateTargetAirflowPerFan(aerationPackage, calculations);

        // Assert
        flowPerFan.ShouldBeInRange(10970.3, 10970.4);
    }

    [TestMethod]
    public void ShouldCalculateFloorPressure()
    {
        // Arrange

        // Act
        var floorPressure = aerationEngine.CalculateFloorPressure(aerationPackage, bin);

        // Assert
        floorPressure.ShouldBeInRange(1943.0, 1945.0);
    }

    [TestMethod]
    public void ShouldCalculateTrenchWidth()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Peaked;
        aerationPackage.DesiredAirFlow = AirFlowRates.AirFlowOne4th;
        aerationPackage.FanCount = 4;
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);
        var floorArea = aerationEngine.CalculateFloorArea(aerationPackage, bin);
        var calculations = new FanCalculations {GrainDepth = grainDepth, FloorArea = floorArea};
        var binCapacity = aerationEngine.CalculateMaxBinCapacity(calculations);
        calculations.MaxBinCapacity = binCapacity;
        var airflow = aerationEngine.CalculateTargetAirflow(aerationPackage, calculations);
        calculations.TargetAirFlow = airflow;
        var flowPerFan = aerationEngine.CalculateTargetAirflowPerFan(aerationPackage, calculations);
        calculations.TargetAirFlowPerFan = flowPerFan;

        // Act
        var trenchWidth = aerationEngine.CalculateTrenchWidth(calculations);

        // Assert
        trenchWidth.ShouldBe(72);
    }
}

[TestClass]
public class CalculateGrainDepthMethod : AerationEngineTests
{
    [TestInitialize]
    public new void TestInitialize()
    {
        base.TestInitialize();
    }

    [TestMethod]
    public void ShouldCalculateLevelFillHeight()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Level;

        // Act
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);

        // Assert
        grainDepth.ShouldBe(40.0);
    }

    [TestMethod]
    public void ShouldCalculatePeakedFillHeight()
    {
        // Arrange
        aerationPackage.FillType = FillTypes.Peaked;

        // Act
        var grainDepth = aerationEngine.CalculateGrainDepth(aerationPackage, bin);

        // Assert
        grainDepth.ShouldBeInRange(46.64, 46.66);
    }
}

Тесты внутри CalculateGrainDepthMethod запускаются один раз, но остальные методы теста запускаются дважды, и они группируются в CalculateGrainDepthMethod. Смотрите эту картинку (используя инструменты ReSharper):

Окно результатов теста ReSharper

Не похоже, что одновременно работают два тестирующих движка, но, может быть, есть? А может я просто неправильно структурировал сами тесты? Кто-нибудь знает, почему эти тесты будут выполняться более одного раза и почему они будут сгруппированы по классам, к которым они не относятся?

1 Ответ

0 голосов
/ 02 мая 2018

Вы наследуете класс CalculateGrainDepthMethod наследует от AerationEngineTests. Из-за этого тесты в классе AerationEngineTests выполняются дважды.

[TestClass]
public class CalculateGrainDepthMethod : AerationEngineTests
{

Либо имейте зависимости, содержащиеся в классе CalculateGrainDepthMethod, либо создайте помощник по тестированию, который инициализирует эти значения и использует его в обоих ваших тестовых классах.

...