当只有一个参数对测试很重要时,如何测试函数参数?

时间:2011-04-20 17:09:16

标签: c# unit-testing nunit

我写了以下测试:

[TestCase(null, 0, 0, null, null, ExpectedException = typeof(ArgumentNullException), TestName = "VerifyThat_WhenBeginWriteHasANullBuffer_AnArgumentNullExceptionIsThrown")]
[TestCase(new byte[] {1,2,3}, -1, 0, null, null, ExpectedException = typeof(ArgumentOutOfRangeException), TestName = "VerifyThat_WhenBeginWriteHasANegativeSizeParameter_AnArgumentOutOfRangeExceptionIsThrown")]
[TestCase(new byte[] { 1, 2, 3 }, 4, 0, null, null, ExpectedException = typeof(ArgumentOutOfRangeException), TestName = "VerifyThat_WhenBeginWriteHasASizeParameterThatIsBiggerThanTheBufferSizeAndTheOffsetIsZero_AnArgumentOutOfRangeExceptionIsThrown")]
[TestCase(new byte[] { 1, 2, 3 }, 5, 1, null, null, ExpectedException = typeof(ArgumentOutOfRangeException), TestName = "VerifyThat_WhenBeginWriteHasASizeParameterThatIsBiggerThanTheBufferSizeMinusTheOffset_AnArgumentOutOfRangeExceptionIsThrown")]
[TestCase(new byte[] { 1, 2, 3 }, 2, -1, null, null, ExpectedException = typeof(ArgumentOutOfRangeException), TestName = "VerifyThat_WhenBeginWriteHasANegativeOffsetParameter_AnArgumentOutOfRangeExceptionIsThrown")]
[TestCase(new byte[] { 1, 2, 3 }, 2, 5, null, null, ExpectedException = typeof(ArgumentOutOfRangeException), TestName = "VerifyThat_WhenBeginWriteHasAnOffsetParameterThatIsBiggerThanTheBufferSize_AnArgumentOutOfRangeExceptionIsThrown")]
public void VerifyThat_WhenBeginWritesGivenWrongParameters_AnExceptionIsThrown(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
{
    connectedStream.BeginWrite(buffer, offset, size, callback, state);
}

我目前正在使用无效参数和随机有效参数调用BeginWrite函数 我在这做对了吗?有没有更好的方法来提供有效参数?

编辑:
在这种情况下,测试参数的有效性会影响有效参数 例如,只要偏移量为负值或者大于缓冲区大小减去偏移量,偏移量就无效。对于偏移量大于缓冲区大小减去偏移量或负数的情况,测试通过的事实并不能证明该方法总是抛出ArgumentOutOfRangeException。我总能错过一些东西 检查多个输入总是比一次更好 有没有办法自动完成?

编辑2:
AutoFixture可以成为我的解决方案吗?

编辑3:
AutoFixture没有Silverlight端口。

2 个答案:

答案 0 :(得分:2)

如果你想测试对无效参数的反应,你应该使所有其他参数有效,以避免误差导致失败。

至于如何提供这些有效的参数,就像你在其他任何你并不真正关心价值的情况一样,只使用有效的东西。

您正在测试该方法在您为其提供一个特定的无效参数时抛出,而其他所有参数都有效。只要其他论点符合您对有效的定义,您就会测试正确的事情,所以不要担心如何获取这些值。

答案 1 :(得分:2)

技术部分。

NUnit 2.5有一些新属性可以帮助自动生成测试用例:

  • Range - 使用参数范围中指定的所有数值生成多个测试用例。
  • Values - 类似于Range,您可以在其中指定单个值的列表,而不是数值范围。
  • ValueSource - 指定生成Values列表的函数。
  • TestCaseSoucre - 指定生成TestCase列表的函数。每一个细节都可以定制。

RangeValuesValueSource适用于单个参数。每个参数都可以使用自己的值属性。

用于ValueSourceTestCaseSource的函数很早就被称为,可能在 TestFixtureSetUp之前。请参阅文档以了解使用情况。

示例

  • 字节数组buffer可以使用ValueSource函数来指定缓冲区大小,这样您就可以尝试使用更大的数组而无需太多输入。
  • 对于给定的buffersize的有效范围是1到缓冲区的大小。
  • 对于给定的buffersizeoffset的有效范围是从零到大小减去大小(我将为您留下这个;它是一个连续范围)
  • 其他任何事情都超出了范围。

旁注。上述四个条件共同成为Theory,NUnit直接支持测试理论。使用理论时,您可以编写一次测试用例函数,并涵盖好的参数和错误的参数。


测试哲学部分。

  • 当您了解多种测试方法(或标准)时,请始终全部使用它们,并在每种方法中尝试一组合理的测试用例。
  • 使用自动化测试用例生成为您带来最大收益。
  • 无法访问(被测软件的)源代码并了解我们的测试代码覆盖率,我们无法确定是否遗漏了某些内容。如果需要一定程度的保证,这就是必须进行白盒测试的原因。