Есть внешнее приложение, которое загружает данные из XML в БД по определённым правилам (которых сотни).
XML не гарантирует вставку данных в таблицу (если данные не изменялись, инсёрт не происходит). Апдейтов нет: либо инсёрт, либо ничего. На самом деле апдейты есть, но это совершенно не проблема. Будем считать, что их нет.
Вопрос: как бы Вы предложили проверять корректность переноса данных?
Ищу решение, которое будет отлично от моего и будет использовать стандартный фреймворк (тот же JUnit, например, или TestNG).
Моё решение: написал свой фреймворк. Создал "модельный" класс Table.java, олицетворяющий запись в БД.
Класс Table содержит:
- приватный список полей, по названию (для удобства) и количеству полностью совпадающий со списком полей в интересующей таблице в БД
- публичные методы геттеры и сеттеры (на всякий случай)
- конструктор, принимающий на вход кусок XML, который матчится в базу, и заполняющий объект в соответствии с тем, что должно лежать в БД.
Сам по XML формирую объект Table table = new Table(<кусок XML в виде объекта>);
Далее вызываю предварительно написанный метод CheckDB.checkTable(table, true), принимающий на вход проверяемый объект и булевскую переменную, символизирующую необходимость существования этой записи (должна ли она вообще появиться), который внутри себя выполняет:
sQuery = "select ....."; // Гарантия, что в случае обнаружения найдётся именно моя запись = 100% (селект грамотный) String[][] resultTable = db.getDataAsTable(sQuery); // первая строка в массиве - имена полей в результате запроса if (need) { if (resultTable.length > 1) { assertString(result[0][0], table.getField1(), result[1][0]); // ассёрт самописный assertString(result[0][1], table.getField2(), result[1][1]); ........................... assertString(result[0][N], table.getFieldN(), result[1][N]); if (resultTable.length > 2) { commonLog("Есть лишние записи! <=== FAIL!!!"); for (int i = 2; i < resultTable.length; i++) { commonLog(Arrays.asList(resultTable[i]).toString()); } } } else { commonLog("Запись отсутствует <=== FAIL!!!"); } } else { if (resultTable.length > 1) { commonLog("Запись не должна была появиться! <=== FAIL!!!"); commonLog(Arrays.asList(resultTable[1]).toString()); } else { commonLog("Запись отсутствует (CORRECT)"); } }Каждое несоответствие в ассёрте - это +1 фэйл.
С одной стороны, вроде бы, хорошо. Но это самописный фреймворк, который формирует также самописный отчёт в текстовом файлике. Не хочется тратить время на велосипед - созрел для использования стандартной JUnit-овской или ещё какой-либо шаблонной, другими написанной и откатанной отчётности.
С другой стороны, когда начинаю думать о JUnit, понимаю, что там +1 фейл - это весь тестовый класс-файл.
Соответственно, если мне надо проверить N полей и получить +K фейлов, мне нужно писать N одинаковых тестовых класс-файлов с проверкой одного соответствующего поля в БД? Да я сдохну! Плюс копипаст - это неправильно. В общем, эта идея мне явно не по душе!
Поделитесь своим опытом - что посоветуете? Как Вы проверяете корректность данных в БД?
Уверен, должны быть способы/технологии, о которых я ещё не знаю.