Search
Write a publication
Pull to refresh

Автоматизация тестирования переливки данных БД

Приветствую вас, уважаемые читатели. В этой статье я хочу поделиться с вами опытом по автоматизации тестирования выгрузки данных из БД Oracle в MSSQL.

Для начала немного расскажу о тестируемом проекте. Наш проект предназначен для расчета вознаграждения страховых агентов. Все данные необходимые для проведения расчетов, а именно: страховые договоры; агентские договоры; данные об агентах и прочее, вводятся и хранятся в другой системе, которая построена на базе 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 сервере, который все будет делать за Вас. Надеюсь эта статья будет полезна, я рад поделиться с Вами своим опытом. Если будет еще какой-то интересный опыт, буду стараться писать новые статьи.

На этом я с Вами прощаюсь, всем удачи, добра и интересных задач.

Пока пока!!! =)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.