2017-03-20 13 views
0

私は、失敗した同じテストではないなど、何が起こっているのかを示すために、失敗のケースで実際のパターンがなくても、テストスイートの間で間欠的な分断テストの失敗に直面しています。時々私は多くの失敗を、そして他の機会にはただ1つの失敗事例を得るでしょう。間欠的に試作に失敗しました - 注文の実行を約束しますか?

これは、私たちが設定したJenkins CIサーバー(linuxで動作している)でテストを実行する場合にのみ発生する傾向があることを指摘しておきます。ローカルのWindowsのマシンで私は一緒に暮らすことができる30-40の実行後に単一の失敗事例を得るかもしれません!

我々は現在、角1.5で構築されてテストしていると我々は原因アニメーション角度材料に使用し、パフォーマンスはこれらが持つことができるヒットに角度材料1.1.3

を使用しているアプリケーションは、我々はすでに、アニメーションを無効にすることを試してみました

このアプローチに続いてhere確かにテストが速くなりますが、私たちが見ている失敗例を助けません/

私は1つのテストスイートを何度も何度も実行しています。私たちのJenkins CI環境のlinuxボックスで6回目の試みですが、私はこのテストを何度も実行しましたが、まだ失敗していません。

問題のテストスイートは、ページオブジェクトファイルスニペットと一緒に以下に説明される

//test suite 
describe('Operators View', function() { 
    var operatorPage = require('./operators.po.js'), 
    loginView = require('../login/login.po.js'), 
    page = new operatorPage(); 

    describe('Large screen tests', function() { 
    beforeAll(function() { 
     loginView.login(); 
    }); 

    afterAll(function() { 
     loginView.logout(); 
    }); 

    it('should create an operator', function() { 
     page.settlementBtn.click(); 
     page.operatorsBtn.click(); 
     page.fabBtn.click(); 
     page.createOperator(); 
     expect(page.headline.getText()).toEqual('Operators'); 
    }); 
    }); 
}); 

// operators.po.js 
var operatorsSection = function() { 
    this.helper = new Helpers(); 
    this.headline = element(by.css('.md-headline')); 
    this.settlementBtn = element(by.css('[ui-sref="settlement"]')); 
    this.operatorsBtn = element(by.css('[ui-sref="operators"]')); 
    this.fabBtn = element(by.css('.md-fab')); 

    // Form Elements 
    this.licenceNumber = element(by.model('vm.transportOperator.licenceNumber')); 
    this.tradingName = element(by.model('vm.tradingName')); 
    this.name = element(by.model('vm.name')); 
    this.operatorAddressFirstLine = element(by.model('vm.transportOperator.address.line1')); 
    this.operatorAddressCityTown = element(by.model('vm.transportOperator.address.line5')); 
    this.operatorAddressPostCode = element(by.model('vm.transportOperator.address.postcode')); 
    this.payeeAddressFirstLine = element(by.model('vm.transportOperator.payee.address.line1')); 
    this.payeeAddressCityTown = element(by.model('vm.transportOperator.payee.address.line4')); 
    this.payeeAddressPostCode = element(by.model('vm.transportOperator.payee.address.postcode')); 
    this.opID = element(by.model('vm.transportOperator.fields.opID')); 
    this.spID = element(by.model('vm.transportOperator.fields.spID')); 
    this.schemeSelect = element(by.model('reference.scheme')); 
    this.schemeOptions = element(by.exactRepeater('scheme in vm.schemes').row('0')); 
    this.alias = element(by.model('reference.alias')); 
    this.reference = element(by.model('reference.reference')); 
    this.saveBtn = element(by.css('.md-raised')); 


    this.createOperator = function() { 
     this.licenceNumber.sendKeys(this.helper.getRandomId(10)); 
     this.tradingName.sendKeys('Protractor Trade Name LTD'); 
     this.name.sendKeys('Protractor Trade Name'); 
     this.operatorAddressFirstLine.sendKeys('Protractor Town'); 
     this.operatorAddressCityTown.sendKeys('Cardiff'); 
     this.operatorAddressPostCode.sendKeys('PT4 4TP'); 
     this.payeeAddressFirstLine.sendKeys('Protractor Town'); 
     this.payeeAddressCityTown.sendKeys('Cardiff'); 
     this.payeeAddressPostCode.sendKeys('PT4 4TP'); 
     this.opID.sendKeys('177'); 
     this.spID.sendKeys('Protractor Spid'); 
     this.schemeSelect.click(); 
     this.schemeOptions.click(); 
     this.alias.sendKeys('PTAlias'); 
     this.reference.sendKeys('Protractor'); 
     this.saveBtn.click(); 
    } 

    }; 
module.exports = operatorsSection; 

このテストスイートではPOファイルからcreateOperatorへのコールが呼び出され、savteBtnがクリックされた後、アプリケーション作成されたエントリのテーブルを表示する状態に移行します(コースの作成が成功した後)。我々は現在、バージョン0.2.18

に期待はして失敗し、また角度UI-ルータを使用している:

期待

等しい「演算子」から「演算子を作成します」。

しかし、捕獲された添付のスクリーンショットは、「オペレーター」という見出しでテーブルビューを示し、期待コール内部page.headline.getText()への呼び出しがあまりにも早く呼び出されているようですので、データベース操作の前にアイテムを作成すると、ページの変更は完了するチャンスを持っていましたか?

私はこれが分度器によって実行される約束の順序になる可能性があるのか​​疑問に思っています。私は、分度器の制御の流れについて話している記事を見てきました。なぜ、分度器の呼び出しの約束の結果にたどり着くべきときがあるのでしょうか。

私は呼び出しを移動する必要がありますか?ので、任意の考え\アドバイス、

it('should create an operator', function() { 
     page.settlementBtn.click(); 
     page.operatorsBtn.click(); 
     page.fabBtn.click(); 
     page.createOperator(); 
     page.saveBtn.click().then(function(){ 
     expect(page.headline.getText()).toEqual('Operators'); 
     }); 
    }); 

私は正直に言うと、ここでストローでクラッチに始めている:私のsaveBtn.click()は、そのは、そのようなことをやって、テストスイートに、私のページオブジェクトのcreateOperator関数の最後で呼ばれていますここのコミュニティからの感謝は大いにあります。

ありがとうございます!

+1

は、タイミングの問題のように思えます。時には、プロトラクターが見出しのテキストが何であるかを少し早く尋ねてきて、古いページを取得していることがあります。新しいページに移行するときには、 'waitForUrlToBeLike(x)'のようなヘルパー関数を使う傾向があります。これは現在のurlに 'x'が入るのを待ちます。 分裂器検査の安定性私は、物事があなたの期待通りになるのを待っているかどうかにかかっています。 – preeve

+0

@preeveこれは私が試してみると便利なように思えますが、現在使用しているヘルパー機能を共有できますか? – mindparse

+0

ベストプラクティスとして、1つの 'it'ブロックで実行しているアクションの数を減らすことができます。なぜあなたはクリックごとにアサーションを作ることができないのですか?キャプチャできるクリックイベントで何かが変化し、コントロールフローの操作に役立ちます。 – Gunderson

答えて

2

リクエストに応じて、ここではURLを待つために使用する関数を示します。

public waitForUrlToBeLike (urlPart: string, timeout: number = 10000) { 
    return browser.wait(() => { 
     return browser.driver.getCurrentUrl().then((url) => { 
      let regex = new RegExp(urlPart); 
      return regex.test(url); 
     }); 
    }, timeout); 
} 

私はまた、要素がそれらにアサーションを行う前に存在することを待つために、次の多くを使用します。

public waitTillPresent (element: ElementFinder, timeout: number = 10000) { 
    return browser.wait(() => { 
     return element.isPresent(); 
    }, timeout); 
} 
+0

これはありがとう、私はそれを助けてくれるように聞こえる、行くだろう! – mindparse

+0

これは私の失敗事例を扱っています。http操作が私のJenkinsボックスで見ていた断続的な失敗事例を解決すると、ボタンをクリックして状態を変更した後にURLが変わるのを待っています。手伝ってくれてどうもありがとう! – mindparse

関連する問題