2012-01-24 30 views
15

Câu hỏi nhanh cho bạn ... Khi tôi viết một thử nghiệm trong Visual Studio, tôi kiểm tra xem nó hoạt động bằng cách lưu, xây dựng và sau đó chạy thử nghiệm trong Nunit (bấm chuột phải vào sau đó chạy thử nghiệm).Thử nghiệm của tôi thất bại khi chạy cùng nhau, nhưng vượt qua từng câu

thử nghiệm này hoạt động yay ... vì vậy tôi di chuyển trên ...

Bây giờ tôi đã viết bài kiểm tra khác và nó hoạt động như tôi đã lưu và thử nghiệm nó như trên. Nhưng, chúng không hoạt động khi chúng được chạy cùng nhau.

Dưới đây là hai bài kiểm tra của tôi mà làm việc khi chạy như cá nhân nhưng thất bại khi chạy với nhau:

using System; 
using NUnit.Framework; 
using OpenQA.Selenium.Support.UI; 
using OpenQA.Selenium; 

namespace Fixtures.Users.Page1 
{ 
    [TestFixture] 
    public class AdminNavigateToPage1 : SeleniumTestBase 
    { 
     [Test] 
     public void AdminNavigateToPage1() 
     { 
      NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 
      NavigateTo<Page1>(); 
      var headerelement = Driver.FindElement(By.ClassName("header")); 

      Assert.That(headerelement.Text, Is.EqualTo("Page Title")); 
      Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title")); 
     } 

     [Test] 
     public void AdminNavigateToPage1ViaMenu() 
     { 
      NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 
      Driver.FindElement(By.Id("menuitem1")).Click(); 
      Driver.FindElement(By.Id("submenuitem4")).Click(); 
      var headerelement = Driver.FindElement(By.ClassName("header")); 

      Assert.That(headerelement.Text, Is.EqualTo("Page Title")); 
      Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title")); 
     } 
    } 
} 

Khi thử nghiệm thứ hai thất bại bởi vì họ đã được chạy cùng

Nunit trình bày này:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesV iaMenu: OpenQA.Selenium.NoSuchElementException: Yếu tố không thể tìm được

Và dòng này được đánh dấu:

var headerelement = Driver.FindElement(By.ClassName("header")); 

Có ai biết tại sao mã của tôi thất bại khi chạy với nhau, nhưng đi khi chạy một mình?

Bất kỳ câu trả lời nào sẽ được đánh giá rất nhiều!

+4

Bạn có chắc các bài kiểm tra không chia sẻ trạng thái không? Trình duyệt có đóng cửa và mở lại giữa các thử nghiệm không? Thử nghiệm nào không thành công khi chúng chạy cùng nhau? Làm cả hai thất bại, hoặc không vượt qua, và một thất bại? –

+0

Trình duyệt đóng cửa và cửa sổ lệnh .. chúng mở lại để xử lý kiểm tra sau ... Thử nghiệm đầu tiên của nó vượt qua rồi tất cả các kiểm tra sau thường thất bại và chúng không thành công vì lý do tương tự được đăng ở trên. –

+0

Không giúp câu hỏi cụ thể của bạn, nhưng hãy kiểm tra http://www.ncrunch.net/, nó chạy thử nghiệm của bạn trong nền. Loại bỏ toàn bộ "tiết kiệm, xây dựng và sau đó chạy thử nghiệm" rắc rối. –

Trả lời

1

Hai điều bạn có thể thử

  1. đặt điểm break giữa hai dòng sau đây. Và xem những trang bạn đang ở khi dòng thứ hai là hit
  2. giới thiệu một chút chậm trễ giữa hai dòng này qua Thread.Sleep

    Driver.FindElement (By.Id ("submenuitem4")). Click() ; var headerelement = Driver.FindElement (By.ClassName ("header"));

+0

đã thử chức năng thread.sleep mà bạn đã đề xuất. trước khi tôi thêm nó, khi tôi chạy thử nghiệm nó luôn luôn là thử nghiệm thứ hai thất bại, nhưng với lệnh ngủ nó luôn luôn là thử nghiệm thứ hai mà quá khứ và lần đầu tiên không thành công? kỳ lạ! –

+0

Vì vậy, điều này có thể có nghĩa là bạn cần thread.sleep phía trên công cụ tìm phần tử "header" đó, để cung cấp đủ thời gian cho trình duyệt tải trang trước khi ổ của bạn tìm kiếm phần tử đó. Hãy thử tương tự trong bài kiểm tra đầu tiên. – chandmk

+0

ok tôi đã thêm chức năng ngủ cho cả hai bài kiểm tra và họ đã vượt qua! lạ tôi đã thử nó trước nhưng không bao giờ thêm chúng vào cả hai .. không chắc chắn lý do tại sao họ vượt qua bây giờ nhưng im chuffed nether ít! cảm ơn sự giúp đỡ của bạn. –

1

xem xét TestFixtureSetup, Setup, TestFixtureTearDownTearDown.
Các thuộc tính này cho phép bạn thiết lập môi trường thử nghiệm một lần, thay vì một lần cho mỗi thử nghiệm.

+0

những gì bạn đề nghị tôi có thể làm sạch trong TestFixtureTearDown? –

+0

@GraemeSecondwave Thật không may là tôi không biết Selenium. Tuy nhiên tôi biết rằng khi tôi đã chạy thử nghiệm với nhau họ thất bại và khi tôi thêm các hướng dẫn chung để thiết lập nó hoạt động. Ví dụ, điều gì sẽ xảy ra nếu bạn thêm 'NavigateTo () .LogonAsCustomerAdministrator();' vào một TestFixtureSetup? – Default

+0

Nếu dòng 'var headerelement ...' được đánh dấu, nó có lẽ là dòng trước khi nó ném một ngoại lệ. Hãy chắc chắn rằng submenuitem4 tồn tại. Bạn đã thử gỡ lỗi chưa? (Nhấp chuột phải vào thử nghiệm của bạn, chọn Test With -> Debugger) – Default

0

Bạn có chắc chắn rằng sau khi chạy một trong các bài kiểm tra phương pháp

NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 

đưa bạn trở lại nơi mà bạn nên có? Dường như thất bại là do trình xử lý điều hướng không đúng (giả sử rằng phần tử header xuất hiện và được tìm thấy trong cả hai bài kiểm tra).

+0

cũng xem trình điều khiển điều hướng thông qua thử nghiệm của tôi nó tải lên tất cả các trang và điều hướng đến trang như dự định. và tiêu đề trang im tìm kiếm hiển thị. nó không giống như 'phần tử Header' như là bài kiểm tra khi nó được truyền khi tự nó chạy? –

2

Nếu không biết cách thức hoạt động của Selenium, đặt cược của tôi là Driver có vẻ là lớp tĩnh để 2 bài kiểm tra chia sẻ trạng thái. Một ví dụ về trạng thái được chia sẻ là Driver.Url. Bởi vì các thử nghiệm được chạy song song, có một điều kiện chủng tộc để thiết lập trạng thái của đối tượng này.

Điều đó nói rằng, tôi không có một giải pháp cho bạn :)

1

Nếu không có câu trả lời ở trên làm việc cho bạn, tôi giải quyết vấn đề này bằng cách thêm Thread.Sleep(1) trước khi khẳng định trong các thử nghiệm thất bại ...

Có vẻ như kiểm tra đồng bộ bị mất ở đâu đó ... Xin lưu ý rằng các thử nghiệm của tôi không phụ thuộc vào thứ tự, rằng tôi không có bất kỳ thành viên tĩnh nào cũng không phụ thuộc vào bên ngoài.

+0

+1 vì bạn đã khiến tôi nhận ra rằng đối tượng tĩnh của tôi là vấn đề và nguyên nhân gây ra lỗi của tôi. Cảm ơn bạn! – workabyte

0

Tôi nghĩ rằng bạn cần đảm bảo rằng bạn có thể đăng nhập cho thử nghiệm thứ hai, điều này có thể không thành công, vì bạn đã đăng nhập?

-> đặt đăng nhập trong một thiết lập phương thức hay (vì có vẻ như bạn đang sử dụng cùng một người dùng cho cả các bài kiểm tra) thậm chí lên đến các thiết lập cố -> logoff (nếu cần) có thể là đặt vào phương pháp rách xuống

 [SetUp] 
    public void LaunchTest() 
    { 
     NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 
    } 

    [TearDown] 
    public void StopTest() 
    { 
     // logoff 
    } 
    [Test] 
    public void Test1() 
    {...} 
    [Test] 
    public void Test2() 
    {...} 

Nếu có sự chậm trễ trong DOM thay vì thread.sleep Tôi khuyên bạn nên sử dụng webdriver.wait kết hợp với điều kiện. Giấc ngủ có thể hoạt động ở mức 80% và ở những người khác thì không. Các cuộc thăm dò chờ đợi cho đến khi thời gian chờ đạt đến mức đáng tin cậy hơn và cũng có thể đọc được. Dưới đây là ví dụ về cách tôi thường tiếp cận điều này:

var webDriverWait = new WebDriverWait(webDriver, ..); 
    webDriverWait.Until(d => d.FindElement(By.CssSelector("..")) 
     .Displayed)) 
1

Tình huống như vậy thường xảy ra khi kiểm tra đơn vị đang sử dụng tài nguyên/dữ liệu được chia sẻ theo một cách nào đó.

  1. Điều này cũng có thể xảy ra nếu hệ thống của bạn được thử nghiệm có các trường/thuộc tính tĩnh đang được tận dụng để tính toán đầu ra mà bạn đang khẳng định.
  2. Điều này có thể xảy ra nếu hệ thống đang được thử nghiệm đang được chia sẻ (phụ thuộc) tĩnh.
Các vấn đề liên quan