web-dev-qa-db-ja.com

セレンによるブラウザのパフォーマンステスト

内部AngularJSアプリケーションのテストにはprotractorを使用しています。

機能テストに加えて、 protractor-perf これはnodejsに基づいています browser-perf ライブラリ。なぜなら、 "パフォーマンスは機能です"

protractor-perfブラウザのアクションを実行しながら、さまざまなパフォーマンス特性を測定してアサートできます。 たとえば

browser.get('http://www.angularjs.org');

perf.start(); // Start measuring the metrics
element(by.model('todoText')).sendKeys('write a protractor test');
element(by.css('[value="add"]')).click();
perf.stop(); // Stop measuring the metrics 

if (perf.isEnabled) { // Is perf measuring enabled ?
    // Check for perf regressions, just like you check for functional regressions
    expect(perf.getStats('meanFrameTime')).toBeLessThan(60); 
};

ここで、別の内部アプリケーション用に、Pythonで記述されたSeleniumベースのテストのセットがあります。

Selenium-pythonでパフォーマンスの低下をチェックすることは可能ですか、それともブラウザのパフォーマンステストを記述できるようにprotractorを使用してテストを書き直す必要がありますか?

20
alecxe

に近づく可能性があります what browser-perfchromeパフォーマンスログ を収集して分析します。

パフォーマンスログを取得 にするには、performanceの必要な機能を調整して、loggingPrefsログをオンにします。

from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = {'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=caps)

driver.get('https://stackoverflow.com')

logs = [json.loads(log['message'])['message'] for log in driver.get_log('performance')]

with open('devtools.json', 'wb') as f:
    json.dump(logs, f)

driver.close()

この時点で、 devtools.jsonファイルには、一連のトレースレコードが含まれます。

[
  {
    "params": {
      "timestamp": 1419571233.19293,
      "frameId": "16639.1",
      "requestId": "16639.1",
      "loaderId": "16639.2",
      "type": "Document",
      "response": {
        "mimeType": "text/plain",
        "status": 200,
        "fromServiceWorker": false,
        "encodedDataLength": -1,
        "headers": {
          "Access-Control-Allow-Origin": "*",
          "Content-Type": "text/plain;charset=US-ASCII"
        },
        "url": "data:,",
        "statusText": "OK",
        "connectionId": 0,
        "connectionReused": false,
        "fromDiskCache": false
      }
    },
    "method": "Network.responseReceived"
  },
  {
    "params": {
      "timestamp": 1419571233.19294,
      "encodedDataLength": 0,
      "requestId": "16639.1"
    },
    "method": "Network.loadingFinished"
  },
  ..
]

さて、問題は、それをどうするかということです。

最初に提案されたオプションの1つ Google Test Automation Conference中に は、ログを webpagetest.org に送信することです。例がありますJavaで利用可能 ここ ですが、現時点では、Pythonで実装することができませんでした。

理論的には、webpagetest.orgによって生成されるUIレポートは次のようになります。

enter image description here

また、さらに分析できるJSON/XMLおよびその他の形式のメトリックも提供します。

ポインティングコメントをくれたVivekSinghのおかげで、これは本当に何かです。


browser-perfは、ログ機能を使用してトレースログを取得し、データを分析します。

17
alecxe

Seleniumを使用してパフォーマンス回帰テストを実行することができます。ただし、すでにお気づきかもしれませんが。 Seleniumの核となる本質は、ユーザーの行動を模倣することです。これは、ユーザーが同じアクションを実行できる場合にのみ、Seleniumがアクション(ボタンのクリックなど)を実行することを意味します。また、Seleniumスクリプトを実行できるようにするために必要な特定のコード、回避策(つまり、ハードウェイト、さまざまなチェック、カスタムコード)も考慮に入れます。これは、Seleniumを使用したパフォーマンステストの「定義」が、従来のパフォーマンステストとはわずかに異なることを意味します。

あなたがしたいのは、Seleniumが実行している各アクションのタイマー(開始/停止)を用意することです。例:ボタンをクリックして、後で使用できるようにファイルに記録します。

Seleniumを使用すると、パフォーマンスベースラインを作成し、それ以降、連続する各結果をベースラインと比較できます。これにより、統計が得られ、さらに分析するために使用できます。

SeleniumもWebdriver(Selenium 2.0)も、この機能をすぐに使用できます。したがって、これを機能させるには、いくつかのカスタムコーディングを行う必要があります。

5
Paul