2

最近、e2e-tests を Jenkins に設定しましたが、すぐに共有テスト ファイルを使用する必要があることに気付きました。完全なスイートの実行には、毎日 9 時間から 10 時間の覗き見をするのに非常に長い時間がかかるため、真のオプションです。ただし、conf ファイルで以下の 2 つのオプションを構成した場合。テストは正常に実行されていますが、最終レポートには、保存パスにある最後の仕様の実行結果のみが表示されます。すべてのオプションを統合しても、完全なレポートは得られません。

conf ファイルの詳細を見つけてください。どんな助けでも大歓迎です。

Aditya が提供するソリューションに従って、conf ファイルを編集します。助けてください

   var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');
var log4js = require('log4js');
var params = process.argv;
var args = process.argv.slice(3);

exports.config = {
  //seleniumServerJar: './node_modules/gulp-protractor/node_modules/protractor/selenium/selenium-server-standalone-2.48.2.jar',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  allScriptsTimeout: 100000,
  framework: 'jasmine2',

  onPrepare: function () {

    return new Promise(function(fulfill, reject) {
      browser.getCapabilities().then(function(value) {
        reportName = value.get(Math.random(8,2)) + '_' + value.get('browserName') + '_' + Math.floor(Math.random() * 1E16);
        jasmine.getEnv().addReporter(
          new Jasmine2HtmlReporter({
            //cleanDestination: false,
            savePath: __dirname+'/target',
            //docTitle: 'Web UI Test Report',
            screenshotsFolder: 'image',
            //takeScreenshots: true,
            takeScreenshotsOnlyOnFailures: true,
            consolidate: true,
            consolidateAll: true,
             preserveDirectory: true,
            //fixedScreenshotName: true,
            filePrefix: reportName + ".html"
          })
        );
        fulfill();
      });
    });

    // browser.manage().timeouts().implicitlyWait(11000);
    var width = 768;
    var height = 1366;
    browser.driver.manage().window().setSize(768, 1366);
    browser.ignoreSynchronization = false; 
  },

  afterLaunch: function afterLaunch() {
    var fs = require('fs');
    var output = '';
    fs.readdirSync('target/').forEach(function (file) {
      if (!(fs.lstatSync('target/' + file).isDirectory()))
        output = output + fs.readFileSync('target/' + file);
    });
    fs.writeFileSync('target/ConsolidatedReport.html', output, 'utf8');

  },

  suites:{

    example:['./test/e2e/specs/**/*Spec.js',]
  },


  /*  capabilities: {
      'browserName': 'chrome'
    },*/

  multiCapabilities: [
    {
      'browserName': 'chrome'
    },
    {
      'browserName': 'firefox'
    }
  ],


  resultJsonOutputFile:'./results.json',

  // Options to be passed to Jasmine-node.
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 100000
  }
};
4

5 に答える 5

3

テストが並行して実行されると、HTML レポート ファイルが上書きされるため、「Jasmine2HtmlReporter」には制限があります。しかし、これを回避することは間違いなく可能であり、それを行う方法がいくつかあります。あなたの都合に合わせて正しい方法でピックアップ

1) Jasmine2HtmlReporter の「index.js」をいじって、PhantomJs がその使用を上書きする代わりにファイルを追加します。

2) onPrepare() 関数から Jasmine2HTML レポーターを構成して独自の HTML レポートを生成し、後ですべてのレポートを統合する

解決策 1: Jasmine2HtmlReporter の現在のコード ベースは、データを書き込むために&index.jsという 2 つの関数を使用します。ここを参照phantomWrite()nodeWrite()

新しい関数を作成しました-上書きする代わりに追加し、この関数をピックアップするようにコードを変更しました分度器-jasmine2-html-reporterappendwrite()からフォークされた私の github コードをチェックしてください

        function appendwrite(path, filename, text){
            var fs = require("fs");
            var nodejs_path = require("path");
            require("mkdirp").sync(path); // make sure the path exists
            var filepath = nodejs_path.join(path, filename);
            fs.appendFileSync(filepath,text)
            return;
        }

そしてself.writeFile、「node_modules/protractor-jasmine2-html-reporter/index.js」の関数を変更して、新しい関数をピックアップします

        try {
            appendwrite(path, filename, text);
            //phantomWrite(path, filename, text);
            return;
        } catch (e) { errors.push('  PhantomJs attempt: ' + e.message); }
        try {
            nodeWrite(path, filename, text);
            return;
        } catch (f) { errors.push('  NodeJS attempt: ' + f.message); }

そして、エラークリーンアップエラーが表示されないように、新しい実行時にレポートをクリーンアップする以下のコードにコメントしてください - CleanUpCode

    rmdir(self.savePath);

解決策 2: OnPrepare 関数で Jasmine レポーターを構成して、並列インスタンスのセッション ID に基づいて個別のレポートを生成する

onPrepare: function() {
        return new Promise(function (fulfill, reject) {
            browser.getCapabilities().then(function (value) {
                reportName = value.get('webdriver.remote.sessionid') + '_' + value.get('browserName') + '_' + Math.floor(Math.random()*1E16);
                jasmine.getEnv().addReporter(
                    new Jasmine2HtmlReporter({
                        savePath: 'target/',
                        screenshotsFolder: 'images',
                        consolidate: true,
                        consolidateAll: true,
                        filePrefix: reportName + ".html"
                    })
                );
                fulfill();
            })
        });
    },

ステップ 2: 完全なテストが完了し、すべての Webdriver セッションが閉じられた後、afterLaunch() メソッドで並列インスタンス間で生成されたレポートを統合します。

afterLaunch: function afterLaunch() {
        var fs = require('fs');
        var output = '';
       fs.readdirSync('target/').forEach(function(file){
           if(!(fs.lstatSync('target/' + file).isDirectory()))
            output = output + fs.readFileSync('target/' + file);
       });
        fs.writeFileSync('target/ConsolidatedReport.html', output, 'utf8');
    },

以下のように生成されたレポートが 1 つの ConsolidatedReport とともに表示されます PS: 入力ミスや構文エラーは無視してください。これは単なる例であり、カスタマイズすることができます

ここに画像の説明を入力

EDIT1: HTML レポートに名前を付けるために使用している 'sessionID' は、Web ドライバーのリモート セッション ID です。複数のセッションで一意ではない可能性があると思われる場合は、個々の HTML レポートに対して乱数を生成し、後で統合してください。

上記のコードを修正しました

于 2016-09-06T10:58:36.637 に答える
0

以下のソリューションを使用して、一意のタイムスタンプを持つ一意のフォルダーを作成しました。これにより、Jasmin-2-html-reporter が削除する代わりに、HTML レポートが date-timestamp フォルダーに保存されます。

var today = new Date();
   var timeStamp = today.getMonth() + 1 + '-' + today.getDate() + '-' + today.getFullYear() + '-' + 

today.getHours() + 'h-' + today.getMinutes() + 'm-' +today.getSeconds()+'s';

 jasmine.getEnv().addReporter(
            new Jasmine2HtmlReporter({
                savePath: './Reports/testResultsReport '+timeStamp,
                screenshotsFolder: 'screenPrints',
                takeScreenshots: true,
                takeScreenshotsOnlyOnFailures: true,
            })
        ); 

`

于 2016-10-03T15:57:09.690 に答える
0

私は現在同じ問題に苦しんでいますが、プロトタイプのセットアップでは機能しており、BASE構成のみを使用しています。

var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');


exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['**-spec**.js'],

capabilities: {
    browserName: 'chrome',                                                      
    shardTestFiles: true,                                                        
    maxInstances: 2                                                             
},

onPrepare: function() {
    jasmine.getEnv().addReporter(
      new Jasmine2HtmlReporter({
        savePath: 'target/',
        screenshotsFolder: 'images',
        consolidate: true,
        consolidateAll: false  // false in my saved config - true in tut.
    })
  );
}
}

最低限の機能だけでシャード レポートが機能するかどうかわかりますか?

編集:また、ターゲットフォルダーで何が起こっているのかに注意してください。ジャスミンは、必要のないときに上書き/クリーニングしている可能性があります。

編集 2: 以下のソリューションを使用する場合は、仕様があるので十分な数のブラウザーを起動していることを確認してください。仕様を分割した場合、以下のソリューションはブラウザー ID に基づいてレポートを作成します。

capabilities: {
    browserName: 'chrome',                                                      
    shardTestFiles: true,                                                       
    maxInstances: **2**                                                             
},

2 つ以上必要な場合は、レポーター HTML を上書きします。テストに使用したブラウザー/セッション ID に基づいて HTML ファイルを作成します。2 つのブラウザー インスタンスを使用する場合、2 つの HTML ファイルを取得します

編集 3: 簡単な修正は、ジャスミンをクリーンアップさせないことです...

cleanDestination: false,

しかし、これは何もしていないように見えるので、検索して検索した後、jasmine html レポーターによって、シャードよりも多くの仕様を統合できるとは思えません。github の課題トラッカーに進行状況が表示されません。

したがって、私が考えることができる唯一の解決策は、仕様の量をサポートするのに十分なシャードを使用して、以下のソリューションを使用し、完了したらそれを解析して 1 つのファイルに戻すことです。

編集 4: Jenkins をいつでも悪用して、実際のテスト実行の間に HTML ファイルを連結できます。

于 2016-09-06T07:12:55.337 に答える