Comments (12)
А как вы планировали создать connection для базы данных, если у вас в build.gradle по умолчанию задано просто 'mysql'? И дальше вы пытаетесь сравнить полную строку для подключения со строкой 'mysql' и, соответственно, у вас нет никаких совпадений (честно говоря, не совсем понял для чего это сравнение, но с этим будем разбираться на ревью)
from diplom.
Разве передаваемый в System.getProperty string mysql не равен уже созданному в .class string mysql?
"честно говоря, не совсем понял для чего это сравнение, но с этим будем разбираться на ревью"
всё достаточно просто - название столбца count в mysql и postgres отличается при запросе select count(1) ... , соответственно я не могу и в той, и в другой базе взять число из столбца count, например, ведь в mysql его просто нет.
from diplom.
Не совсем понял ваш уточняющий вопрос, попробую объяснить еще раз.
В build.gradle вы написали systemProperty 'db_url', System.getProperty('db_url', 'mysql')
. Это значит, что при отсутствии переданного параметра db_url в код попадет значение по умолчанию - "mysql". Соответственно, в коде вы получаете database = System.getProperty("db_url");
и теперь в database
у вас значение "mysql". А потом вы пытаетесь сравнить это с "jdbc:mysql://localhost:3306/app" и с "jdbc:postgresql://localhost:5432/app". Вам нужно в build.gradle в значении по умолчанию поставить полную строку для подключения к БД.
from diplom.
"Соответственно, в коде вы получаете database = System.getProperty("db_url");
и теперь в database у вас значение "mysql"."
Всё верно, это именно та логика, которая была до введения System.getProperty("db_url");
. Я указываю, что mysql = jdbc:mysql://localhost:3306/app
, а postgres = jdbc:postgresql://localhost:5432/app
и в случае, если database = mysql
, тест должен взять данные из столбца count с одним названием, а при database = postgres
данные из столбца count с другим названием, потому что при запросе select count(1) from order_entity o, payment_entity p where o.payment_id=p.transaction_id and p.status='APPROVED';
в mysql столбец называется count(1), а в postgres count, из-за чего попытка выполнить countApprovedPayment = rs.getInt("count(1)");
в postgres не может быть выполнена, так как не существует этого столбца.
И возвращаясь к логике. При прямом указании database = mysql
и дальнейшем сравнении database == mysql
всё работает, тест находит драйвер без проблем, а при указании database = System.getProperty("db_url");
(при этом db_url = mysql) и сравнении database == mysql
ничего не работает, не находит драйвер.
При использовании 2 БД указание database = jdbc:mysql://localhost:3306/app
выглядит достаточно лёгким, только при каждом вызове теста нам необходимо передавать полный адрес БД, что:
- усложняет вызов теста на данный момент
- делает авто-тест еще более сложным, если у нас станет, например, 4 БД, ведь тебе необходимо помнить полный адрес всех БД и вводить 3 из них вручную.
from diplom.
Слишком сложно и много лишнего.
Предлагаю вам для начала разобраться с базой данных, подключиться после запуска контейнеров и посмотреть, какие там таблицы и столбцы в этих таблицах. Там нет столбца count. count - это зарезервированное sql слово, которое подсчитывает количество элементов и выводит это количество.
Видите, ни одного столбца count.
И в postgres и mysql таблицы и столбцы идентичные
from diplom.
Всё верно, но так как я не могу привязаться к какому-нибудь ID в базе, в связи с тем, что он генерируется случайно, единственный вариант, который я нашел - сравнить количество строк до выполнения теста и после. Я не могу понять как вы предлагаете проверить результат выполнения покупки в базе.
Сейчас я разобрался почему была ошибка именно "No suitable driver found for mysql", изменил build.gradle (запушил в репозиторий этот вариант), но меня он не устраивает, так как для запуска теста на другой БД мне надо ввести полный адрес, это лишние сложности.
from diplom.
Чтобы проверить транзакцию в БД, можно перед каждым тестом или после каждого теста очищать таблицы. В таком случае у вас всегда в БД будет запись одной транзакции, которую вы можете получить и проверить ее успешность/неуспешность
from diplom.
Не понимаю логику данного действия, мне же все равно необходимо количество строк, т.к. после выполнения запроса на покупку у меня должно оказаться в 2 из 3 таблиц N+1, где N - количество строк до запроса.
Если бы я получал какой-нибудь идентификатор после выполнения запроса, я бы сравнивал равно ли количество строк с этим идентификатором 0 или нет. Я не понимаю в чем проблема использовать count в запросе и получать количество строк, ведь нам нет никакой разницы что в этой строке находится, учитывая задание.
from diplom.
Изменил select, теперь не нужна проверка через if. Остался вопрос с System.getProperty("db_url"):
Сейчас скрипт работает, т.к. я передаю в него полный адрес БД, но это сложный вариант, поэтому я хочу, чтобы скрипт работал, передавая вместо адреса переменную, в которой этот адрес сохранен. По моему предположению, на данный момент скрипт не работает при передаче переменной из-за того, что для корректной работы должно получаться (если заменить System.getProperty("db_url") тем значением, которое она передает) database = mysql
, а получается database = "mysql"
. Как это исправить, увы, я пока что не придумал.
from diplom.
Я не понимаю в чем проблема использовать count в запросе и получать количество строк, ведь нам нет никакой разницы что в этой строке находится, учитывая задание.
Разница лишь в том, что считая количество строк вы не узнаете о содержимом. Хоть в задании и нет конкретики по этому моменту, но вы же должны написать оптимальные проверки. Например, нам важен статус, записанный в БД и проверяя количество, вы не сможете проверить ни статус, ни другие важные параметры при их наличии.
Как это исправить, увы, я пока что не придумал.
Боюсь, что расстрою вас, но вы не сможете передать название переменной для дальнейшего использования, передать вы можете лишь значение переменной. Например в python и в некоторых других скриптовых языках есть возможность передавать имя функции и потом вызывать эту функцию по переданному имени. В java это может быть возможно только с использованием reflection api из стандартного sdk, но готовое решение я пока вам дать не готов. Можете попробовать реализовать самостоятельно, но, скорее всего, это будет сложнее, чем просто передать полное значение для подключения к БД
Примеры:
https://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable
https://stackoverflow.com/questions/24710487/how-to-get-variable-name-java
https://stackoverflow.com/questions/23846237/java-get-variable-name-as-string
https://javarush.ru/groups/posts/513-reflection-api-refleksija-temnaja-storona-java
https://javadevblog.com/polnoe-rukovodstvo-po-java-reflection-api-refleksiya-na-primerah.html
from diplom.
Разница лишь в том, что считая количество строк вы не узнаете о содержимом. Хоть в задании и нет конкретики по этому моменту, но вы же должны написать оптимальные проверки. Например, нам важен статус, записанный в БД и проверяя количество, вы не сможете проверить ни статус, ни другие важные параметры при их наличии.
Если вы посмотрите еще раз на select, то сможете увидеть, что для APPROVED и DECLINED статуса запрос отличается. Я выбираю только строки с определенным статусом, ведь только он меня интересует. В чём-то еще есть проблема?
Можете попробовать реализовать самостоятельно, но, скорее всего, это будет сложнее, чем просто передать полное значение для подключения к БД
Хорошо, тогда этот вариант можно считать завершенным, если нет никаких проблем по первой части этого сообщения. Предложенный вариант оставлю на будущее, когда ознакомлюсь и разберусь в вопросе.
from diplom.
Посмотрел еще раз ваши запросы. Да, действительно, статус учитывается. В таком случае в нашей ситуации можете оставить эту реализацию, тем более вы еще потестируете ее и потом посмотрю и я.
from diplom.
Related Issues (10)
- Не работает gate-simulator HOT 8
- Периодически не отображается подтверждение операции за 10 секунд
- Не возвращается отказ операции по карте *4442
- Отображается подтверждение операции на случайную карту
- Ошибка в названии города
- Доступен некорректный ввод поля Владелец
- Некорректный статус при API запросе
- Сообщение об ошибке не пропадает после введения корректных данных
- Нет проверки первых 6 цифр карты
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from diplom.