Closed epogrebnyak closed 8 years ago
@alexanderlukanin13: can https://github.com/epogrebnyak/rosstat-kep-data/pull/72 be updated to address databases issue for pytest, based on current version of master?
База, по идее, должна создаваться и заполняться независимо для каждого теста, в зависимости от того какие нужны данные. Реализуется это подходящим набором pytest fixtures. Делать какую-то очистку/откат базы от теста к тесту - плохой дизайн. Чем более тесты будут независимы, тем лучше (если, конечно, они не становятся от этого слишком долгими - но тут я не вижу такого риска, данных сравнительно мало).
У нас два типа тестов - на заполнение базы данных и на чтение из нее. Тесты на заполнение должны выполняться на пустой базе данных, создавать ее sql create я в рамках тестов не хочу, мне надо чтобы перед этими тестами был предоставлен тестовый файл базы данных, на котором выполнен wipe_db_tables()
. Для теста чтения (модуль query) нужна тестовая база данных, заполненная данных конкретного месяца. Может это не совсем чистая методология, но для данного проекта предлагается делать так.
Используя механизм https://www.sqlite.org/inmemorydb.html каждый тест может создавать свою копию базы независимо от других. По окончанию теста, in-memory база не будет сохраняться.
Pytest seem to be viable option for me during development, not unittest with classes unfortunately. Can one switch to a different database (inmemory files) with pytest?
@epogrebnyak pytest
is compatible with anything, it's a matter of writing appropriate fixtures.
In current implementation we can't just use simple file=':memory:'
because connection is closed after _create_table
and other operation. The code is written in a such way that DB should be persistent.
def _create_table(file = DB_FILE):
conn = sqlite3.connect(file)
c = conn.cursor()
c.execute('''CREATE TABLE if not exists "data"
("freq" CHAR NOT NULL,
"label" VARCHAR NOT NULL,
"year" INTEGER NOT NULL,
"qtr" INTEGER,
"month" INTEGER,
"val" FLOAT NOT NULL ,
PRIMARY KEY ("freq", "label", "year", "qtr", "month", "val"))''')
conn.commit()
conn.close() # <-- Simple in-memory database would be lost here
As @baor suggested, we can try in-memory database with shared cache: file='file::memory:?cache=shared'
May use two new test sqlite files in testing (or two states of a testing file):
Also need test for
kep.database.db.wipe_db_tables()
- it should reset database from state 1 to state 2.Formerly discussed in #68.