Один из способов оценки покрытия операторов при тестировании pl\sql кодов |
29.09.2008 13:32 |
Автор: Дмитрий Юшкевич В основу этой методики лег тот факт, что все развитые промышленные СУБД имеют то или иное средство профилирования своих процедур. Его основное предназначение — оценка производительности написанного кода (функции, процедуры и т.д.). Но есть и приятная второстепенная особенность: обычно это средство (в Oracle — пакет dbms_ profiler) имеет возможность получать статистику по номерам выполненных строк кода. Этой статьей я бы хотел несколько сгладить уклон в сторону «black box testing», который явно просматривается как в статьях, так и на страницах форума. Все знают о существовании 2-х основных методологий тестирования — «черного» и «белого» ящика («серый ящик», как производную от этих двух методологий, оставляю за границей данного обсуждения). Не буду писать о пользе тестирования «белого ящика» и о том, что в рамках тестирования «белого ящика» используется гораздо больше технологий, чем просто оценки покрытия (и не только операторов). Однако замечу, что традиции тестирования таковы, что «белая» проверка считается, в основном, делом самих разработчиков ПО — т.е. программистов. Но жизнь зачастую взваливает заботу о «белом ящике» все-таки на плечи тестировщиков. Существует достаточно много автоматических средств (они неоднократно упоминались и на этом сайте, во главе с наиболее известным представителем от Rational — PureCoverage), которые позволяют оценить покрытие операторов. Однако эти средства жестко ориентированы на язык программирования (это и понятно), и, в основном, — на С++ (что тоже не удивительно). В силу производственной необходимости, меня интересовало покрытие операторов кода, написанного на pl\ sql (для Oracle). Ни о каких существующих «Oracle-ориентированных» средствах я не слышал. Поэтому пришлось разрабатывать определенную методику. В основу этой методики лег тот факт, что все развитые промышленные СУБД имеют то или иное средство профилирования своих процедур. Его основное предназначение — оценка производительности написанного кода (функции, процедуры и т.д.). Но есть и приятная второстепенная особенность: обычно это средство (в Oracle — пакет dbms_ profiler) имеет возможность получать статистику по номерам выполненных строк кода. Именно эту особенность я и использовал для проверки своих приложений, не имеющих визуальной части, а состоящих только из серверного pl\sql-ного кода. В качестве примеров таких приложений можно привести приложения-загрузчики файлов в БД (обработчики строк), серверные процессы расчета абонентской платы, тарификации, биллинга, широко использующиеся в биллинговых системах. Для оценки покрытия при помодульном тестировании приложений (Unit Test) я использовал сам профайлер — пакет dbms_ profiler — и три его служебные таблицы: PLSQL_ PROFILER_ RUNS, PLSQL_ PROFILER_ UNITS, PLSQL_ PROFILER_ DATA. В общих словах, методика выглядит следующим образом:
selectdistinct d.line# from PLSQL_PROFILER_DATA pd, PLSQL_PROFILER_UNITS pu where pd.runid = pu.runid and pd.unit_number = pu.unit_number and pu.unit_type = 'PACKAGE BODY' and pu.unit_name = SQL_NAME, где SQL _ NAME — имя тестируемого пакета. Соотношение числа хотя бы раз выполнившихся строк (значение поля PLSQL_PROFILER_DATA. total_ occur != 0) к их общему числу дает текущий коэффициент охвата. Назовем его Result. Если полученное значение больше или равно назначенного коэффициента (например, 0.9), то на этом оценку покрытия завершаю. Интересно отметить, что первичный проход по основной функциональности модуля у меня еще ни разу не показывал коэффициента, больше чем 0.4.
Должен отметить, что использование подобной методики, кроме, собственно, оценки покрытия кода, добавляет тестировщику уверенности в том, что он «везде побывал» и дает ему право утверждать, что алгоритм работы приложения стал для него значительно «прозрачнее». Уверен, что «white box testing» может существенно снизить стоимость исправления ошибки и повысить конечное качество проверяемого продукта. |