import pytest
import psycopg2
from testcontainers.postgres import PostgresContainer
@pytest.fixture(scope='module')
def postgres_container():
with PostgresContainer('postgres:15') as postgres:
yield postgres
def test_postgres_connection(postgres_container):
conn = psycopg2.connect(
dbname=postgres_container.POSTGRES_DB,
user=postgres_container.POSTGRES_USER,
password=postgres_container.POSTGRES_PASSWORD,
host=postgres_container.get_container_host_ip(),
port=postgres_container.get_exposed_port(postgres_container.port)
)
cur = conn.cursor()
cur.execute('CREATE TABLE test_table (id SERIAL PRIMARY KEY, name VARCHAR(50));')
cur.execute("INSERT INTO test_table (name) VALUES ('testname') RETURNING id;")
inserted_id = cur.fetchone()[0]
conn.commit()
cur.execute('SELECT name FROM test_table WHERE id = %s;', (inserted_id,))
result = cur.fetchone()[0]
cur.close()
conn.close()
assert result == 'testname'
This test uses the testcontainers library to start a PostgreSQL Docker container automatically before the test and stop it after.
The postgres_container fixture manages the container lifecycle with scope='module' so it runs once per test module.
Inside the test, it connects to the database using connection info provided by the container object, avoiding hardcoded values.
It creates a table, inserts a record, and queries it back to verify the database is working.
Assertions check that the retrieved data matches the inserted data.
This approach ensures the test is isolated, repeatable, and cleans up resources properly.