自動テストレポート生成

はじめに



私たちの会社が悪名高いGoogleDocsでテスト作業の記録を保持しているのは偶然です。 私はそのような会計だけに従事しているので、これは理想的です。 さらに、ベストプラクティスを同僚と簡単に共有する機会がまだあり、バージョンの関連性を心配する必要はありません。すべてが即座に保存されます。

これらは、選択したオプションの主な理由です。 しかし、ご存じのとおり、どのコインにも2つの側面があります。 このアプローチの欠点は、大規模なプロジェクトを処理して正しいテストレポートをコンパイルするのが難しいことです(テスト管理システムはこれらの目的に確実に適しています)。

最近、Google Scriptに出会いました。 これは、クラウド内のドキュメントをより効率的に操作できるツールです。 自動テスト報告のタスクに適していると判断しました。 そしてそれが起こったのです。



構造


スプレッドシートドキュメントでは、アプリケーションをテストするためのユーザースクリプトについて説明しています。 詳細な説明をするふりはしませんが、最も重要な情報はそこにあります。つまり、スクリプトが関連するセクション、スクリプト自体の名前、スクリプトのステップ、完了したスクリプトのステータス、コメント、バグトラッカーのエラーを説明するページへのリンクです。 通常、ステータスは「実装済み」、「不具合」、「延期」に限定されます。 一部のプロジェクトでは、他のプロジェクトが追加される場合がありますが、ポイントは追加されません。 次のようになります。



画像



明らかに、このようなシナリオは1ページで実行するのは便利ではありません。シナリオを複数のシートに分割するのは理にかなっています(たとえば、ステージやリリースごと)。



挑戦する


テストレポートをコンパイルするときは、テスターの寿命をできる限り簡素化する必要があります。 理想的なオプションは、セクションの概要とプロジェクト全体を確認できる場所です。エラーのリストとそれらへのリンクだけでなく、全体像も確認できます。



解決策


解決策として、セクションで分割されたテーブルを選択しました。 各行はテストシナリオに対応し、対応する色(欠陥の場合-赤、既製のタスクの場合-緑、残りの場合-黄色)で色付けされています。 同時に、各セクションの統計(エラーの数、成功したシナリオの数、他のシナリオの数、同じ割合)とプロジェクト全体の統計が別々に要約されます。

これは、シナリオのレポートのタイプです。



画像



統計の結果は次のとおりです。



画像



これを行う方法?


まず、ドキュメント内にスクリプトを作成する必要があります。 これは数分で完了します。

まず、Googleドライブにスプレッドシートを作成する必要があります。

画像



次に、[ツール]メニューに移動し、[スクリプトエディター]を選択します

画像



その後、メニュー項目「空のプロジェクト」を選択し、コードを消去して、独自のコードを書き始めます。

始めるために、onOpen関数を書きましょう。



function onOpen() { var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: '   ', functionName: 'generateReport_'} ]; spreadsheet.addMenu('', menuItems); }
      
      





これは、メニュー項目をツールバーに追加するのに役立ちます。

画像



次に、このメニュー項目が選択されたときに呼び出される関数を作成します。



 function generateReport_() { //      var columns = ['', ' ', '', '', '']; //     var reportColumns = [' ', '', '', '']; //        var Data = getAllCases(columns); //     CreateNewSheet(); //     var stat = FormReport(Data, reportColumns); ShowStat(stat); }
      
      





さて、順番に。

関数は、開いているファイルのすべてのシートを実行し、レポートのすべての情報を読み取ります。



 function getAllCases(columns) { var sheets = SpreadsheetApp.getActive().getSheets(); var data = new Array(); for (q=0; q<sheets.length; q++) { SpreadsheetApp.getActive().setActiveSheet(sheets[q]); data.push(getCases(columns)); } return data; }
      
      





この関数は、読み取り可能な形式で出力用の配列を形成します。 1つの機能があります-別のシートのフィールドを交換した場合、何も悪いことは起こりません。 パーツ配列には、スクリプトをグループ化するセクションのリストが含まれ、その要素には、配列名のセクション名とスクリプトのリストが含まれます。



 function getCases(columns) { var range = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var fields = FindFields(range[0], columns); var parts = new Array(); for (i=1; i<range.length; i++) { if (range[i][fields[0]] != '') { parts.push(new Array()); parts[parts.length-1]['name'] = range[i][fields[0]]; parts[parts.length-1]['scen'] = new Array(); } if (range[i][fields[1]] != '') { var title = range[i][fields[1]]; } if (range[i][fields[2]] != '') { var scen = new Array(); scen.push(title); for (j=2; j<fields.length; j++) { scen.push(range[i][fields[j]]); } parts[parts.length-1]['scen'].push(scen); } } return parts; }
      
      





実際、これはスクリプトページの列を混同するのがそれほど怖くない関数です。



 function FindFields (data, columns) { var fields = new Array(); for (i=0; i<columns.length; i++) { for (j=0; j<data.length; j++) { if (columns[i] == data[j]) fields.push(j); } } return fields; }
      
      





レポートで新しいシートを作成するには:



 function CreateNewSheet() { SpreadsheetApp.getActive().insertSheet(''); SpreadsheetApp.setActiveSheet(SpreadsheetApp.getActive().getSheetByName('')); }
      
      





レポート自体の形成、統計の収集、および少しの設計:



 function FormReport(data, columns) { var doc = SpreadsheetApp.getActive(); var stat = [0, 0, 0, 0]; doc.appendRow(columns); doc.setColumnWidth(1, 300); doc.setColumnWidth(2, 200); doc.setColumnWidth(3, 300); doc.setColumnWidth(4, 300); for (i=0; i<data.length; i++) { for (j=0; j<data[i].length; j++) { var temp = WritePart(data[i][j], columns); stat[0] += +temp[0]; stat[1] += +temp[1]; stat[2] += +temp[2]; stat[3] += +temp[3]; } } return stat; }
      
      





1つのセクションの情報をレポートに出力し、レポートに関する統計を生成する機能、およびより読みやすいデザイン:



 function WritePart(data, columns) { SpreadsheetApp.getActive().appendRow([data['name']]).set; var line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line).setFontSize(20); var defects = 0; var done = 0; var skipped = 0; var other = 0; for (k=0; k<data['scen'].length; k++) { SpreadsheetApp.getActive().appendRow(data['scen'][k]); var line = SpreadsheetApp.getActive().getLastRow(); switch (data['scen'][k][1]) { case '': defects++; SpreadsheetApp.getActive().getRange("A"+line+":D"+line).setBackground('red'); break; case '': done++; SpreadsheetApp.getActive().getRange("A"+line+":D"+line).setBackground('green'); break; case '': skipped++; SpreadsheetApp.getActive().getRange("A"+line+":D"+line).setBackground('yellow'); break; default: other++; SpreadsheetApp.getActive().getRange("A"+line+":D"+line).setBackground('yellow'); } } SpreadsheetApp.getActive().appendRow(['', '  :']); SpreadsheetApp.getActive().appendRow(['', ':', done, (done/(done+defects+skipped+other)*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("B"+line+":D"+line).setBackground('green'); SpreadsheetApp.getActive().appendRow(['', ':', defects, (defects/(done+defects+skipped+other)*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("B"+line+":D"+line).setBackground('red'); SpreadsheetApp.getActive().appendRow(['', ':', skipped, (skipped/(done+defects+skipped+other)*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("B"+line+":D"+line).setBackground('yellow'); SpreadsheetApp.getActive().appendRow(['', ':', other, (other/(done+defects+skipped+other)*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("B"+line+":D"+line).setBackground('yellow'); var stat = [defects, done, skipped, other]; return stat; }
      
      





そして最後に、最終的な統計と多くの設計:



 function ShowStat(stat) { SpreadsheetApp.getActive().appendRow(['  :']); var line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line).setFontSize(20); SpreadsheetApp.getActive().appendRow([':', stat[1], (stat[1]/(stat[0]+stat[1]+stat[2]+stat[3])*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line+":C"+line).setBackground('green'); SpreadsheetApp.getActive().appendRow([':', stat[0], (stat[0]/(stat[0]+stat[1]+stat[2]+stat[3])*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line+":C"+line).setBackground('red'); SpreadsheetApp.getActive().appendRow([':', stat[2], (stat[2]/(stat[0]+stat[1]+stat[2]+stat[3])*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line+":C"+line).setBackground('yellow'); SpreadsheetApp.getActive().appendRow([':', stat[3], (stat[3]/(stat[0]+stat[1]+stat[2]+stat[3])*100).toFixed(2) + "%"]); line = SpreadsheetApp.getActive().getLastRow(); SpreadsheetApp.getActive().getRange("A"+line+":C"+line).setBackground('yellow'); }
      
      





完全なアセンブリには、スクリプトファイル内の任意の順序でこれらすべての関数が必要です。

コードは完璧ではありません-何か取り組むべきことがありますが、誰かにとって便利なものがあれば、私は喜んで質問に答えます。

おわりに


Googleのスクリプトを使用した例を紹介しました。 これは、ドキュメントを操作するためのかなり強力なツールであることを認識する価値があります。 少なくとも彼は良い仕事をしました。 この興味深い記事など、作業を支援するスクリプトの使用例がまだあります。 どうやら、Google ScriptはIT'shnikの日常生活の大きな助けになる可能性があります。



All Articles