Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 29, 2022 16:21:02

Yurakov
Зарегистрирован: 2022-06-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

unittest mysql

Помогите пожалуйста написать тест который будет проверять добавилось ли во 2 таблицу именно то что было взято из первой.

 import mysql.connector as sql
def copy_to_other_db():
    try:
        connection = sql.connect(host='127.0.0.1',
                                 database='employees',
                                 user ="yurapc",
                                 password='Mysqlpassword1!')
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM titles")
        query = cursor.fetchall()
    except sql.Error as error:
        print("Failed to select all rows from MySQL table {}".format(error))
    try:
        connection_2 = sql.connect(host='127.0.0.1',
                                 database='employees_2',
                                 user ="yurapc",
                                 password='Mysqlpassword1!')
        cursor_2 = connection_2.cursor()
        cursor_2.executemany("INSERT IGNORE INTO titles (emp_no, title, from_date, to_date) VALUES (%s, %s, %s, %s);", query)
        connection_2.commit()
        print("Record inserted successfully into titles table")
    except sql.Error as error_2:
        print("Failed to insert into MySQL table {}".format(error_2))
    finally:
        if connection.is_connected() and connection_2.is_connected():
            cursor.reset()
            cursor_2.reset()
            connection.close()
            connection_2.close()
            print("Connection is closed")
copy_to_other_db()

Офлайн

#2 Июнь 29, 2022 16:40:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

unittest mysql

Yurakov
простите, но то что вы пытаетесь сделать - это не юнит-тест по нескольким причинам, главная из которых - юнит тест тестирует некий юнит, то есть функцию, метод класса, класс или модуль. Вы пытаетесь протестировать просто какой-то код отвлеченный, что само по себе в общем-то лишено смысла.
Давайте определимся для начала с целями затеи. Что вы сделать пытаетесь?



Офлайн

#3 Июнь 29, 2022 16:50:24

Yurakov
Зарегистрирован: 2022-06-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

unittest mysql

FishHook
Yurakovпростите, но то что вы пытаетесь сделать - это не юнит-тест по нескольким причинам, главная из которых - юнит тест тестирует некий юнит, то есть функцию, метод класса, класс или модуль. Вы пытаетесь протестировать просто какой-то код отвлеченный, что само по себе в общем-то лишено смысла. Давайте определимся для начала с целями затеи. Что вы сделать пытаетесь?


К сожалению я не понимаю как работают тесты еще, но у меня сейчас такое задание:

1. Import dump from https://github.com/datacharmer/test_db to the MySQL database.
2. Create a second database with the same data structure, but without data in the “titles” table (other tables may contain data, at least those which are required due to foreign keys constraints in the “titles” table).
3. Write a simple program in Python or Golang, which can connect to two different databases (keeping in mind that they may be placed on different servers) and which copies all the data from the “titles” table to the other database.
4. Write a unit test to see if the script performs as it should.
5. Create documentation in a readme.txt file. The file should contain instructions for setting up an environment and running the program (this is important from the perspective of a person who will be verifying the solution).

Я написал код который работает и копирует содержимое в другую таблицу, теперь я должен сделать тест.

Офлайн

#4 Июнь 29, 2022 17:44:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

unittest mysql

Yurakov
Я написал код который работает и копирует содержимое в другую таблицу, теперь я должен сделать тест.
Окей. Значит единственный юнит, который мы можем и должны протестировать это функция copy_to_other_db. Как будем тестировать? Тестируя юнит, мы тестируем только функционал предоставляемый юнитом. Надо ответить на вопрос, что делает юнит и зафиксировать всё остальное, что не отвечает на этот вопрос.
Например, если у нас есть вот такая функция

 def calculate_random_squares(n: int) -> List[int]:
     return [random.randint(1, 100) ** 2 for i in range(n)]
мы должны зафиксировать результат функции randint чтобы иметь предсказуемый результат и сравнить результат тестируемой функции с заданным, например вот так

   
@pytest.mark.parametrize("rnd,ln, res", [(2, 2, [4, 4]), (-3, 5, [9, 9, 9, 9, 9]), (1, 0, [])])
def test_calc(rnd, ln, res):
    with patch("random.randint", return_value=rnd):
        assert calculate_random_squares(ln) == res

И сразу становится очевидным, что ваша функция написана плохо. Почему? Потому что мы не можем её протестировать автотестом. А не можем по нескольким причинам:
1. ваша функция жестко завязана на параметры соединения, мы не можем запустить функцию в другом окружении, например на тестовой базе
2. ваша функция на вопрос, что она делает, дает сразу несколько ответов.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version