2008-10-24 4 views
10

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

Наилучший подход, который я нашел до сих пор, заключается в сериализации структур или наборов данных с диска, выполнении проверяемых операций, сериализации результатов на диск, а затем разграничении файлов, содержащих сериализованные результаты, с файлами, содержащими ожидаемые результаты. Это не очень быстро, и это нарушает принцип модульного тестирования «не касайтесь диска». Однако единственная альтернатива, которую я могу придумать (написать код для инициализации и тестирования сотен членов и точек данных), кажется невыносимо утомительной.

Есть ли лучшие решения?

+0

Если вы тестируете сами данные, я считаю, что вам нужно коснуться диска. – MrBoJangles 2008-10-24 22:07:52

ответ

1

Это по-прежнему жизнеспособный подход. Хотя, я бы классифицировал это как функциональный тест, или просто не чисто модульный тест. Хорошим модульным тестом было бы взятие выборки из тех записей, которые дают хорошее распределение случаев краев, с которыми вы можете столкнуться, и записывать их. Затем у вас есть ваш последний «прием» или «функциональный» тест с вашим массовым тестом на все данные.

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

3

Если то, что вы пытаетесь достичь, это, по сути, единичный тест, который вы должны издеваться над базовыми структурами данных и имитировать данные. Этот метод дает вам полный контроль над входами. Например, каждый написанный вами тест может обрабатывать одну точку данных, и у вас будет очень сжатый набор тестов для каждого условия. Есть несколько открытых фальсификаций с открытым исходным кодом, я лично рекомендую Rhino Mocks (http://ayende.com/projects/rhino-mocks/downloads.aspx) или NMock (http://www.nmock.org).

Если вы не можете издеваться над структурами данных, я рекомендую рефакторинг, чтобы вы могли :-) Его стоит! Или вы также можете попробовать TypeMock (http://www.typemock.com/), который позволяет насмехаться над конкретными классами.

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

1

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

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

Например, ваши сериализованные данные могут быть преобразованы в:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... }; 

test() 
{ 
    MyStruct* s = (MyStruct*) mySerialisedData; 

} 

Для более подробного примера (в C#) посмотреть unit test. Он показывает пример использования некоторых жестко закодированных сериализованных данных в качестве входных данных для тестов, тестирования сборки подписей.

Смежные вопросы