Создать базу данных для модульного тестирования в sqlite

У меня есть простое приложение sqlite, управляемое классом. По сути, я хочу запустить для него модульные тесты, но пока не смог.

class DB:
    def __init__(self, dbname='mydb.db'):    
        try:
            self.connection = sqlite3.connect(dbname)
        except:
            print('Error')
        finally:
            pass

Любой класс будет использовать его тогда:

class Hello:
    def hi(self):
        db = DB() # Create db or connect to existing one
        cursor = db.connection.cursor()

Теперь при тестировании я передаю тестовую базу данных:

db = DB('test.db')
#create datatabase here and all works fine
h = Hello()

Теперь h использует mydb.db вместо test.db. Как можно протестировать вышеуказанную структуру?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
2 533
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите передать экземпляр своего класса DB (db), вам нужно будет передать экземпляр вашему классу Hello. Пытаться:

class DB:
    def __init__(self, dbname='mydb.db'):    
        try:
            self.connection = sqlite3.connect(dbname)
        except:
            print('Error')
        finally:
            pass

class Hello:
    def hi(self, db=DB()): # we make it have a default db of DB() (which in turn defaults to 'mydb.db')
        # db = DB() # Create db or connect to existing one
        # ^^ we remove this line because now this is the default
        cursor = db.connection.cursor()

db = DB('test.db') # this makes an instance of your DB class and calls it "db"
h = Hello(db) # now we need to feed this instance

Хотя это, вероятно, не лучший способ сделать это. Вы, вероятно, выиграете больше от наличия одного класса с методами, потому что ваш второй класс в основном бесполезен и в любом случае очень тесно связан с вашим первым классом:

class DB:
    def __init__(self, dbname='mydb.db'):    
        try:
            self.connection = sqlite3.connect(dbname)
        except:
            print('Error')
        finally:
            pass

    def hello(self): # making a method instead
        cursor = self.connection.cursor()

db = DB('test.db') # this makes an instance of your DB class and calls it "db"
db.hello() # call our method

РЕДАКТИРОВАТЬ

Изначально я пропустил кое-что, что обнаружил при тестировании своего кода. Ваш код должен работать нормально, но вам нужно вызвать метод, который вы создали! Попробуй это:

import sqlite3

class DB:
    def __init__(self, dbname='mydb.db'):
        try:
            self.connection = sqlite3.connect(dbname)
        except:
            print('Error')
        finally:
            pass

class Hello:
    def hi(self):
        db = DB('test.db')
        cursor = db.connection.cursor()

db = DB('test.db')
h = Hello() # make our instance
h.hi() # use the method "hi" associated with the class (our function name within the class)

Обычно рекомендуется протестировать код с помощью временной базы данных. Здесь полезен база данных в памяти Sqlite.

ralex 03.04.2019 00:33

@ralex спасибо за дополнительную информацию! Я думаю, что понял это с помощью своего редактирования, OP никогда не вызывал метод hi класса Hello

Reedinationer 03.04.2019 00:49

@Reedinationer, спасибо. Второй подход ведет себя точно так же, как у меня сейчас. В целях тестирования да, наличие всего в одном классе упрощает задачу, но мне было интересно, смогу ли я сохранить структуру. Позвольте мне снова попробовать ваш первый подход

Nie Selam 03.04.2019 08:54

@Reedinationer спасибо за попытку, но он вообще не берет db_test.db

Nie Selam 03.04.2019 10:42

@NieSelam Откуда ты знаешь, что он его не принимает? Делаете ли вы что-нибудь с курсором, что приводит к выводу данных на консоль? Во втором примере строка db = DB() в классе Hello по умолчанию будет иметь значение «mydb.db». Вам нужно изменить его на db = DB('test.db')

Reedinationer 03.04.2019 18:46

@Reedinationer мои тесты не проходят, потому что в db.db есть данные, а в test.db нет данных. db = DB() # Создать базу данных или подключиться к существующей в методе hi() инициализирует ее с помощью db.db, а не test.db. Я решил использовать объявление пути к базе данных, которое я сейчас перезаписываю из test.py.

Nie Selam 03.04.2019 19:12

@NieSelam Разве это не сработает с тем, как я отредактировал второй пример сейчас? Если вы пытаетесь Hello подключиться к «test.db», вам нужно будет предоставить эту информацию, поскольку по умолчанию она будет «mydb.db».

Reedinationer 03.04.2019 19:28

Другие вопросы по теме