2008-09-12 37 views
52

Sử dụng biểu mẫu giành chiến thắng với kiến ​​trúc MVC/MVP, tôi thường sử dụng lớp để bọc chế độ xem để kiểm tra giao diện người dùng trong khi sử dụng mô hình cho mô hình và bộ điều khiển/trình bày. Lớp trình bao bọc sẽ làm cho hầu hết mọi thứ trong giao diện người dùng là một thuộc tính quan sát được cho nhân tố thử nghiệm thông qua các thuộc tính và sự kiện.Làm cách nào để kiểm tra giao diện người dùng WPF?

Đây có phải là phương pháp khả thi để thử nghiệm ứng dụng WPF không? Có cách nào tốt hơn? Có bất kỳ gotchas để xem ra cho?

Trả lời

49

Đối với bản thân quá trình thử nghiệm, có lẽ bạn nên sử dụng khung làm việc UI Automation. Hoặc nếu bạn muốn một cách thông thạo hơn và wpf/winforms/win32/swt-độc lập bằng cách sử dụng khung công tác, bạn có thể tải xuống White từ Codeplex (miễn là bạn đang ở vị trí sử dụng mã nguồn mở trong môi trường của mình).

Đối với gotchas; Nếu bạn đang cố gắng để đơn vị kiểm tra quan điểm của bạn, bạn có thể sẽ chạy vào một số vấn đề luồng.Ví dụ, nếu bạn đang chạy NUnit thì trình thử nghiệm mặc định sẽ chạy trong MTA (Multi-Threaded Appartment), trong khi WPF cần chạy như STA (Single-threaded Appartment). Mike Two có một thực sự dễ dàng bắt đầu vào đơn vị kiểm tra WPF, nhưng mà không xem xét vấn đề luồng. Josh Smith có một số suy nghĩ về vấn đề luồng trong this post, và ông cũng trỏ đến this article bởi Chris Hedgate. Chris sử dụng phiên bản sửa đổi của số CrossThreadTestRunner của Peter Provost để bao bọc các vấn đề MTA/STA theo cách thân thiện hơn một chút.

+0

: NUnit 2.5 có STATThreadAttribute Cũng chắc chắn đánh giá TestAutomationFX - thực sự tốt đẹp (không liên kết, chỉ là khách hàng). Cũng nhìn vào White - nhưng nó dường như không có một câu chuyện ghi âm trong cùng một ballpark. –

+0

Ah, chỉ xem http://stackoverflow.com/questions/58340/how-to-test-a-wpf-user-interface/341120#341120, LOL! –

+0

Nhưng đây là con rồng :) Tình yêu trắng .. 2+ năm người dùng trên các dự án thực tế. Tuy nhiên, màu trắng có vấn đề với WPF Templating (UI Thành phần .. ví dụ như một treenode gồm 2 hình ảnh, một nút mở rộng, 2 hộp văn bản. Bạn càng có nhiều ưa thích, thời gian khó chịu hơn trong Tự động hóa. Trong một số trường hợp, giao diện người dùng Cây không hiển thị các phần tử mà bạn có thể nhìn thấy trên màn hình. Tuy nhiên, WPF Snoop sẽ kết thúc các trích dẫn và danh sách lớn, ví dụ nếu bạn có một cây lớn hoặc một mạng lưới với nhiều bản ghi, việc tìm kiếm một nút/bản ghi lồng nhau là khá một bài tập. – Gishu

10

@ Matt David,

Vui lòng đọc tài liệu và hãy nhìn vào các mẫu mã cho Microsoft CompositeWPF (aka Prism). Đó là một dự án được tạo ra đặc biệt để dạy cách xử lý kiến ​​trúc MVP/MVC theo cách thử nghiệm. Ứng dụng mẫu của họ chứa các bài kiểm tra đơn vị cho người trình bày \ controllers và các bài kiểm tra chấp nhận rất thú vị cho UI (họ sử dụng White framework để mô phỏng hành động của người dùng)

+1

Trước khi bạn khởi động vào sử dụng trắng bạn nên biết rằng nó dường như không làm việc tốt (nếu có) trên x64. –

+0

@AdeMiller - lần cuối tôi nhìn nó không được hỗ trợ. Tuy nhiên nó không hoạt động nếu bạn sử dụng một Á hậu thử nghiệm 32bit trên máy x64 HOẶC bạn có thể thực hiện một số sửa lỗi được đề xuất cho nguồn (tìm kiếm diễn đàn thảo luận trắng) và biên dịch lại. Nhưng trước khi tất cả điều này, hãy kiểm tra xem các bản sửa lỗi đó đã được tích hợp vào bản phát hành mới nhất chưa .. – Gishu

0

Nó sẽ hoạt động tốt hơn, dễ dàng hơn so với hình thức thắng.

Kiểm tra "Hướng dẫn chất lượng ứng dụng WPF", nó có khá nhiều thử nghiệm trên giao diện WPF. Cũng đừng quên lớp AutomationPeer.

9

theo cách thủ công. Tôi không phải là người hâm mộ lớn về kiểm tra giao diện người dùng tự động nếu đó là những gì bạn đang nhận được. Tôi không chắc chắn về các hướng dẫn WPF (cần phải đọc qua các liên kết của aku) .. bởi vì họ vẫn còn kiên cố hóa như vậy để nói ... WPF đã không ổn định từ điểm của 'những gì là đúng cách'. Trừ khi bạn đang sử dụng một trong các khuôn khổ phát triển này .. Tôi sẽ bảo thủ w.r.t. nỗ lực

  • Kiểm tra (Tự động tốt hơn TDDed) logic/người trình bày/bộ điều khiển tàn nhẫn. Tôi không ủng hộ sự cẩu thả hoặc thờ ơ.
  • Giữ cho giao diện người dùng mỏng và nhận được một số người thử nghiệm khó chịu để có một (thủ công) nứt nó với thử nghiệm thăm dò - không có gì là tốt như một 'thử nghiệm từ địa ngục' khi nói đến giao diện người dùng. Nỗ lực: đạt được tỷ lệ từ tự động hóa loại thử nghiệm này là rất lớn, không nắm bắt được mọi thứ và không có ý nghĩa ... ngoại trừ việc làm dịu các bậc cao hơn 'Look Mgr! Không tay! giao diện người dùng tự kiểm tra! '

PS: bạn có thể muốn xem this (Mary Poppendieck's Google Talk on Lean).. especially the part about what to automate in testing

+3

Kiểm tra thủ công không hoàn toàn thay thế tự động (hoặc ngược lại). Mục đích của thử nghiệm tự động không phải là để tìm lỗi, nó là để đảm bảo rằng những thay đổi mới không phá vỡ các tính năng cũ đã được thử nghiệm. – ima

+0

Tôi nghĩ rằng tôi đã để lại một từ quan trọng ở đó :) trong viên đạn đầu tiên. – Gishu

+7

Bạn quên kiểm tra hồi quy - đó là một nỗi đau thực sự cho một trình kiểm tra thủ công để chạy qua hàng trăm biểu mẫu chỉ để kiểm tra một số công cụ cơ bản có thể dễ dàng thực hiện tự động hơn. Tốt hơn hãy dành thời gian cho người thử nghiệm những thứ tẻ nhạt này, vì vậy anh ta có thể tập trung vào thử nghiệm khó chịu. – Sam

3

Prism (Composite WPF) được xây dựng chủ yếu giữ "Testability" trong tâm trí. Đi cho nó, nếu bạn nghĩ rằng nó phù hợp với loại phát triển của bạn.

Cũng ở đây là the dotnetrocks episode bạn có thể nghe, nếu bạn cần thêm thông tin về lăng kính trong âm thanh.

1

Để biết thông tin cơ bản, bạn cũng có thể xem một số video ngắn trên kênh9 herehere.

0

Chắc chắn xem xét TestAutomationFX.com. Người ta có thể đầu tư (OK, tôi đã làm) rất nhiều thời gian cố gắng để nắm bắt/ghi lại các sự kiện với màu trắng. (Khi bắt đầu nhiệm vụ của tôi, tôi đã bỏ qua bài đăng ở hai nơi khác đề cập đến nó).

Tất nhiên, thứ hai là các điểm khác về loại thử nghiệm tốt nhất không phải là thử nghiệm giao diện người dùng.

Nhưng nếu ai đó sẽ làm điều gì đó có thể tự động hóa trong giao diện người dùng để tránh những thiếu sót trong các loại thử nghiệm khác, TAFX có vẻ là tuyến đường nhanh nhất ở đó.

0

Hãy dùng thử Ranorex V2.0 để tự động hóa WPF. Với RanoreXPath và Ranorex kiểm tra kho mã tự động hóa có thể hoàn toàn tách biệt với thông tin nhận dạng. Ranorex cũng cung cấp một trình chỉnh sửa capture/replay dựa trên các đối tượng RanoreXPath.

0

Thay vì sử dụng trình kiểm tra tự động, bạn có thể tạo các kiểm tra đơn vị thực sự cho GUI của mình với IcuTest.

1

Bạn cũng có thể dùng thử Guia. Nó cho phép bạn trực tiếp kiểm tra đơn vị WPF UserControl.

0

Tôi cũng khuyên bạn nên sử dụng TestAutomationFX để tự động hóa đơn giản thử nghiệm ui. TestAutomationFX cho phép bạn làm việc với các công cụ netAdvantage cho wpf, không hoạt động với màu trắng và QTP. TestAutomationFX có giao diện dễ sử dụng, nó tích hợp với studio trực quan và có một máy ghi âm tốt để ghi lại các sự kiện của người dùng.

4

2016 Cập nhật: Sử dụng khuôn khổ TestStack.White miễn phí để tự động kiểm tra WPF UI

  • Project White has been abandoned, nhưng người kế nhiệm của nó TestStack.White có sẵn qua một gói NuGet.
  • TestStack.White có phương pháp hữu ích cho starting WPF apps, finding cửa sổ/user control elements, clicking buttons/elements, mô phỏng mouse and keyboard sự kiện, waiting, vv ..
  • Một ví dụ mà sẽ khởi động một ứng dụng WPF, bấm vào một nút, và kiểm tra kết quả vẻ như sau:

    using TestStack.White; 
    using TestStack.White.UIItems; 
    using TestStack.White.Factory; 
    
    [TestMethod] 
    public void TestDoSomething() 
    { 
        //Opens the app 
        var app = Application.Launch("MyApp.exe"); 
    
        //Finds the main window (this and above line should be in [TestInitialize]) 
        var window = app.GetWindow("My App Window Title", InitializeOption.NoCache); 
    
        //Finds the button (see other Get...() methods for options) 
        var btnMyButton = window.Get<Button>("btnMyButtonWPFname"); 
    
        //Simulate clicking 
        btnMyButton.Click(); 
    
        //Gets the result text box 
        //Note: TextBox/Button is in TestStack.White.UIItems namespace 
        var txtMyTextBox = window.Get<TextBox>("txtMyTextBox"); 
    
        //Check for the result 
        Assert.IsTrue(txtMyTextBox.Text == "my expected result"); 
    
        //Close the main window and the app (preferably in [TestCleanup]) 
        app.Close(); 
    } 
    
Các vấn đề liên quan