簡単なテスト データ ローダーの作成方法
公開: 2022-02-23はじめに
SQL プロジェクトは、テスト ファミリーの間ではあまり人気がありません。 通常、テスト エンジニアは UI または API を使用することを好みます。 しかし、ビジネス ロジックがリレーショナル データベースやデータ ウェアハウスにあるプロジェクトは数多くあり、遅かれ早かれ DB/DW でテストを行う必要があります。
これらのプロジェクトでは、他のプロジェクトと同様に、手動テストは依然として有効なアプローチであり、複数のテスト データ構成を準備する必要があります。 これは、複数のテスト データ SQL スクリプト、大量の DB オブジェクト、および DB スキーマを操作する場合に苦痛になる可能性があります。 この記事では、簡単なテスト データ ローダーを作成する方法を紹介します。
ユーザーインターフェース
Python と SQL Server をデータ ストレージとして使用します。 まず、デスクトップ アプリ用のシンプルな UI を作成しましょう。 すべてのライブラリが既にインストールされていると仮定します。インストールされていない場合は、「pip install [パッケージ]」
設定画面
システムをインポート
インポートランダム
PyQt4.QtCore インポート pyqtSlot,SIGNAL,SLOT から
PyQt4.QtGui インポートから *
PyQt4.QtCore インポートから *
日時のインポート
app = QApplication(sys.argv)
w = QWidget()
w.setWindowTitle('テストデータジェネレーター')
w.resize(180, 240)
w.setFixedSize(800, 460)
w.setStyleSheet("背景色:白;")コード ブロック 1. 設定ウィンドウ.
ウィジェットとして空のウィンドウから始めます。
プログレスバー
次に、テスト データ ローダーにプログレス バーを追加しましょう。 データのロードまたは削除が終了すると通知されます。 初期値はもちろん0です。
クラス QProgBar(QProgressBar):
値 = 0
@pyqtSlot()
デフ増加値 (progressBar):
progressBar.setValue(progressBar.value)
progressBar.value = progressBar.value+1
バー = QProgBar(w)
bar.resize(320,30)
bar.setValue(0)
bar.move(460,400)コード ブロック 2. プログレス バーの設定
コード ブロック 2. には、説明すべきいくつかの事項が含まれています。
- 増加値– プログレスバーの値を増やすメソッド
- QProgBar(w) – QProgressBar ウィジェットは進行状況バーを提供します
ラベル
ボタン、ドロップダウン、入力フィールドなどのラベルが必要です。
lName = QLabel(w)
{...}
lName.setText("名前")
lName.move(60,60)
{...}コード ブロック 3. ラベルの設定
そしてコードブロック3の解説。
- {…} – もちろん、すべてのコードを載せるわけではないので、これからはこの{…}を使用して「ここにコードの続きがある」ことを知らせます。
- QLabel(w) - QLabel ウィジェットはテキストを提供します
ボタン、チェックボックス、入力フィールド
アクションボタンから始めて、アプリの要素をいくつか見ていきましょう。
btnDelete = QPushButton('テストデータを削除', w)
btnLoad = QPushButton('Load Test Data', w)
{...}
スキーマ = QComboBox(w)
schema.addItem("テストスキーマ")
schema.move(200,10)
schema.resize(120,25)
データベース = QLineEdit(w)
データベース.move(30, 10)
データベース.サイズ変更(120,25)
database.setPlaceholderText("DB 名")
name1 = QCheckBox('名前 1', w)
name1.move(30, 85)
name1.setChecked(真)
{...}コード ブロック 4. ラベルの設定
コード ブロック 4 で定義されているアプリ要素は次のとおりです。
- QPushButton('') – QPushButton ウィジェットはボタンを提供します
- QComboBox(w) – QComboBox ウィジェットはドロップダウン リストです
- QLineEdit(w) – QLineEdit ウィジェットは 1 行のテキスト入力です。
- QCheckBox – QCheckBox ウィジェットは、テキスト ラベル付きのチェックボックスを提供します
行動
ここからは楽しい部分です。 アクションを作成し、シグナルをスロットに接続します。
@pyqtSlot()
def on_click_loadData():
バー.setValue(25)
nameList = []
{...}
デシベル = str(データベース.テキスト())
{...}
if(name1.isChecked()==True):
nameList.append("名前 1")
{...}
if(len(nameList)>0):
名前 = str(nameList[randomValueGenerator(len(nameList))-1])
bar.setValue(50)
if(str(schema.currentText())=='テストスキーマ'):
addTestData(db, 'テスト', 名前, {...})
{...}
bar.setValue(75)
bar.setValue(100)
def on_click_deleteData():
バー.setValue(25)
デシベル = str(データベース.テキスト())
bar.setValue(50)
if(str(schema.currentText())=='テストスキーマ'):
deleteTestData(db, 'テスト')
{...}
bar.setValue(75)
bar.setValue(100)
{...}
def randomValueGenerator(len):
random.randint(1,len) を返す
btnStructure.clicked.connect(on_click_createStructure)
btnStructure.move(20, 400)
btnStructure.resize(120,30)
btnLoad.clicked.connect(on_click_loadData)
btnLoad.move(160, 400)
btnLoad.resize(120,30)
btnDelete.clicked.connect(on_click_deleteData)
btnDelete.move(300, 400)
btnDelete.resize(120,30)
w.show()
app.exec_()Code Block 5. ラベルの設定

かなり長いコードです。 今実装したものを詳しく見てみましょう。
- on_click_loadData() – addTestData() 関数を呼び出して、
btn.clicked.connect()関数
- on_click_deleteData() – deleteTestData() 関数を呼び出して、
btn.clicked.connect()関数
- randomValueGenerator() – 定義された範囲からランダムな int 値を返します
- btn.clicked.connect() – シグナルをスロットに接続します
- w.show() – ウィジェットを表示
- app.exec_() - アプリケーションを実行する
DB アクション
アプリには、ボタン アクションに接続された SQL アクションが必要です。 pyodbc コネクタを使用して SQL Server DB に接続します。 DB スキーマが既に存在すると仮定し、テーブルなどの DB オブジェクトを作成する必要はありません。
テストデータを追加
addTestData 関数は、UI から値を取得し、それらを SQL クエリに渡します。 しかし、コード全体を見てみましょう。
- dbAddress を定義して SQL Server DB への接続を開く
- id 値の設定 – テーブル id が自動インクリメントでない場合、使用する id の次の値を知る必要があります
- SQL クエリの定義。 UI からいくつかの値を渡します。
pyodbc をインポート
ConfigParser をインポートする
config = ConfigParser.RawConfigParser()
config.read('../resources/env.properties')
リスト = []
ログイン = 'myFancyLogin'
def addTestData (データベース、スキーマ、名前 {...}):
試す:
dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS;
データベース="+db+";Trusted_Connection=yes;
u;pwd="
cnx = pyodbc.connect (dbAddress)
カーソル = cnx.cursor()+schema+"].[候補] ORDER BY ID
DESC"
id = returnValue(cnx、カーソル、id)
ID = str(ID + 1)
スキーマ = str(スキーマ)
testQuery = 'SELECT DB_NAME() AS [現在のデータベース];'
候補 = "INSERT INTO ["+スキーマ+"].[候補]
VALUES("+ID+",'"+名前+"',{...}")"
returnDBName(cnx、カーソル、testQuery)
リスト = [候補者]
executeQuery(cnx、カーソル、リスト)
e: として pyodbc.Error を除く
プリント(e)
print 'addTestData 関数のエラー'
そうしないと:
cnx.close()コード ブロック 6. テスト データ メソッドの追加
テストデータの削除
テスト データの削除は、deleteTestData(db,schema) 関数によって処理されます。 パラメータは 2 つだけです (db、schema)。 中にあるものを運ばずにテーブル全体をクリアしたいという意味です。
def deleteTestData (データベース、スキーマ):
試す:
dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS;
データベース="+db+";Trusted_Connection=yes;
u;pwd="
cnx = pyodbc.connect (dbAddress)
カーソル = cnx.cursor()
スキーマ = str(スキーマ)
testQuery = 'SELECT DB_NAME() AS [現在のデータベース];'
候補 = "DELETE FROM ["+schema+"].[候補]"
CandidateProcessed = "DELETE FROM
["+schema+"].[candidatesProcessed]"
returnDBName(cnx、カーソル、testQuery)
list = [候補者、処理された候補者]
executeQuery(cnx、カーソル、リスト)
を除外する:
print 'deleteTestData 関数のエラー'
そうしないと:
cnx.close()コード ブロック 7. テスト データ メソッドの削除
ユーティリティ
addTestData() および deleteTestData() 関数で使用されるいくつかの utils 関数:
def executeQuery (cnx、カーソル、リスト): リストの私のために: カーソル.execute(i) cnx.commit() def returnDBName (cnx、カーソル、dbQuery): カーソル.execute(dbQuery) 値 = カーソル.fetchone() 値 = 値[0] 値 = str(値)
コード ブロック 8. ユーティリティ関数
エグゼファイル
現在、Python がインストールされている場合はコードを使用でき、コードをコンパイルできますが、実行可能ファイルだけが必要な場合はどうすればよいでしょうか? py2exe ライブラリを使用すると、Python コード (コード ブロック 9) から実行可能ファイルを作成できます。
distutils.core インポート設定から
py2exeをインポート
setup(windows=[ウィジェットを含むファイルの名前],
データファイル = データファイル、
options={ 'py2exe': {
「含む」:['sip'],
"dll_excludes": ['MSVFW32.dll',
'AVIFIL32.dll',
'AVICAP32.dll',
'ADVAPI32.dll',
'CRYPT32.dll',
'WLDAP32.dll',
'MSVCP90.dll']
}
}))Code Block 9. .exe ファイルの作成
結果
そして、これが私たちの仕事の結果です。 チュートリアルをお楽しみください。

