Запустить генерацию один раз для нескольких тестов NUnit

283
14 октября 2021, 23:20

Подскажите пожалуйста, можно ли как-то объединить тесты, что бы несколько тестов запускали 1 метод и дожидались его выполнения. Суть такая: Есть огромная генерация, которая занимает приблизительно час времени. Нужно, что бы несколько тестов делали для себя пресетап и потом запускали генерацию и ждали её завершения, после чего продолжали свои проверки. Генерация не должна запускаться несколько раз, это очень затратно по времени и тесты тоже нельзя объединить в один

Answer 1

Допустим, имеется некий класс, который нужно протестировать, с двумя методами:

public class Foo
{
    public int Bar(List<int> list)
    {
        return list.Min();
    }
    public int Baz(List<int> list)
    {
        return list.Max();
    }
}

Тесты для него:

[TestFixture]
public class FooTests
{
    private readonly object _locker = new object();
    private List<int> _list;
    private List<int> GetData()
    {
        if (_list == null)
        {
            lock (_locker)
            {
                if (_list == null)
                {
                    Console.Beep();
                    _list = new List<int>();
                    for (int i = 0; i < 100; i++)
                    {
                        _list.Add(i);
                        Thread.Sleep(10);
                    }
                }
            }
        }
        return _list;
    }
    [Test]
    public void Foo_Bar_ReturnsCorrectResult()
    {
        // Arrange
        var list = GetData();
        var sut = new Foo();
        // Act
        var result = sut.Bar(list);
        // Assert
        Assert.AreEqual(0, result);
    }
    [Test]
    public void Foo_Baz_ReturnsCorrectResult()
    {
        // Arrange
        var list = GetData();
        var sut = new Foo();
        // Act
        var result = sut.Baz(list);
        // Assert
        Assert.AreEqual(99, result);
    }
}

Два тестовых метода используют один и тот же набор данных (List<int>), который долго генерируется (добавлен Thread.Sleep). Эти данные хранятся в поле тестового класса. Метод, первым вызвавший генерацию, будет ждать её завершения. Если тестовый фреймворк допускает параллельное выполнение тестов, то другие паралльно запущенные тестовые методы будут ждать своей очереди на блокировке.

Я использовал стандартный double lock. Можно и другие способы применить.
Console.Beep() поставлен просто для того, чтобы на слух определить, сколько раз он вызывается. Так-то он не нужен.

READ ALSO
Получить значение url из браузера

Получить значение url из браузера

После открытия браузера при помощи

128
Какая модель памяти в .NET Core?

Какая модель памяти в .NET Core?

В спецификации ECMA CLI определена слабая (weak) модель памятиЭто позволяет переупорядочивать последовательность выполнения команд (что полезно...

168
unable to connect to any of the specified mysql hosts c#

unable to connect to any of the specified mysql hosts c#

Помогите пожалуйста, я начинающий программист С#Столкнулся со следующей ошибкой при подключении к БД:

173