Приветствую вас, уважаемые читатели. В этой статье я хочу поделиться с вами опытом по автоматизации тестирования выгрузки данных из БД Oracle в MSSQL.
Для начала немного расскажу о тестируемом проекте. Наш проект предназначен для расчета вознаграждения страховых агентов. Все данные необходимые для проведения расчетов, а именно: страховые договоры; агентские договоры; данные об агентах и прочее, вводятся и хранятся в другой системе, которая построена на базе Oracle. Эти данные выгружаются в БД нашего проекта утилитой, которую мы называем «Синхронизатор» (это тоже проект, написанный нашими разработчиками). Так как данные выгружаются в 65 таблицах, в некоторых таблицах иногда заполняется более миллиона строк за раз, проверять весь этот зоопарк вручную фактически не возможно. В итоге мы пришли к тому, что этот процесс нужно как то автоматизировать. Сначала на MSSQL были написаны просто запросы для проверки, потом нам и этого стало мало, и мы организовали что-то вроде автономных тестов на MSSQL. Об этом я и буду рассказывать в этой статье.
Проанализировав проблему, мы решили, что тестирование выгруженных таблиц будет построено на хранимых процедурах. Чтобы не захламлять БД тестируемого проекта, мы создали отдельную БД на том же сервере, в которой будут находиться хранимые процедуры и таблицы с результатами тестов. Для каждой проверяемой таблицы тестируемого проекта в автотестовой БД были созданы свои таблицы, в которые будет записываться информация по не догруженным или не корректно перелитым данным. Так же была создана отдельная таблица для хранения результатов проверок.
Ниже приведен код одной из процедур для тестирования таблиц:
Как вы заметили в этой процедуре по линку отбираются данные из таблицы оракл и аналогичной таблицы в тестируемом проекте далее выполняются две проверки на основе сравнения таблиц. В первом случае при помощи джойнов выводится разница между таблицами в плане наличия данных в тестируемом проекте: тут сравнение выполняется только по ID, во втором в плане корректности данных: тут происходит сравнение по всем полям. Далее выводится разница между таблицами, если разница есть то тест провален, если разницы нет то тест пройден.
Далее код процедуры AUTOTEST_UPDATE_STATUS_TESTRESULТ она вызывается во всех проверочных процедурах и служит для установки статусов проверки таблицы:
Результат тестов выглядит так:

Если тест не пройден, можно посмотреть в таблице какие данные не до грузились или не корректны, выглядит это так:

Вот так мы замутили своеобразный автотрест на MSSQL =).
Запускать такие тесты можно при помощи поочередного вызова процедур. Так же можно сделать джоб на SQL сервере, который все будет делать за Вас. Надеюсь эта статья будет полезна, я рад поделиться с Вами своим опытом. Если будет еще какой-то интересный опыт, буду стараться писать новые статьи.
На этом я с Вами прощаюсь, всем удачи, добра и интересных задач.
Пока пока!!! =)
Для начала немного расскажу о тестируемом проекте. Наш проект предназначен для расчета вознаграждения страховых агентов. Все данные необходимые для проведения расчетов, а именно: страховые договоры; агентские договоры; данные об агентах и прочее, вводятся и хранятся в другой системе, которая построена на базе Oracle. Эти данные выгружаются в БД нашего проекта утилитой, которую мы называем «Синхронизатор» (это тоже проект, написанный нашими разработчиками). Так как данные выгружаются в 65 таблицах, в некоторых таблицах иногда заполняется более миллиона строк за раз, проверять весь этот зоопарк вручную фактически не возможно. В итоге мы пришли к тому, что этот процесс нужно как то автоматизировать. Сначала на MSSQL были написаны просто запросы для проверки, потом нам и этого стало мало, и мы организовали что-то вроде автономных тестов на MSSQL. Об этом я и буду рассказывать в этой статье.
Проанализировав проблему, мы решили, что тестирование выгруженных таблиц будет построено на хранимых процедурах. Чтобы не захламлять БД тестируемого проекта, мы создали отдельную БД на том же сервере, в которой будут находиться хранимые процедуры и таблицы с результатами тестов. Для каждой проверяемой таблицы тестируемого проекта в автотестовой БД были созданы свои таблицы, в которые будет записываться информация по не догруженным или не корректно перелитым данным. Так же была создана отдельная таблица для хранения результатов проверок.
Ниже приведен код одной из процедур для тестирования таблиц:
<anchor>habracut</anchor>
USE [AutotestProcedure]
GO
CREATE PROCEDURE [dbo].[AUTOTEST_ACCOUNTCHART]
AS
BEGIN
--Таблица очищается при каждом запуске проверки
print 'Очистка таблицы AccountChart...'
IF EXISTS(select * from AutotestProcedure.dbo.AccountChart)
BEGIN
TRUNCATE TABLE AutotestProcedure.dbo.AccountChart
END
print 'Запуск проверки AccountChart...'
--Объявляем темповые таблицы
--Таблица AdInsure
CREATE TABLE #AdInsureTablePeriod(
ExternalID nvarchar(150)
,Number nvarchar(64)
,Name nvarchar(250)
)
--Таблица AdBoIntegration
CREATE TABLE #AdBoTable(
[ID] int
,[UID] nvarchar(max)
,[AdInsureID] nvarchar(150)
,[Number] nvarchar(64)
,[Name] nvarchar(250)
)
--Результирующая таблица
CREATE TABLE #ResultTable(
[Message] nvarchar(max)
,ExternalID nvarchar(150)
,Number nvarchar(64)
,Name nvarchar(250)
)
DECLARE
@query nvarchar(max)
--Запрос для получения данных из Oracle
INSERT INTO #AdInsureTablePeriod
EXEC(N'SELECT
GL_ACCOUNT_ID "ExternalID"
,GL_ACCOUNT_NO "Number"
,DESCRIPTION "Name"
FROM adinsure_vsk.AC_GL_ACCOUNT') at [ADINSURE_PROD_WRITE]
--Запрос для получения данных из тестируемой таблицы
INSERT INTO #AdBoTable
select
[ID]
,[UID]
,[AdInsureID]
,[Number]
,[Name]
from AdBoIntegration.dbo.AccountChart
BEGIN
--Здесь выполняется проверка на наличие данных, отсутствующие данные записываются в темповую таблицу #ResultTable
insert into #ResultTable
select
'Записи таблицы AccountChart, которые отсутствую в AdBoIntegration' as [Message]
,atp.ExternalID
,atp.Number
,atp.[Name]
from #AdInsureTablePeriod atp
left join #AdBoTable abt
on abt.AdInsureId = atp.ExternalID
where abt.AdInsureId is null
--Здесь выполняется проверка на корректность выгрузки, не корректные данные записываются в темповую таблицу #ResultTable
insert into #ResultTable
select
'Записи таблицы AccountChart, которые имеют различия' as [Message]
,atp.ExternalID
,atp.Number
,atp.[Name]
from #AdInsureTablePeriod atp
inner join #AdBoTable abt1
on abt1.AdInsureId = atp.ExternalID
left join #AdBoTable abt2
on abt2.Number = atp.Number
and abt2.[Name] = atp.[Name]
where abt2.AdInsureId is null
/***Здесь если в таблице #ResultTable есть строки, то в таблице TestResult для тестируемой таблицы устанавливается статус Failed,
иначе Success
***/
IF EXISTS(select * from #ResultTable)
BEGIN
insert into AutotestProcedure.dbo.AccountChart([Message], ExternalID, Number, [Name])
select * from #ResultTable
--Вызывается процедура для записи статуса теста в таблицу TestResult
EXEC AUTOTEST_UPDATE_STATUS_TESTRESULT 'AccountChart', 'Failed'
print 'Failed AccountChart'
END
ELSE
BEGIN
--Вызывается процедура для записи статуса теста в таблицу TestResult
EXEC AUTOTEST_UPDATE_STATUS_TESTRESULT 'AccountChart', 'Success'
print 'Success AccountChart'
END
END
END
</cut>
Как вы заметили в этой процедуре по линку отбираются данные из таблицы оракл и аналогичной таблицы в тестируемом проекте далее выполняются две проверки на основе сравнения таблиц. В первом случае при помощи джойнов выводится разница между таблицами в плане наличия данных в тестируемом проекте: тут сравнение выполняется только по ID, во втором в плане корректности данных: тут происходит сравнение по всем полям. Далее выводится разница между таблицами, если разница есть то тест провален, если разницы нет то тест пройден.
Далее код процедуры AUTOTEST_UPDATE_STATUS_TESTRESULТ она вызывается во всех проверочных процедурах и служит для установки статусов проверки таблицы:
USE [AutotestProcedure]
GO
CREATE PROCEDURE [dbo].[AUTOTEST_UPDATE_STATUS_TESTRESULT]
@TableName nvarchar(max),
@Status nvarchar(max)
AS
BEGIN
update AutotestProcedure.dbo.TestResult
set [Status] = @Status
where [TableName] = @TableName
print @TableName + ' ' + @Status
END
Результат тестов выглядит так:

Если тест не пройден, можно посмотреть в таблице какие данные не до грузились или не корректны, выглядит это так:

Вот так мы замутили своеобразный автотрест на MSSQL =).
Запускать такие тесты можно при помощи поочередного вызова процедур. Так же можно сделать джоб на SQL сервере, который все будет делать за Вас. Надеюсь эта статья будет полезна, я рад поделиться с Вами своим опытом. Если будет еще какой-то интересный опыт, буду стараться писать новые статьи.
На этом я с Вами прощаюсь, всем удачи, добра и интересных задач.
Пока пока!!! =)