Стресс-тест C# - Моделирует множественный доступ к данному совместно используемому ресурсу

Как можно моделировать/стресс-тест приблизительно 100 пользователей, получающих доступ к данному совместно используемому ресурсу (например, База данных) в c# модульном тесте?

6
задан Aliaksandr Belik 9 February 2012 в 17:36
поделиться

3 ответа

Предполагая, что вы обращаетесь к реальной БД, вы попадаете в область интеграционных тестов. Самый простой способ - получить доступ к ресурсу из нескольких потоков. Например:

[Test]
public void SimpleStressTest()
{
    bool wasExceptionThrown = false;
    var threads = new Thread[100];
    for(int i = 0; i < 100; i++)
    {
        threads[i] = 
            new Thread(new ThreadStart((Action)(() =>
            {
                try
                {                        
                    AccessDB();
                }
                catch(Exception)
                {
                    wasExceptionThrown = true;
                }

            })));
    }

    for(int i = 0; i < 100; i++)
    {
        threads[i].Start();
    }    
    for(int i = 0; i < 100; i++)
    {
        threads[i].Join();
    }

    Assert.That(wasExceptionThrown, Is.False);
}

Этот тест не является детерминированным, поскольку вы не можете контролировать поток потоков. Если вы хотите убедиться, например, что 100 соединений могут быть открыты одновременно, вы можете поместить ловушку в логику AccessDB () , которая заставит ее ждать, прежде чем она закроет соединение. в БД.

Например, вместо предыдущего действия потока:

try
{                        
    AccessDB(sychObject);
}
catch(Exception)
{
    wasExceptionThrown = true;
}

После запуска всех потоков убедитесь, что у вас есть 100 потоков, ожидающих sychObject , и только затем отпустите его и присоединитесь к потокам. То же самое можно сделать, сделав логику CloseConnection () (например) virtual и написав тест для наследуемого класса, ожидающего в CloseConnection () . Например:

public class DataBase
{
    public void AccessDB()
    {
        // Do logic here before closing connection
        CloseConnection();
    }

    protected virtual void CloseConnection()
    {
        // Real Logic to close connection
    }
}

public class FakeDataBase : DataBase
{
    ManualResetEvent sychObject;

    public FakeDataBase(ManualResetEvent sychObject)
    {
        this.sychObject = sychObject;
    }

    override protected void CloseConnection()
    {
        sychObject.WaitOne();
        base.CloseConnection();
    }
}
11
ответ дан 8 December 2019 в 15:59
поделиться

Вы просто не можете провести полезное нагрузочное тестирование чего-либо с помощью модульного теста. Нагрузочное тестирование - это отдельное занятие с совершенно разными целями. Ваши модульные тесты должны доказать, что код функционирует в соответствии со спецификациями. Нагрузочное тестирование - это поиск узких мест, чтобы вы могли их устранить.

4
ответ дан 8 December 2019 в 15:59
поделиться

Я провел тестирование производительности и нагрузки с помощью бесплатной утилиты WCAT http://www.iis.net/downloads/community/2007 / 05 / wcat-63- (x86) . Сейчас он немного устарел, но начать работу было легко, об этом много статей в Интернете, и он казался гибким.

0
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: