在 NUnit TestFixture 构造函数中使用 Values- 和 Range-Attribute
Use Values- and Range-Attribute in NUnit TestFixture constructor
我有多种测试方法可以测试多个参数的所有可能组合。我可以在这样的方法上使用 NUnit ValueAttribute 或 RangeAttribute:
[TestFixture]
public class MyExampleTests
{
[Test]
public void TestedEntity_GivenParemeter_Passes(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
if (inputA > 0 && inputB > 0)
Assert.Pass();
}
}
然而,在我的真实案例中有 4 个参数、十几个方法和更多的值,因此写出每个方法的所有值变得乏味,如果我想进行更改,我可能会某处出错了。
我如何将所有值组合的测试生成从单个方法移到 TestFixture 主体中?以下行不通,但这是我想要的:
[TestFixture]
public class MyExampleTests2
{
readonly int inputA;
readonly int inputB;
public MyExampleTests2(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
this.inputA = inputA;
this.inputB = inputB;
}
[Test]
public void TestedEntity_GivenParemeter_Passes()
{
if (this.inputA > 0 && this.inputB > 0)
Assert.Pass();
}
}
我已经知道 TestFixtureAttribute 可以带参数,但它们不能按我想要的方式工作。我只能给每个参数一个硬编码值。相反,我想使用范围并让 NUnit 为每个组合创建一个测试。另外,我希望该解决方案在 NUnit 2.6.4 中工作。
您可以使用 ValuesSource
:
[Test]
public void TestedEntity_GivenParemeter_Passes(
[ValueSource(nameof(FirstSource))] int inputA,
[ValueSource(nameof(SecondSource))] int inputB)
{
if (inputA > 0 && inputB > 0)
Assert.Pass();
}
private static readonly int[] FirstSource = { 1, 2 };
private static readonly IEnumerable<int> SecondSource = Enumerable.Range(1, 4);
如果您想避免参数声明的重复,您可以创建一个包含 InputA
和 InputB
属性的类型,以及一个返回该类型序列的源。
我有多种测试方法可以测试多个参数的所有可能组合。我可以在这样的方法上使用 NUnit ValueAttribute 或 RangeAttribute:
[TestFixture]
public class MyExampleTests
{
[Test]
public void TestedEntity_GivenParemeter_Passes(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
if (inputA > 0 && inputB > 0)
Assert.Pass();
}
}
然而,在我的真实案例中有 4 个参数、十几个方法和更多的值,因此写出每个方法的所有值变得乏味,如果我想进行更改,我可能会某处出错了。
我如何将所有值组合的测试生成从单个方法移到 TestFixture 主体中?以下行不通,但这是我想要的:
[TestFixture]
public class MyExampleTests2
{
readonly int inputA;
readonly int inputB;
public MyExampleTests2(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
this.inputA = inputA;
this.inputB = inputB;
}
[Test]
public void TestedEntity_GivenParemeter_Passes()
{
if (this.inputA > 0 && this.inputB > 0)
Assert.Pass();
}
}
我已经知道 TestFixtureAttribute 可以带参数,但它们不能按我想要的方式工作。我只能给每个参数一个硬编码值。相反,我想使用范围并让 NUnit 为每个组合创建一个测试。另外,我希望该解决方案在 NUnit 2.6.4 中工作。
您可以使用 ValuesSource
:
[Test]
public void TestedEntity_GivenParemeter_Passes(
[ValueSource(nameof(FirstSource))] int inputA,
[ValueSource(nameof(SecondSource))] int inputB)
{
if (inputA > 0 && inputB > 0)
Assert.Pass();
}
private static readonly int[] FirstSource = { 1, 2 };
private static readonly IEnumerable<int> SecondSource = Enumerable.Range(1, 4);
如果您想避免参数声明的重复,您可以创建一个包含 InputA
和 InputB
属性的类型,以及一个返回该类型序列的源。