Repeating a [TestCase] 100 times in NUnit

nunitrepeatunit testingwebtest

I'm converting a webtest that loops 100 times (fires the request and validates the response 100 times) to NUnit. It seems that the [Repeat] attribute only works for [Test], not [TestCase] or any other decoration/attribute. What is the cleanest way to do this? I want to fire that one test case with those parameters 100 times, and I'd like to do it without adding a loopCount parameter to my test case and nesting my act and assert sections in a for loop.

The below code only runs once.

[TestCase("arg1", "arg2"), Repeat(100)]
public void testing(string arg1, string arg2)
{
    //Arrange

    //Act
    var response = RequestSender.SendGetRequest();

    //Assert
    AssertStuff(arg1, arg2);
}

Best Answer

From the online NUnit documentation for Repeat, it would appear that this behaviour is deliberate.

Notes:

It is not currently possible to use RepeatAttribute on a TestFixture or any other type of test suite. Only single tests may be repeated. Since a parameterized test method represents a suite, RepeatAttribute is ignored when it appears on such a method.

With the assumption that TestCase is obviously regarded as a parameterized test. The loop looks inevitable, without some additional customization?

What you could do instead is use use a test case source and feed it an enumerable of 100 repeated items:

private static readonly IEnumerable<Tuple<string, string>> _oneHundredCases = 
  Enumerable.Range(0, 100)
   .Select(_ => Tuple.Create("arg1", "arg2"));

[TestCaseSource(nameof(_oneHundredCases))]
public void testing(Tuple<string, string> theArgs)
{
    ...
    AssertStuff(theArgs.Item1, theArgs.Item2);
}

But for the same price, you may as well vary the arguments a bit?, e.g.

_oneHundredCases = 
  Enumerable.Range(0, 100)
   .Select(n => Tuple.Create(n.ToString(), $"arg{n}"));
Related Topic