2009-06-16 37 views
7

Có cách nào tôi có thể hiển thị tiến trình của một TestMethod đơn trong Visual Studio 2008 không?Có thể hiển thị tiến trình trong khi thực thi Visual Studio TestMethod không?

Trong một tập hợp các bài kiểm tra đơn vị, tôi có một TestMethod duy nhất chạy trong một thời gian rất dài - thông thường sẽ mất từ ​​30 đến 60 phút. Tôi đã đặt Thời gian chờ bằng thuộc tính [Hết thời gian], không có vấn đề ở đó. Nhưng tôi muốn có thể nhận được một dấu hiệu trực quan về sự tiến bộ của thử nghiệm.

Tôi biết cửa sổ Kết quả kiểm tra cho phép cập nhật tiến trình trực quan của tất cả các phương pháp thử nghiệm. Những gì tôi muốn là một bản cập nhật tiến độ trực quan của một phương pháp duy nhất. Trong một ứng dụng WinForms tôi sẽ bật lên một điều khiển ProgressBar. Trong ứng dụng giao diện điều khiển, tôi sẽ định vị con trỏ và hiển thị thông báo trạng thái. Nhưng đây là một bài kiểm tra đơn vị. Tôi có thể viết cho TestContext, nhưng cửa sổ đó không thể xem được cho đến khi thử nghiệm hoàn tất.


EDIT: Tôi biết có một cách để làm điều đó; đó là tất cả chỉ là phần mềm, vì vậy luôn luôn có một cách. Nhưng một cách đơn giản, thiết thực là gì?

Một cách để làm là tạo ứng dụng TestMethodProgressMonitor.exe, đọc từ một đường ống có tên và cập nhật thanh tiến trình dựa trên các thông báo đi qua đường ống. TestMethod có thể shellExec TestMethodProgressMonitor.exe, sau đó ghi vào đường ống có tên. Khi kết thúc, có thể có một lệnh shutdown nổi tiếng mà TestMethod gửi tới ứng dụng TestMethodProgressMonitor.exe.

Một tùy chọn khác là xây dựng TestMethodProgressMonitor.exe làm máy chủ COM và TestMethod có thể sử dụng COM (DCOM) để cập nhật thanh tiến trình được lưu trữ trong ứng dụng.

Một tùy chọn khác là sử dụng phương thức sendmessage() của user32.dll để gửi tin nhắn WM_COPYDATA đến ứng dụng màn hình. Điều này đôi khi được thực hiện để điều khiển từ xa các ứng dụng.

Đó là một số khả năng. Trước khi tôi thiết lập về việc xây dựng một trong số họ, tôi muốn biết nếu có một cách đơn giản hơn.

+0

một thử nghiệm đơn vị mất nhiều thời gian, không phải là kiểm tra đơn vị cho mỗi định nghĩa. Điều gì khiến nó mất quá nhiều thời gian? –

+2

Đây là thử nghiệm tạo tệp ZIP64; Bài kiểm tra mã hóa tập hợp các tệp dẫn đến tệp zip lớn hơn 4gb. Sau đó, tệp zip được cập nhật và lưu lại (hai lần). Mã này có khoảng 5 dòng được bao quanh bởi một vòng lặp. Nhưng có rất nhiều và nhiều I/O và rất nhiều DEFLATE. Bạn có thực sự nói rằng định nghĩa của kiểm tra đơn vị bao gồm một giới hạn thời gian? Giới hạn thời gian là bao nhiêu? – Cheeso

Trả lời

5

Tôi chỉ bắt đầu luồng GUI với Cửa sổ có thanh tiến trình.

Đây là đoạn trích để bạn bắt đầu. Nó đơn giản bật lên MyProgressWindow trong một luồng khác (chứ không phải là một tiến trình khác).

[ClassInitialize()] 
static public void MyClassInitialize(TestContext testContext) 
{ 
    start_app_in_gui_thread(); 
} 

static Thread t; 

private static void start_app_in_gui_thread() 
{ 
    t = new Thread(() => { 
     var w = new MyProgressWindow(); 
     var app = new App(); 
     app.ShutdownMode = ShutdownMode.OnMainWindowClose; 
     app.Run(w); 
    }); 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
} 
+0

Doh! Điều đó nghĩa là gì? Whadaya có nghĩa là "bắt đầu một chủ đề GUI"? – Cheeso

+0

Xin lỗi về lingo. Đây là một số mã. Thưởng thức. – Ray

-1

không, nhưng tôi muốn có

1

Để thử nghiệm chạy dài, tôi sử dụng API Trace để đính kèm trình theo dõi (DbgView hoặc tùy chỉnh).

Làm cho nó chết đơn giản để xem những gì đang xảy ra mà không cần phải nhảy qua bất kỳ hoops.

Điều này sẽ không mang lại cho bạn trải nghiệm thanh tiến trình (mặc dù bạn có thể viết một trải nghiệm khá dễ dàng).

+1

Tuyệt vời! Bằng cách này, bằng cách sử dụng System.Diagnostics.Debug thậm chí cho phép bạn xem đầu ra trong cửa sổ Output – sinelaw

0

Không chắc chắn đây là cách dễ nhất, nhưng đây là những gì tôi đã làm. Tôi đã hack một lớp WM_COPYDATA gửi và nhận. Nó là một máy thu phát. Điều này cho phép một ứng dụng Windows giao tiếp với nhau, trên cùng một máy, độ trễ khá thấp. Tôi đóng gói nó như một hội đồng.

Sau đó, tôi đã xây dựng một ứng dụng winforms (UnitTestProgressMonitor.exe) tạo một trong những trình thu phát đó và cập nhật giao diện người dùng dựa trên các thông điệp mà nó nhận được. Các tin nhắn chỉ là chuỗi.Đây là những gì họ làm:

  • thanh 3 - Giao diện tạo ra và hiển thị 3 thanh tiến
  • pb 0 max 100 - đặt tối đa cho thanh tiến trình # 0-100
  • pb 0 giá trị 28 - bộ giá trị cho thanh tiến trình # 0 đến 28
  • dừng - thoát.

Sau đó, trong [TestMethod], tôi tạm dừng UnitTestProgressMonitor.exe, sau đó tạo bộ thu phát và gửi tin nhắn ứng dụng.

Mã thử nghiệm gửi "thanh 3" cho ứng dụng giám sát tiến trình, để yêu cầu tạo 3 thanh tiến trình. Người đầu tiên theo dõi 7 bước trong thử nghiệm. Thanh tiến trình thứ hai đo tiến độ trên tệp zip; mỗi mục trong tệp là một bước dọc theo thanh. Thanh thứ 3 là tiến trình cho một mục nhập riêng lẻ. Một số trong số này là các tệp nhiều gigabyte, do đó việc nén chúng có thể mất một lúc. Trong quá trình thực hiện phép thử, phép thử gửi "bước 0 pb" hoặc bất kỳ điều gì, vào thời điểm thích hợp. Các thông báo này làm cho thanh tiến trình cập nhật. Khi kết thúc thử nghiệm, mã kiểm tra sẽ gửi một "stop" đến ứng dụng màn hình. Để đáp lại điều đó, ứng dụng giám sát tiến trình biến mất. Bài kiểm tra kết thúc.

Unit Test Progress Monitor http://www.freeimagehosting.net/uploads/45b4979b92.jpg

1

tôi đáp ứng yêu cầu như nhau, nhưng bất kỳ tập tin mới hoặc thực thi có vẻ quá nhiều với tôi: Tôi viết bài kiểm tra đơn vị, không phải là một ứng dụng. Mã sau đây ghi tiến trình vào cửa sổ Gỡ lỗi đầu ra:

[TestMethod] 
    public void ProgressTest() 
    { 
     int nLastWritten = -1, nTotal = 10000; 

     for (int i = 0; i < nTotal; i++) 
     { 
      int nProgress = 100 * i/nTotal; 
      if (nProgress > nLastWritten) 
      { 
       System.Diagnostics.Trace.WriteLine("Progress: " + nProgress + "%"); 
       nLastWritten = nProgress; 
      } 
     } 
    } 
Các vấn đề liên quan