2013-06-24 116 views
5

Tôi đã tạo một bài kiểm tra đăng nhập rất đơn giản trong Behat để đăng nhập vào ứng dụng nội bộ của chúng tôi. Có hai loại đăng nhập (được thực hiện từ cùng một màn hình và hộp). Có cơ bản và nâng cao. Sự khác biệt duy nhất là ở người dùng nâng cao đang đăng nhập có quyền truy cập vào nhiều công ty và được yêu cầu chọn một công ty để làm việc.Khi chạy thử nghiệm đăng nhập Behat thông qua PhantomJS, nó chỉ chạy trên lần chạy đầu tiên

Tôi thấy rằng bất cứ khi nào tôi chạy các kịch bản thông qua PhantomJS thay vì Selenium chúng chạy nhanh hơn rất nhiều (rõ ràng vì không có gì phải được hiển thị trong trình giả lập trình duyệt không đầu). Khi tôi lần đầu tiên khởi động PhantomJS nó chạy cả hai kịch bản tốt. Nhưng sau đó tôi chạy nó lần thứ hai và nó không thành công kịch bản đầu tiên (đăng nhập cơ bản).

Nếu tôi khởi động lại PhantomJS, nó sẽ hoạt động lại cho đến lần thử thứ hai. Tôi rất bối rối bởi điều này. Tại sao tôi cần phải khởi động lại PhantomJS để có được cả hai bài kiểm tra để vượt qua lần nữa trong lần gọi đầu tiên.

Nếu tôi chỉ định rằng tôi chỉ muốn nó chạy đăng nhập nâng cao trên lần chạy tiếp theo thì không thể đăng nhập được nữa. Nếu tôi chỉ định đăng nhập cơ bản (vẫn ngăn không cho nó chạy cả hai kịch bản) nó cũng không thành công. Nhưng khi tôi chạy cả hai kịch bản trong cùng một cuộc gọi đầu tiên luôn luôn thất bại và một trong những thứ hai luôn luôn vượt qua.

Tôi thậm chí đã chuyển sang thứ tự để cơ bản được chạy thứ hai thay vì đầu tiên và kịch bản đầu tiên (trong trường hợp này nâng cao) không thành công và lần thứ hai vượt qua. Vì vậy, những gì trên thế giới đang xảy ra?

Là một phần thưởng bổ sung, tôi đã tiếp tục và thêm một dòng có nội dung 'Sau đó tôi theo dõi "Đăng xuất"' và tất cả các trường hợp đột ngột đều truyền lại. Mà sẽ có ý nghĩa nếu nó không được cho thực tế là nó hoạt động tốt trong kịch bản thứ hai. Không nên nó không thành công nếu nó đã được đăng nhập? Có cách nào để đảm bảo rằng bộ nhớ cache cho PhantomJS bị xóa ở cuối mỗi trường hợp?

Feature: Login 
    Login to app using a basic user 
    Login to app using a multi-company user 

    @javascript 
    Scenario: Basic Login 
     Given I am on "/" 
     And I wait a few seconds 
     When I fill in "login" with "ijones" 
     And I fill in "password" with "[email protected]" 
     And I press "LoginButton" 
     And I wait a few seconds 
     Then I should see "By clicking below" 
     And I press "OK" 
     Then I should see "Welcome" 

    @javascript 
    Scenario: Advanced Login 
     Given I am on "/" 
     When I fill in "login" with "rtyler" 
     And I fill in "password" with "[email protected]" 
     And I press "LoginButton" 
     Then I wait for the company selection box 
     And I click a field "company" 
     And I pick "Test Company 2" 
     And I press "CompanyLoginButton" 
     Then I should see "By clicking below" 
     And I press "OK" 
     Then I should see "Welcome" 
+0

Tôi có cùng một vấn đề trong Codeception. PhantomJS giữ phiên. – Adamamont

+0

Tôi có cùng một vấn đề, nhưng trong trường hợp của tôi, ngay cả thiết lập lại() không giúp đỡ. – Pavel

Trả lời

9

Ok, cuối cùng tôi đã tìm ra điều này. Ít nhất là một phần. Dường như duy trì phiên giữa các kịch bản. Điều này không giải thích đầy đủ lý do tại sao nó chỉ là cuộc gọi đầu tiên. Nhưng tôi nghi ngờ rằng PhantomJS đang giữ phiên trước mở khi kịch bản cuối cùng đóng và Mink tạo lại phiên giữa các kịch bản, nhưng không phải sau khi kết thúc kịch bản cuối cùng.

Dù sao, giải pháp là tạo ngữ cảnh hoặc móc để đặt lại phiên ở cuối mỗi lệnh gọi kịch bản. Đối với mục đích thử nghiệm, tôi đã tạo ngữ cảnh có nội dung "Và tôi đặt lại phiên".

tôi định nghĩa này như vậy:

/** 
* @Given /^I reset the session$/ 
*/ 
public function iResetTheSession() { 
    $this->getSession()->reset(); 
} 

Khi tôi gọi đó là bối cảnh vào cuối cả hai kịch bản nó sửa chữa vấn đề. Vì vậy, tôi nghĩ rằng tôi sẽ tiếp tục và tạo ra một móc hậu trường hợp mà sẽ chăm sóc điều này cho tôi.