Данный проект содержит класс, реализующий проверку входных данных на основании предоставленных SQL-запросов и .sql файлов, содержащих данные в формате CSV
Все методы, реализованные в классе, принимают на вход два строковых параметра (пути до SQL-файлов источника (далее source) внутри директории resources и ожидаемого результата (далее target)).
Все данные для тестирования содержатся в директории src/main/resources, названия файлов соответствуют следующему паттерну:
test_< номер теста >_< source|target >_< counts|arrays|ddl|constants >.sql
- Тестирование количества строк на источнике (в прототипе и витрине). Два sql-запроса должны выдать одинаковый результат
- Тестирование по атрибутам n-го количества строк в витрине с результатом прототипа. В этом подходе также два sql-запроса, один к витрине, второй к источнику, они должны выдать одинаковый результат
- Тестирование структуры данных. Приложенный DDL должен равняться результату describe витрины
- Тестирование данных в витрине/столбце с набором констант. Например, максимальный report_dt должен быть равен какому-то значению
В классе AutoTest реализованы 4 основных метода тестирования:
- isEqualCounts - первый кейс тестирования
- isEqualDF - второй кейс тестирования
- isEqualSchemas - третий кейс тестирования
- isCurrentConstants - четвертый кейс тестирования
Также класс содержит приватный метод appendTestRes, который используется методами тестирования для формирования отчетности по пройденным тестам. Данный метод записывает в приватное поле класса results названия тестов (номер теста и метод, который использовался при тестировании) и результат тестирования true - тест пройден успешно, в противном случае текстовое сообщение с информацией о том, почему тест завершился неудачно.
В классе реализован метод parseResult, при вызове которого происходит чтение сформированной переменной results, метод выводит название теста и его результат (Success или Сообщение с причиной ошибки), после чего, в случае, если есть хотя бы один неуспешный тест, данный метод "выбрасывает" исключение, название которого содержит результаты всех тестов, а также список "провальных" тестов.
Метод getTestName используется для получения названия теста из пути к файлу. В дальнейшем это имя используется при отображении результатов тестирования.
Также в классе реализован метод readDdlFromResource, который используется в тесте isEqualSchemas для чтения из ресурсов файла, содержащего DDL таблицы в формате csv.
Методы start и startTestingOnCluster используются для автоматического запуска всех тестов, находящихся в директории src/main/resources. Первый метод используется для запуска локально, второй - для запуска в контуре (то есть когда запуск будет из jar файла).
Также дополнительно в классе реализован метод isEqualDataframes, который сравнивает результаты двух sql-запросов на совпадение
- В качестве разделителя для чисел с плавающей точкой необходимо использовать символ
. - В качестве разделителя для csv-файлов необходимо использовать символ
; - В случае, если требуется указать значение
nullв тесте isEqualConstants, значение необходимо указывать маленькими буквами. Пример строкиtarget-файла, содержащегоnullзначение:2;2;0;5300;null - В
sourceфайле тестаisEqualSchemasнеобходимо указывать только два столбца:название атрибута,тип атрибута, комментарий указывать не требуется
Для использования данного класса необходимо добавить в проект package testClass, содержащий файл AutoTest, после чего импортировать его в основной класс проекта. Далее, необходимо создать экземпляр класса, передав ему в аргументы SparkSession и вызвать метод start, в случае запуска локально, либо startTestingOnCluster, в случае, если в дальнейшем проект будет собран в jar-file и запуск будет производиться на кластере, либо в airflow.