Последовательный порядок выполнения с использованием атрибута TestCase

1

Я пытаюсь выполнить некоторые тесты производительности, используя инфраструктуру 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);
}

... и результат:

  1. 22:56:01: Сохранение 1000 пунктов в базе: 48353мс - Средняя: 20,6812400321 шт./Сек.
  2. 22:56:02: Сохранение 1 в базе данных: 40 мс - Средняя: 25 шт./Сек.
  3. 22:56:06: Сохранение 100 пунктов в базе: 3813ms - Средняя: 26,2260687323 шт./Сек.
  4. 22:56:07: Сохранение 10 элементов в базе данных: 413ms - Средняя оценка: 24,2130750605 шт./Сек.

Поэтому я бы ожидал, что сначала будет запущен [TestCase(1)], затем [TestCase(10)] и т.д. Но, как видно из результатов, этого не происходит. Есть ли способ контролировать это? Кажется, это случайный случай, когда тесты сначала заканчиваются.

Согласно документации NUnit, я думаю, ответ заключается в том, что вы не можете.

В результате, когда TestCaseAttribute появляется несколько раз по методу или когда другие атрибуты предоставления данных используются в сочетании с TestCaseAttribute, порядок тестовых случаев не определен.

У вас есть какие-нибудь хорошие идеи, как контролировать выполнение? Маленькие хаки? Другой способ сделать это? Что-нибудь?

Теги:
nunit
testcase

1 ответ

1
Лучший ответ

Вместо этого вы 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 };
}
  • 0
    Выглядит многообещающе! Я должен попробовать это. Благодарю.
  • 0
    Это сработало! Огромное спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню