2012-12-09 23 views
6

Tôi đang viết một bộ thử nghiệm cho một webapp bằng TestNG và Selenium WebDriver.TestNG Chạy tất cả các phương thức lớp nhiều lần sơ bộ làm @BeforeClass với dữ liệu được cung cấp

Điều tôi cần là chạy tất cả các phương thức của lớp thử nghiệm nhiều lần cho những người dùng được xác thực khác nhau (dữ liệu được rút ra khi chạy: từ một DB). Vì vậy, tôi cần chuyển dữ liệu đến lớp với nhà cung cấp dữ liệu, cung cấp thông tin đăng nhập của tất cả người dùng, sau đó cho mỗi người dùng tôi cần tạo trình điều khiển web (cho độ tinh khiết của thử nghiệm) và xác thực bằng thông tin được cung cấp theo phương thức @BeforeClass tất cả các phương thức của @Test của lớp và tạo trình điều khiển web đóng xuống @AfterClass.

Tôi có thể làm điều đó bằng cách nào?

nỗ lực của tôi để làm điều này đang ở đây: https://gist.github.com/4246674

Attempt1 là để đặt một @Test(dataProvider="getUsersIdAndName") trên lớp. Nó không hoạt động vì vì nó bật ra @Test(dataProvider=) trên lớp không có nghĩa là tất cả các phương thức của lớp nên được gọi với dữ liệu được cung cấp. Kết quả là phương thức đó không được viện dẫn chút nào bởi vì không có dữ liệu để truyền cho đối số. Và tôi nhận được báo cáo thử nghiệm lạ, nơi phương pháp này được đánh dấu là thông qua với thời gian thực hiện là 0 giây. (Đây là một dự án Maven được mở trong NetBeans, nếu điều này có ý nghĩa.)

@Test(dataProvider=) trên lớp nghĩa là gì không?

Attempt2 đã thêm dataProvider trên chú thích @Test của phương thức. Nó không hoạt động vì điều này có nghĩa là phương thức thử nghiệm được gọi hai lần trong khi chạy lớp đơn. Kết quả là ở lần thứ hai nó không thành công vì nó cố gắng lặp lại thử nghiệm trong khi trình điều khiển web không được khởi động lại: trình duyệt đã hiển thị một trang khác. Ngoài ra còn có những bất lợi của nỗ lực đầu tiên và thứ hai đăng nhập chính nó được thực hiện trong phương pháp thử nghiệm hơn là trong phương pháp @BeforeClass bởi vì tôi không biết cách cung cấp dữ liệu từ nhà cung cấp dữ liệu.

Cố gắng3 là một nỗ lực tuyệt vọng để kết hợp @BeforeClass@Test trên phương thức duy nhất. Nó không hoạt động vì @BeforeClass cũng yêu cầu @Parameters nếu một phương thức chú thích có danh sách tham số. Kết quả là phương thức này được gọi ba lần: lần đầu tiên khi thiết lập lớp khi nó không thành công vì lý do trên và hai lần vì nhà cung cấp dữ liệu khi nó thành công.

Sau đó, tôi phát hiện ra rằng TestNG không cung cấp một cách để gọi tất cả các phương thức lớp nhiều lần với các dữ liệu khác nhau: http://comments.gmane.org/gmane.comp.java.testng.user/864

Tôi có hai ý tưởng khác làm thế nào tôi có thể lưu trữ các tác dụng tương tự.

Idea4 là đặt @Test(dataProvider=) trên mỗi phương pháp thử nghiệm, mỗi phương pháp sẽ tự thực hiện xác thực và thử nghiệm isAuthenticated() và sau đó thực hiện kiểm tra riêng của nó. Không hiệu quả và xấu xí. Idea2 trông giống như giá cả phải chăng nhất là đánh dấu bằng @Test chỉ một phương pháp sẽ tổng hợp tất cả các phương pháp thử khác: nó nhận dữ liệu từ nhà cung cấp dữ liệu, thực hiện xác thực bởi người dùng đã cho, sau đó chạy thử nghiệm isAuthenticated và tất cả những thứ cần thiết khác kiểm tra.Trong trường hợp này, @BeforeClass@AfterClass chỉ thiết lập và xé trình điều khiển web. Cách tiếp cận này có bất lợi mà tôi mất khả năng sử dụng @BeforeMethod@AfterMethod nhưng điều này là giá cả phải chăng với tôi: có vẻ như tôi sẽ không cần chúng.

Có cách nào tốt hơn để lưu trữ cùng một hiệu ứng không?

Xin lỗi vì có tin nhắn dài.

Xin cảm ơn trước.

Trả lời

8

Bạn có thể thử khám phá Nhà máy để đáp ứng nhu cầu của mình. Nhà máy sẽ cho phép bạn chạy tất cả các phương thức được chú thích bằng @Test của một lớp với các dữ liệu khác nhau. Bạn có thể initalize ur webdriver trong beforeclass ur trong trường hợp đó. Giải thích here.

+0

Cảm ơn. Được quản lý để thực hiện chính xác những gì tôi muốn. Đặt chú thích '@ Factory' trên hàm tạo và làm cho nó nhận dữ liệu từ nhà cung cấp dữ liệu. Mỗi thể hiện của lớp kiểm tra bây giờ đại diện cho một trình điều khiển web đăng nhập như một số người dùng đang thực hiện một loạt các thử nghiệm. Constructor tải các thuộc tính và lưu trữ các thông tin xác thực người dùng được chỉ định trong các trường lớp. Phương thức '@ BeforeClass' khởi tạo trình điều khiển web và đăng nhập bằng thông tin đăng nhập được lưu trữ. '@ AfterClass' đóng trình điều khiển web. Nếu bất cứ ai quan tâm, mã đầy đủ là ở đây. – yaromir

2

Được rồi, hãy để tôi cố gắng trả lời các câu hỏi của bạn dựa trên kinh nghiệm của tôi với testNG và webdriver.

Q. @Test (dataProvider =) trên lớp có nghĩa là gì không?
A. No. dataProvider là chú thích cấp phương thức chứ không phải cấp độ lớp. Như đã đề cập here. Nó phải là một phương thức cung cấp dữ liệu cho phương thức Test trong định dạng Object [] [].

Q. Cách đạt được kịch bản bạn đã đề cập? (Giả sử tôi hiểu kịch bản của bạn ..)
A. Bạn nên sử dụng @BeforeMethod thay vì @BeforeClass để khởi tạo đối tượng webdriver. Bằng cách đó bạn có thể tạo một đối tượng WD khác nhau cho mỗi phương thức. Và dataProvider có thể chuyển nhiều dữ liệu đến phương thức isAuthenticated(). Nếu bạn muốn truyền tệp cấu hình ở cấp lớp, bạn có thể giữ @BeforeClass chỉ với logic tải tệp thuộc tính trong đó. Vì vậy, tập tin thuộc tính sẽ được nạp một lần cho cả lớp. Rõ ràng, bạn cũng nên sử dụng @AfterMethod để đóng đối tượng webdriver.

+0

Cảm ơn câu trả lời. Tôi đã nghĩ về giải pháp này (ý tưởng №4), nhưng quyết định rằng nó không hiệu quả vì nó là dư thừa để khởi tạo trình điều khiển web và đăng nhập trước mỗi phương pháp thử nghiệm, bởi vì, lý tưởng, nó đủ để làm điều này một lần cho mỗi bài kiểm tra các phương thức trong lớp. Tôi chỉ cần thực hiện tất cả các hành động nhiều lần với các phiên bản trình điều khiển web khác nhau được đăng nhập với tư cách người dùng khác nhau. Cảm ơn mọi người. Có thông tin hữu ích. – yaromir

Các vấn đề liên quan