0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

selenium動作用の基底クラスの例にユニットテストを追加

Posted at

selenium動作用の基底クラス 利用例2

概要

以前の記事のクラスを使ったからさらに追加でを作ってみました。
seleniumのテスト用のサイトを使用しています。今回は新サイトを対象にしています。
今回は作った自動クリプトの単体テストまで実施してみました。

必要なもの

  • python 3.7.2

ライブラリとして

  • selenium
  • numpy
  • pandas
  • openpyxl
  • xlrd

ブラウザは

  • Chrome

を使用しています。

公開場所

githubで公開しいます。

使い方

  1. data/予約データ2.xlsxに各入力内容に応じて値を入れてください。
    • 日付については未来日かつ3か月以内でないとエラーになってしまうので5月以降を指定していますが参照時期によってはエラーになってしまうので適宜直してください。
  2. seleniumTestSite2を実行します。
  3. 終了するのを待ちます。screenShot/reserveに結果は出力されます。
  4. output/resultFiles に確認画面の内容が出力される。
  5. ユニットテストを実行する場合はtest_seleniumTestSite2.py を実行する。

ソースの説明

  • data/予約データ2.xlsxの一行ずつ登録を行っていく。一つのクラスにまとめているが必要に応じてクラスを分けるなど対応を行います。
    • ユニットテストを実施する都合上クラスの中に処理を記載しています。
    • またテスト用と実際の実行用を切り替えられるようにinitメソッドで使用するファイルを切り替えられるようにしています。
    • 実行結果を格納したパス以下のように設定して起きユニットテストの時に比較できるようにしています。
      infos=testSideOrder.inputOrder(reserveSheet)
      
      # 結果を格納
      
      super().setResultPath(infos)
      
    • テストでは以下のように結果を取得し比較を行っています。
      resultFilePath=seleniumTestSite.getResultPath()
      # 比較用の結果はCSVが1番目、Excelが2番目に格納されている
      
      actualCSVFile=pathlib.Path(resultFilePath[0])
      
      actualExcelFile=pathlib.Path(resultFilePath[1])
      
      
      
      # 想定された結果が取得できた時
      
      resultFilePathCSVExpect=pathlib.Path('unitTest/result/001/宿泊情報_テスト結果.csv')
      
      resultFilePathExcelExpect=pathlib.Path('unitTest/result/001/宿泊情報_テスト結果.xlsx')
      
      # CSV ファイルを読み込んで比較を行う
      
      self.csvFileCompare(actualCSVFile,resultFilePathCSVExpect)
      
      self.excelFileCompare(actualExcelFile,resultFilePathExcelExpect,'Sheet1')
      
  • 実行する場合は python test_seleniumTestSite2.pyで実行できます。
  • seleniumを使っての自動テスト以外に画面操作の自動化を行う場合スクリプト自体の品質を保証するために使えるかなと思います。

各関数の説明

テストクラス内のメソッド

  • CSVファイル同士の比較 引数で渡したもの同士を比較します。

    # CSVファイルの比較用
    
    def csvFileCompare(self,actualFilePath,expectFilePath):
    
        actualDataSets = pd.read_csv(actualFilePath,dtype='str',encoding='cp932')
    
        expectDataSets = pd.read_csv(expectFilePath,dtype='str',encoding='cp932')
        actualDataArray=np.asarray(actualDataSets)
        expectDataArray=np.asarray(expectDataSets)
        self.bothNumpyArrayEqual(actualDataArray,expectDataArray)
    
  • エクセルファイル同士の比較 引数で渡したもの同士を比較します。

    # エクセルファイルの比較
    
    def excelFileCompare(self,actualFilePath,expectFilePath,sheetName):
    
        actualDataSets = pd.read_excel(actualFilePath,dtype='str',sheet_name=sheetName)
    
        expectDataSets = pd.read_excel(expectFilePath,dtype='str',sheet_name=sheetName)
    
        actualDataArray=np.asarray(actualDataSets)
    
        expectDataArray=np.asarray(expectDataSets)
    
        self.bothNumpyArrayEqual(actualDataArray,expectDataArray)
    
  • pandasのDataFrameの比較 CSV,エクセルの比較を行っている処理で呼び出す

    # pandasのDataFrameをnumpyのArrayに変換したものを比較する
    
    def bothNumpyArrayEqual(self,actualData,expectData):
    
        for index,expect in enumerate(expectData):
    
            self.assertEqual(expect.tolist(),actualData[index].tolist())
    
  • ヘッダーを追加してCSV出力 ヘッダーを設定してListからDataFrameを作って出力をしています。

    # ディレクトリに付与する年月日時分、CSVのヘッダー、エラー情報をまとめている辞書を引数として渡す
    def outPutInfoCSV(self,iniFile,colums,infoDict,csvFileName='OutPutInfo',targetDateHourMinute=datetime.now().strftime("%Y%m%d%H%M")):
    
        infoDirectry = iniFile.get(
    
            "files", "infoDirectry") + targetDateHourMinute
    
        os.makedirs(infoDirectry, exist_ok=True)
    
        infoDataFrame=pd.DataFrame(columns=colums)
    
        indexCount=1
    
        for key,dataList in infoDict.items():
    
            for data in dataList:
    
                # キーの情報、各種情報のリストの形でまとめる
    
                infoList=[key]
    
                infoList.extend(data)
    
                infoSeries=pd.Series(infoList,index=colums,name=indexCount)
    
                indexCount=indexCount+1
    
                infoDataFrame=infoDataFrame.append(infoSeries)
    
        errorOutputFileName=infoDirectry+'/{0}.csv'.format(csvFileName)
        infoDataFrame.to_csv(errorOutputFileName,encoding='cp932')
    
        return errorOutputFileName
    
  • エクセルの出力 基本はCSVと同じですがエクセルなのでセル幅などを調整しています。DataFrameそのままではいけてないので・・・


    # 黒い罫線を返すエクセルのセルに黒で罫線を引きたいときに使用する

    def blackBorderLine(self):

        border = Border(
            top=Side(style='thin', color='000000'),
            bottom=Side(style='thin', color='000000'),
            left=Side(style='thin', color='000000'),
            right=Side(style='thin', color='000000'))

        return border


    # ディレクトリに付与する年月日時分、エクセルのヘッダー、エラー情報をまとめている辞書、各セルの幅を格納したリストを引数として渡す

    def outPutInfoExcel(self,iniFile,colums,infoDict,columSize,csvFileName='OutPutInfo',targetDateHourMinute=datetime.now().strftime("%Y%m%d%H%M")):

        infoDirectry = iniFile.get(

            "files", "infoDirectry") + targetDateHourMinute

        os.makedirs(infoDirectry, exist_ok=True)

        infoDataFrame=pd.DataFrame(columns=colums)

        indexCount=1

        for key,dataList in infoDict.items():

            # キーの情報、各種情報のリストの形でまとめる

            for datas in dataList: 

                infoList=[key]

                dList=list(datas)

                infoList.extend(dList)

                infoSeries=pd.Series(infoList,index=colums,name=indexCount)

                indexCount=indexCount+1

                infoDataFrame=infoDataFrame.append(infoSeries)
        outputFileName=infoDirectry+'/{0}.xlsx'.format(csvFileName)


        # 結果を一度エクセルに出力

        infoDataFrame.to_excel(outputFileName,encoding='cp932')

        # 罫線を引くようの設定

        border = self.blackBorderLine()

        # ヘッダーの色付け

        fill = excel.styles.PatternFill(patternType='solid',

                                        fgColor='87ceeb', bgColor='87ceeb')


        # フォーマットを整える

        targetBook=excel.load_workbook(outputFileName)

        sheet=targetBook.active

        columLength=len(colums)

        for index in range(0,columLength+1):

            # 呼び出し元でカラムのサイズを指定して渡す

            sheet.column_dimensions[get_column_letter(index+1)].width=columSize[index]

        for index,row in enumerate(sheet.rows):

            for cell in row:

                cell.border=border

                if index==0:

                    cell.fill=fill

        targetBook.save(filename=outputFileName)

        return outputFileName

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?