Юнит-тестирование по базе данных - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу провести модульное тестирование базы данных путем переопределения или насмешек без внесения каких-либо изменений в базу данных. Есть ли простой способ сделать это?

import sqlite3
from customer import Customer

class DataChecker:
    def __init__(self):
        self.conn = sqlite3.connect('pos.db')
        self.cursor = self.conn.cursor()

    def customer_has_equipment_attached(self, customerID):
        cursor.execute("""SELECT * FROM Customers WHERE ID == ?;""", (customerID,))
        conn.commit()
        customers = cursor.fetchall()

        if len(customers) == 0:
            print("Customer ID not found in DB")
            return False

        customer = customers[0]
        tmp_customer = Customer(ID=customer[0], Firstname=customer[1], Lastname=customer[2],        

        Age=customer[3], Sex=customer[4], Street=customer[5], Zip=customer[6], City=customer[7],  Nationality=customer[8], IMSIPtr=customer[9], IMEIPtr=customer[10], SubscriptionPtr=customer[11], Email=customer[12], Password=customer[13])

        # Fetch equipment
        if tmp_customer.IMEIPtr != None:
            cursor.execute("""SELECT * FROM Equipment WHERE ID = ?;""", (tmp_customer.IMEIPtr,))
            conn.commit()
            equipment = cursor.fetchone()

            if len(equipment) == 0:
                print('Customer has equipment ID but ID cant be found in DB.')
                return False

        else:
            print('Customer has no equipment attached to profile.')
            return False

1 Ответ

0 голосов
/ 28 апреля 2020

Существует консенсус в отношении того, что модульные тесты должны быть изолированы от внешних компонентов и зависимостей, таких как база данных. В этом смысле у вас есть два варианта: либо создать Mock для вызовов базы данных (что я не рекомендую), либо определить интерфейс для абстрагирования базы данных от вашего приложения и реализовать компонент Fake для использования в модульных тестах. Этот более поздний подход требует больше усилий для настройки, но в долгосрочной перспективе он окупается в десять раз, что позволяет вам писать все виды модульных тестов, которые зависят от базы данных.

Многие концепции архитектуры системы Здесь рассматриваются следующие вопросы: сложность программного обеспечения, инверсия зависимостей, управление контекстом тестирования и т. д. Если вам интересно, я написал статью о языковой агностии c, которая более подробно охватывает эти темы: Об архитектуре для модульного тестирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...