为什么我的一些单元测试 运行 多次?
Why are some of my Unit Tests being run multiple times?
当我使用 Visual Studio 的内置测试引擎 运行 我的解决方案中的所有单元测试时,我会看到一些测试 运行 多次,而其他人只有 运行 一次:
Test Result Window
看来,如果同一个文件中有多个 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 Test result window
似乎没有两个测试引擎同时 运行ning,但也许有?或者也许我只是错误地构建了测试本身?有谁知道为什么这些测试会 运行 不止一次,为什么它们会被归入 类 而它们不属于?
您正在继承 class CalculateGrainDepthMethod
继承自 AerationEngineTests
。因为 class AerationEngineTests
中的这个测试执行了两次。
[TestClass]
public class CalculateGrainDepthMethod : AerationEngineTests
{
要么在 class CalculateGrainDepthMethod
中包含依赖项,要么创建一个测试助手来初始化这些值并在你的测试中使用它 classes.
当我使用 Visual Studio 的内置测试引擎 运行 我的解决方案中的所有单元测试时,我会看到一些测试 运行 多次,而其他人只有 运行 一次:
Test Result Window
看来,如果同一个文件中有多个 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 Test result window
似乎没有两个测试引擎同时 运行ning,但也许有?或者也许我只是错误地构建了测试本身?有谁知道为什么这些测试会 运行 不止一次,为什么它们会被归入 类 而它们不属于?
您正在继承 class CalculateGrainDepthMethod
继承自 AerationEngineTests
。因为 class AerationEngineTests
中的这个测试执行了两次。
[TestClass]
public class CalculateGrainDepthMethod : AerationEngineTests
{
要么在 class CalculateGrainDepthMethod
中包含依赖项,要么创建一个测试助手来初始化这些值并在你的测试中使用它 classes.