Как я могу заплатить только один раз, чтобы предоставить один и тот же дорогой источник данных для нескольких модульных тестов?

G'day!

У меня 4,6 ГБ тестовых данных в 220 000 файлов . Массовое тестирование требует поиска, сопоставления и распаковки пар файлов. Я хочу запустить несколько юнит-тестов для каждой пары. Это займет ужасно много времени, если я не смогу убедить среду тестирования найти, сопоставить и разархивировать данные теста только один раз, независимо от количества юнит-тестов, нуждающихся в этих данных.

TestDataSource от NUnit показался подходящим только для одного модульного теста, но, похоже, он запускается сначала на глубину с несколькими модульными тестами: каждый тест проходит через весь набор данных, один тест за другим.

Существует ли тестовая среда, которая может запускаться в ширину , загружая каждый элемент данных один раз и предоставляя его для нескольких модульных тестов?

Какой другой подход я мог бы попробовать, который даст мне все результаты теста для каждого элемента, а не просто проход или первый ошибочный результат?

24.09.2009 00:12:04
2 ОТВЕТА

Вы можете поместить все свои тесты в один класс и использовать настройку тестового устройства ( http://www.nunit.org/index.php?p=fixtureSetup&r=2.2.10 ), чтобы выполнить долгую настройку, а затем все свои тесты. используют те же данные. Единственная проблема заключается в том, что если какой-либо из ваших тестов изменит данные, то он может испортить следующий тест, так как вам не следует создавать тесты в определенном порядке.

0
24.09.2009 00:25:41
TextFixtureSetup может загрузить данные, но мне понадобится 20 ГБ ОЗУ для хранения набора данных. :)
Garth Kidd 24.09.2009 01:51:51
Вы не можете просто поместить его в базу данных, и тогда ваша программа установки получит данные, необходимые для вашего теста?
James Black 24.09.2009 02:07:04
5 ГБ тестовых данных - это база данных. Хотя, возможно, вы правы, и я должен освободить место на диске, используя несжатые ZIP-файлы, чтобы уменьшить нагрузку на процессор.
Garth Kidd 25.09.2009 00:11:08

Я сомневаюсь, что есть простое решение из коробки. Обычный шаблон - просто запускать один модульный тест за другим, возможно, вводя несколько входов в каждый тест.

В вашем случае я бы попробовал что-то вроде следующего.

[TestMethod]
public void MyTest()
{
    Action<Data>[] subtests = GenerateArrayOfDelegatesForAllSubtests();

    while (this.TestDataAvailiable())
    {
        Data data = this.GetNextTestDataSet();

        foreach (Action<Data> subtest in subtests)
        {
            try
            {
                subtest(data);
            }
            catch (Exception exception)
            {
                this.RecordFailedSubtestResult(subtest, data, exception);
            }
        }
    }

    this.UseRecordedSubtestResultsToFailTestWithMeaningfulMessage();
}

Это много нестандартной работы, но я не знаю, что в настоящий момент я не могу придумать лучшего решения. Надеюсь это поможет.

1
24.09.2009 00:38:01
Это вполне может быть подход, который я в конечном итоге выбрал. Было бы лучше, если бы я мог использовать инфраструктуру NUnit, чтобы найти подтесты и сообщить об ошибках.
Garth Kidd 24.09.2009 01:53:38