Git Product home page Git Product logo

Comments (12)

ArRomanov avatar ArRomanov commented on August 14, 2024

А как вы планировали создать connection для базы данных, если у вас в build.gradle по умолчанию задано просто 'mysql'? И дальше вы пытаетесь сравнить полную строку для подключения со строкой 'mysql' и, соответственно, у вас нет никаких совпадений (честно говоря, не совсем понял для чего это сравнение, но с этим будем разбираться на ревью)

image

from diplom.

supremko avatar supremko commented on August 14, 2024

Разве передаваемый в System.getProperty string mysql не равен уже созданному в .class string mysql?

"честно говоря, не совсем понял для чего это сравнение, но с этим будем разбираться на ревью"
всё достаточно просто - название столбца count в mysql и postgres отличается при запросе select count(1) ... , соответственно я не могу и в той, и в другой базе взять число из столбца count, например, ведь в mysql его просто нет.

from diplom.

ArRomanov avatar ArRomanov commented on August 14, 2024

Не совсем понял ваш уточняющий вопрос, попробую объяснить еще раз.
В 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.

supremko avatar supremko commented on August 14, 2024

"Соответственно, в коде вы получаете 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 выглядит достаточно лёгким, только при каждом вызове теста нам необходимо передавать полный адрес БД, что:

  1. усложняет вызов теста на данный момент
  2. делает авто-тест еще более сложным, если у нас станет, например, 4 БД, ведь тебе необходимо помнить полный адрес всех БД и вводить 3 из них вручную.

from diplom.

ArRomanov avatar ArRomanov commented on August 14, 2024

Слишком сложно и много лишнего.
Предлагаю вам для начала разобраться с базой данных, подключиться после запуска контейнеров и посмотреть, какие там таблицы и столбцы в этих таблицах. Там нет столбца count. count - это зарезервированное sql слово, которое подсчитывает количество элементов и выводит это количество.

image
image
image
Видите, ни одного столбца count.
И в postgres и mysql таблицы и столбцы идентичные

from diplom.

supremko avatar supremko commented on August 14, 2024

Всё верно, но так как я не могу привязаться к какому-нибудь ID в базе, в связи с тем, что он генерируется случайно, единственный вариант, который я нашел - сравнить количество строк до выполнения теста и после. Я не могу понять как вы предлагаете проверить результат выполнения покупки в базе.

Сейчас я разобрался почему была ошибка именно "No suitable driver found for mysql", изменил build.gradle (запушил в репозиторий этот вариант), но меня он не устраивает, так как для запуска теста на другой БД мне надо ввести полный адрес, это лишние сложности.

from diplom.

ArRomanov avatar ArRomanov commented on August 14, 2024

Чтобы проверить транзакцию в БД, можно перед каждым тестом или после каждого теста очищать таблицы. В таком случае у вас всегда в БД будет запись одной транзакции, которую вы можете получить и проверить ее успешность/неуспешность

from diplom.

supremko avatar supremko commented on August 14, 2024

Не понимаю логику данного действия, мне же все равно необходимо количество строк, т.к. после выполнения запроса на покупку у меня должно оказаться в 2 из 3 таблиц N+1, где N - количество строк до запроса.

Если бы я получал какой-нибудь идентификатор после выполнения запроса, я бы сравнивал равно ли количество строк с этим идентификатором 0 или нет. Я не понимаю в чем проблема использовать count в запросе и получать количество строк, ведь нам нет никакой разницы что в этой строке находится, учитывая задание.

from diplom.

supremko avatar supremko commented on August 14, 2024

Изменил select, теперь не нужна проверка через if. Остался вопрос с System.getProperty("db_url"):
Сейчас скрипт работает, т.к. я передаю в него полный адрес БД, но это сложный вариант, поэтому я хочу, чтобы скрипт работал, передавая вместо адреса переменную, в которой этот адрес сохранен. По моему предположению, на данный момент скрипт не работает при передаче переменной из-за того, что для корректной работы должно получаться (если заменить System.getProperty("db_url") тем значением, которое она передает) database = mysql, а получается database = "mysql". Как это исправить, увы, я пока что не придумал.

from diplom.

ArRomanov avatar ArRomanov commented on August 14, 2024

Я не понимаю в чем проблема использовать 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.

supremko avatar supremko commented on August 14, 2024

Разница лишь в том, что считая количество строк вы не узнаете о содержимом. Хоть в задании и нет конкретики по этому моменту, но вы же должны написать оптимальные проверки. Например, нам важен статус, записанный в БД и проверяя количество, вы не сможете проверить ни статус, ни другие важные параметры при их наличии.

Если вы посмотрите еще раз на select, то сможете увидеть, что для APPROVED и DECLINED статуса запрос отличается. Я выбираю только строки с определенным статусом, ведь только он меня интересует. В чём-то еще есть проблема?

Можете попробовать реализовать самостоятельно, но, скорее всего, это будет сложнее, чем просто передать полное значение для подключения к БД

Хорошо, тогда этот вариант можно считать завершенным, если нет никаких проблем по первой части этого сообщения. Предложенный вариант оставлю на будущее, когда ознакомлюсь и разберусь в вопросе.

from diplom.

ArRomanov avatar ArRomanov commented on August 14, 2024

Посмотрел еще раз ваши запросы. Да, действительно, статус учитывается. В таком случае в нашей ситуации можете оставить эту реализацию, тем более вы еще потестируете ее и потом посмотрю и я.

from diplom.

Related Issues (10)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.