Я пытаюсь выполнить некоторые тесты производительности, используя инфраструктуру NUnit, например:
[TestCase(1)]
[TestCase(10)]
[TestCase(100)]
[TestCase(1000)]
public void SaveBookingTest(int numberOfItems)
{
var stopwatch = new Stopwatch();
var items = DataFactory.CreateItems(numberOfItems);
stopwatch.Start();
service.SaveItems(items);
stopwatch.Stop();
SaveResults(stopwatch.ElapsedMilliseconds);
}
... и результат:
- 22:56:01: Сохранение 1000 пунктов в базе: 48353мс - Средняя: 20,6812400321 шт./Сек.
- 22:56:02: Сохранение 1 в базе данных: 40 мс - Средняя: 25 шт./Сек.
- 22:56:06: Сохранение 100 пунктов в базе: 3813ms - Средняя: 26,2260687323 шт./Сек.
- 22:56:07: Сохранение 10 элементов в базе данных: 413ms - Средняя оценка: 24,2130750605 шт./Сек.
Поэтому я бы ожидал, что сначала будет запущен [TestCase(1)]
, затем [TestCase(10)]
и т.д. Но, как видно из результатов, этого не происходит. Есть ли способ контролировать это? Кажется, это случайный случай, когда тесты сначала заканчиваются.
Согласно документации NUnit, я думаю, ответ заключается в том, что вы не можете.
В результате, когда TestCaseAttribute появляется несколько раз по методу или когда другие атрибуты предоставления данных используются в сочетании с TestCaseAttribute, порядок тестовых случаев не определен.
У вас есть какие-нибудь хорошие идеи, как контролировать выполнение? Маленькие хаки? Другой способ сделать это? Что-нибудь?
Вместо этого вы TestCaseSourceAttribute
использовать TestCaseSourceAttribute
? Или это не применимо к вам в конкретной ситуации? Интересной частью документации является:
Однако, когда один TestCaseSourceAttribute используется сам по себе, порядок тестов точно соответствует порядку, в котором тестовые примеры возвращаются из источника.
Измененный код будет выглядеть так:
[Test, TestCaseSource("GetTestCaseSource")]
public void SaveBookingTest(int numberOfItems)
{
var stopwatch = new Stopwatch();
var items = DataFactory.CreateItems(numberOfItems);
stopwatch.Start();
service.SaveItems(items);
stopwatch.Stop();
SaveResults(stopwatch.ElapsedMilliseconds);
}
public IEnumerable<int> GetTestCaseSource()
{
return new[] { 1, 10, 100, 1000 };
}