簡単なテスト データ ローダーの作成方法
公開: 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 ファイルの作成
結果
そして、これが私たちの仕事の結果です。 チュートリアルをお楽しみください。
