Найти тему
Halibut Testing

ТЕСТИРОВАНИЕ БАЗЫ ДАННЫХ НА PYTHON

В этой статье я хотел бы показать пару примеров проверок БД с использованием библиотеки pytest и sqlite3.

import sqlite3
import pytest
# Фикстура для подключения к базе данных и создания временной таблицы
@pytest.fixture
def db_connection():
  conn = sqlite3.connect(':memory:')
  cursor = conn.cursor()
  cursor.execute('''CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')
  conn.commit()
  yield conn
  conn.close()
# Тест для проверки количества столбцов в таблице
def test_column_count(db_connection):
  cursor = db_connection.cursor()
  cursor.execute('PRAGMA table_info(users)')
  columns = cursor.fetchall()
  assert len(columns) == 3 # мы ожидаем три столбца: id, name, age
# Тест для проверки наличия таблицы в базе данных
def test_table_existence(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users';")
  result = cursor.fetchone()
  assert result is not None
# Тест для проверки типа данных в столбце
def test_column_type(db_connection):
  cursor = db_connection.cursor()
  cursor.execute('PRAGMA table_info(users)')
  columns = cursor.fetchall()
  for column in columns:
    if column[1] == 'name':
      assert column[2] == 'TEXT'
    elif column[1] == 'age':
      assert column[2] == 'INTEGER'
# Тест для проверки наличия значения в таблице
def test_value_existence(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 25)")
  db_connection.commit()
  cursor.execute("SELECT * FROM users WHERE name='Alice'")
  result = cursor.fetchone()
  assert result is not None
# Тест для проверки наличия значения NULL
def test_null_value(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("INSERT INTO users (name, age) VALUES (NULL, 30)")
  db_connection.commit()
  cursor.execute("SELECT * FROM users WHERE name IS NULL")
  result = cursor.fetchone()
  assert result is not None
# Тест для проверки добавления новой записи
def test_insert_record(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("INSERT INTO users (name, age) VALUES ('Bob', 30)")
  db_connection.commit()
  cursor.execute("SELECT * FROM users WHERE name='Bob'")
  result = cursor.fetchone()
  assert result is not None
# Тест для проверки обновления записи
def test_update_record(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("INSERT INTO users (name, age) VALUES ('David', 40)")
  db_connection.commit()
  cursor.execute("UPDATE users SET age=41 WHERE name='David'")
  db_connection.commit()
  cursor.execute("SELECT age FROM users WHERE name='David'")
  result = cursor.fetchone()

  assert result[0] == 41

# Тест для проверки удаления записи
def test_delete_record(db_connection):
  cursor = db_connection.cursor()
  cursor.execute("INSERT INTO users (name, age) VALUES ('Charlie', 35)")
  db_connection.commit()
  cursor.execute("DELETE FROM users WHERE name='Charlie'")
  db_connection.commit()
  cursor.execute("SELECT * FROM users WHERE name='Charlie'")
  result = cursor.fetchone()
  assert result is None