簡単なテスト データ ローダーの作成方法

公開: 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 ファイルの作成

結果

そして、これが私たちの仕事の結果です。 チュートリアルをお楽しみください。