15

実際のデータベースに接続するために pymysql クライアント ライブラリを使用しています。モジュールに関数があり、pymysql を使用してデータベースに接続し、データベース挿入操作のみを実行します。実際のデータベースにアクセスせずに Python でこの関数を単体テストするにはどうすればよいですか?

import pymysql

def connectDB(self):

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db')

try:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('newuser@some.com', 'newpassword'))


    connection.commit()

私のpythonバージョンは2.7です。

4

3 に答える 3

1

テストが重要である最も説得力のある理由の 1 つを再発見しました。それは、設計が悪い場合にそれを教えてくれることです。

少し言い方を変えると、テスト容易性は品質の優れた一次プロキシです。次の点を考慮してください。

class DB(object):
    def __init__(self, **credentials):
        self._connect = partial(pymysql.connect, **credentials)

    def query(self, q_str, params):
        with self._connect as conn:
            with conn.cursor() as cur:
                cur.execute(q_str, params)
                return cur.fetchall()

# now for usage

test_credentials = {
    # use credentials to a fake database
}

test_db = DB(**test_credentials)
test_db.query(write_query, list_of_fake_params)
results = test_db.query(read_query)
assert results = what_the_results_should_be

複数のデータベースを扱う場合は、ポリモーフィズムを使用するか、API の類似性に応じて、特定の DB をオブジェクトのコンストラクター パラメーターにすることができます。

于 2017-11-07T14:32:49.877 に答える