web-dev-qa-db-ja.com

サイプレスの前後の作品はどのくらい正確に行いますか?

前後の機能がサイプレスで動作する方法について何か不足していると思います。前にフィクスチャからデータをロードするスペックファイルがあります。そのデータの一部は、以前の関数で、そして再び実際のテストでも使用されます。スペックファイルには2テストが含まれています。最初のテストは期待どおりに実行されます。納入時は、フィクスチャからの値の1つが未定義であると言っています。

私の期待は、前のメソッドのフィクスチャからデータをロードすると、SPECファイル内のすべてのテストで利用可能になる必要があります。

'butth bar'の状態を実行するときは、ownareeach関数のwindow.console.log(this.user_data)をテストしてください。

'送信フォーム'を実行するときは、ownedeach関数でwindow.console.log(this.user_data)を出力し、テストが停止します。

私はここで何を見逃していますか?

describe('Customer Profile', () => {

    before(function () {
        window.console.log('Enter the before function')
        // Load the fixture data. Its asynchronous so if we want to use it right here and now
        // we have to put the things that use inside a callback to be executed after the data
        // loaded. 
        cy.fixture('user').as('user_data').then(function (){
            window.console.log('Fixture has loaded the user data')
            cy.visit('/LaunchPad/login')
            // Fill out the login form
            cy.get('input[name="username"]').type(this.user_data.username)
            cy.get('input[name="password"]').type(this.user_data.password)
            cy.get('button[type="submit"]').click()
        })
    })

    beforeEach(function(){
        window.console.log('Enter the beforeEach function')
        window.console.log(this.user_data)
        // Preserve the cookies for all tests in this suite
        Cypress.Cookies.preserveOnce('SESSION')
        // Open the profile view
        cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')
    })

    it('Check the state of the button bar', function(){
        window.console.log('Running test of button bar')
        cy.get('section.content-header > h1').contains('Company Profile Details')
        // Check the state of the action bar and its buttons
        cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save')
            .should('have.attr', 'for', 'submit-form')
            .should('have.attr', 'tabindex', '0')

        cy.get('section.action-bar').get('#resetButton').contains('Reset')
            .should('have.attr', 'type', 'reset')
            .should('have.attr', 'value', 'Reset')
            .should('have.class', 'btn btn-sm btn-default')

        cy.get('section.action-bar').get('a.btn.btn-sm.btn-default').contains('Cancel')
            .should('have.attr', 'href', '/Manager/'+this.user_data.org+'/')

        cy.get('section.action-bar').get('a').contains('Delete').should('not.exist')

    })

    // This form has no required fields and no validation. So just pick a value or two
    // submit the form and verify the banner is correct
    it('Submit form', function(){
        window.console.log('Running the submit form test')
        cy.fixture('company_profile').as('company_profile')
        cy.get('#companyProfileDto.name').type(this.company_profile.name)
    })


})
 _

[〜#〜]更新[〜#〜] Carlos Alfredoが何を基準にしてもっと読んだ後、私はこれを思い付きました。 1.私はまだログインページを訪問する必要があります。私たちはCSRFと宣誓を使い、実行している例を得ることを試みることはただ時間がかかりすぎることです。 2. PreserveOnceがまったく機能しないため、セッションCookieのホワイトリストを使用する必要があります。

これが私が今持っているファイルです。一度ログインページを訪問し、セッションCookieセットアップを取得します。 2つのテストは予想通りに進行します。

サポート/ index.js

before(function(){
    cy.login('bob', 'password')
    cy.fixture('user').as('user_data')
    cy.fixture('company_profile').as('company_profile')
})

beforeEach(function(){
    window.console.log('Enter the global beforeEach function')
    // Load the fixture data

})
 _

サポート/ commands.js

/*
    We visit the login form despite what the best practise recommendation is because
    we have OAUTH redirects and a CSRF token to deal with. Since the majority of the
    examples and working use cases provided dont deal with those scenarios this is 
    the best I can do at the moment. 
*/
Cypress.Commands.add('login', (username, password, options = {}) => {
    cy.visit('/LaunchPad/login')
    // Fill out the login form
    cy.get('input[name="username"]').type(username)
    cy.get('input[name="password"]').type(password)
    cy.get('button[type="submit"]').click()
})
/*
    We are white listing the cookie because Cypress.Cookies.preserveOnce('SESSION') 
    does not work. https://github.com/cypress-io/cypress/issues/2952

    Because we are forcing Cypress to not clear the cookies, you will have to close
    the test window after the suite is completed other wise the Vision360 apps will
    think your session is alive.
*/
Cypress.Cookies.defaults({
    whitelist: 'SESSION'
})
 _

統合/ customer_profile/customer_profile_spec.js.

describe('Customer Profile', () => {

    it('Check the state of the button bar', function(){
        window.console.log('Running test of button bar')

        cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')

        cy.get('section.content-header > h1').contains('Company Profile Details')
        // Check the state of the action bar and its buttons
        cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save')
            .should('have.attr', 'for', 'submit-form')
            .should('have.attr', 'tabindex', '0')

        cy.get('section.action-bar').get('#resetButton').contains('Reset')
            .should('have.attr', 'type', 'reset')
            .should('have.attr', 'value', 'Reset')
            .should('have.class', 'btn btn-sm btn-default')

        cy.get('section.action-bar').get('a.btn.btn-sm.btn-default').contains('Cancel')
            .should('have.attr', 'href', '/Manager/'+this.user_data.org+'/')

        cy.get('section.action-bar').get('a').contains('Delete').should('not.exist')

    })

    // This form has no required fields and no validation. So just pick a value or two
    // submit the form and verify the banner is correct
    it('Submit form', function(){
        window.console.log('Running the submit form test')
        cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')

        // Fill and submit the form
        cy.get('input#companyProfileDto\\.name').clear().type(this.company_profile.name)
        cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save').click()

        // Check the response
        cy.get('.callout-success').contains('Your changes are saved.')
        cy.get('input#companyProfileDto\\.name').should('have.value', this.company_profile.name)
    })

})
 _
5
RhythmicDevil

各テストのfixturesを清掃しているように見えます。

サイプレスガイドから( https://docs.cypress.io/guides/References/BEST-practices.html#dangling-State-IS-Your-Friends )))

「私たちはこのユースケースをサポートするためのサイプレスを建てました。実際、テストが終了すると、サイプレスは独自の内部状態を片付けていません。テストの終わりにダングリング状態があります。スパイ、偶数ルートのようなものテストの最後には削除されません。これは、Cypressコマンドを実行している間、またはテスト終了後に手動で動作しているときに、アプリケーションが同じように動作することを意味します。」

そのページでfixturesについて明示的なものは何もありませんが、その起動のように見え、fixturesも清掃されます。 beforeEach()は、before()の後に正確に実行されるため、最初のテストで動作します(ボタンバーの状態を確認してください)。 beforeフックに設定されている2回目のテストのために、beforeEach()が定義されていない備品を取得しようとしています。

それが役に立てば幸い。

あなたのおそらくあなたの提案: - 要求だけを使って、UIをスキップするカスタムコマンドとしてあなたのログインをすることをお勧めします。( https://docs.cypress.io/api/ cypress-api/custom-commands.html#custom-login-command

2
Carlos Alfredo

私は前にあなたのものとほぼ同じ問題に遭遇しました。

before()次のコードブロックの前に実行されます。

_describe("Some test", function() {
    before(function() {
        //something ...
        cy.request('POST', loginUrl, loginInformation).its('body').as('currentUser')
    })

    // this.currentUser exists here
    it("Should foo", function() {
    })

    // this.currentUser doesn't exist here
    it("Should bar", function() {
    })
})
_

Describe Scopeからbefore()ステートメントを移動する問題を修正しました。

_before(function() {
    //something ...
    cy.request('POST', loginUrl, loginInformation).its('body').as('currentUser')
})

describe("Some test", function() {     
    // this.currentUser exists here
    it("Should foo", function() {
    })

    // this.currentUser also exists here
    it("Should bar", function() {
    })
})
_

これがあなたがあなたの問題を解決するのを助けることができることを願っています。

0
JDTheOne

セッションクッキーのセットを保存した場合、最速の方法では、それらをハードコード/ブリュートフォースにしてください。

  beforeEach(() => {
    Cypress.Cookies.preserveOnce('SESSION')     // remember cookies for this session:
    cy.setCookie('logged_in_cookie_name', '000000000000000000000') // hard coded session cookie
    cy.setCookie('security_salt_etc', '000000000000000000000') // its like a revokable password but more secure
  })
  after(() => {    // logout!
    cy.clearCookies()
  })
 _
0
Tomachi