epogrebnyak / data-rosstat-kep

Time series dataset of Rosstat Short-term Economic Indicators ("KEP") publication
http://www.gks.ru/wps/wcm/connect/rosstat_main/rosstat/ru/statistics/publications/catalog/doc_1140080765391
6 stars 6 forks source link

Unittesting: add test database file(s) - FOR REVIEW #75

Closed epogrebnyak closed 8 years ago

epogrebnyak commented 8 years ago

May use two new test sqlite files in testing (or two states of a testing file):

  1. for import tasks - empty file
  2. for query tasks - file with data from current month folder

Also need test for kep.database.db.wipe_db_tables() - it should reset database from state 1 to state 2.

Formerly discussed in #68.

epogrebnyak commented 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?

epogrebnyak commented 8 years ago

База, по идее, должна создаваться и заполняться независимо для каждого теста, в зависимости от того какие нужны данные. Реализуется это подходящим набором pytest fixtures. Делать какую-то очистку/откат базы от теста к тесту - плохой дизайн. Чем более тесты будут независимы, тем лучше (если, конечно, они не становятся от этого слишком долгими - но тут я не вижу такого риска, данных сравнительно мало).

У нас два типа тестов - на заполнение базы данных и на чтение из нее. Тесты на заполнение должны выполняться на пустой базе данных, создавать ее sql create я в рамках тестов не хочу, мне надо чтобы перед этими тестами был предоставлен тестовый файл базы данных, на котором выполнен wipe_db_tables(). Для теста чтения (модуль query) нужна тестовая база данных, заполненная данных конкретного месяца. Может это не совсем чистая методология, но для данного проекта предлагается делать так.

baor commented 8 years ago

Используя механизм https://www.sqlite.org/inmemorydb.html каждый тест может создавать свою копию базы независимо от других. По окончанию теста, in-memory база не будет сохраняться.

epogrebnyak commented 8 years ago

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?

alexanderlukanin13 commented 8 years ago

@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'