Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Тестирование Stored Procedures на Python

python
Теги: #<Tag:0x00007f7b647b9120>

#1

Всем привет. Дали задачу, написать скрипт на Python, который будет проверять работоспособность T-SQL-процедуры со сложной логикой. Предлагается использовать связку pytest + pymsql. Времени полно, хочу, чтобы код скрипта был близок идеальному с точки зрения архитектуры и информативности результатов. Вот только проблема в том, что раньше никогда не писал на Python и автоматические тесты не то направление работы, которой обычно занимаюсь, поэтому прошу советов знатоков.

Разбил задачу на несколько этапов:

(1) Подключение/Отключение к/от БД:

(2) Insert/Delete в/из БД записи для теста

(3) Выполнение ХП, проверка изменений в полях записи для теста

Для (1) реализовал фикстуру:

import pytest
import pymssql

HOST_NAME = "XXX.XXX.XXX.XXX"
USER_NAME = "XXXXXX"
USER_PASSWORD = "XXXXXX"
DATABASE_NAME = "XXXXXX"

@pytest.fixture(scope="session")
def con_to_xxxxxx(request):
    con = pymssql.connect(HOST_NAME, USER_NAME, USER_PASSWORD, DATABASE_NAME,
                          as_dict=True)

    def fin():
        con.close()

    request.addfinalizer(fin)
    return con

Как и где принято хранить параметры для функции/й (вроде HOST_NAME, USERT_NAME, …)? В том же файле в котором функция или в отдельном? Как хранить? Как константы или в какой-либо структуре? Стоит ли выносить вышеприведенную фикстуру в отдельный файл, на случай, если в дальнейшем нужно будет тестировать другие ХП в рамках данной БД? Для (2) запись будет генерироваться конкретно под данную ХП, ее использование в других ХП маловероятно. В связи с этим делать (2) в отдельной фикстуре, в функции теста или как-то еще? Т.е.:

Вариант 1:

@pytest.fixture(scope="function")
def prep_xxxxxx(request, con_to_xxxxxx):
    cur = con_to_xxxxxx.cursor()
    cur.Execute( ... - insert записи
    
    def fin():
        cur.Execute( ... - удаление записи

    request.addfinalizer(fin)
    return cur

def test_auto_app_xxxxxx(prep_xxxxxx):
  ...
  assert ...  

Что на ваш взляг стоит логировать?

Вариант 2:

def test_auto_app_xxxxxx(con_to_xxxxxx):
  ...
  cur = con_to_xxxxxx.cursor()
  cur.Execute( ... - insert записи
  ...
  assert ... 
  ...
  cur.Execute( ... - удаление записи

Вариант 3

???