2008-09-16 26 views
8

Tôi bị thuyết phục từ this presentation và bình luận khác ở đây trên trang web mà tôi cần phải tìm hiểu để kiểm tra đơn vị. Tôi cũng nhận ra rằng đã có nhiều câu hỏi về thử nghiệm đơn vị nào ở đây. Mỗi lần tôi đi xem xét làm thế nào nó nên được thực hiện trong các ứng dụng tôi hiện đang làm việc trên, tôi đi bộ bối rối. Nó là một ứng dụng ứng dụng xulrunner, và rất nhiều logic là dựa trên sự kiện - khi người dùng nhấp vào đây, hành động này diễn ra.Làm thế nào để một đơn vị kiểm tra các phần mã là thủ tục hoặc dựa trên sự kiện

Thường thì các ví dụ tôi thấy để thử nghiệm là các lớp thử nghiệm - chúng tạo nhanh một đối tượng, cung cấp dữ liệu giả, sau đó kiểm tra các thuộc tính của đối tượng sau đó. Điều đó có ý nghĩa với tôi - nhưng những gì về các phần không hướng đối tượng?

This guy mentioned thử nghiệm đơn vị dựa trên GUI khó trong hầu hết mọi khung kiểm tra, có thể đó là vấn đề. Bản trình bày được liên kết ở trên đề cập rằng mỗi bài kiểm tra chỉ nên chạm vào một lớp, một phương pháp tại một thời điểm. Điều đó dường như loại trừ những gì tôi đang cố gắng làm.

Vì vậy, câu hỏi - làm thế nào để một đơn vị kiểm tra mã thủ tục hoặc dựa trên sự kiện? Cung cấp liên kết đến tài liệu hay hoặc tự giải thích.

Trên một lưu ý phụ, tôi cũng có một thách thức khi không tìm thấy khung kiểm tra được thiết lập để thử nghiệm các ứng dụng xulrunner - có vẻ như các công cụ chưa được phát triển. Tôi tưởng tượng điều này là ngoại vi hơn sự hiểu biết của tôi về các khái niệm, viết mã có thể kiểm thử, áp dụng thử nghiệm đơn vị.

Trả lời

5

Ý tưởng thử nghiệm đơn vị là kiểm tra các phần nhỏ của mã với mỗi bài kiểm tra. Trong một hệ thống dựa trên sự kiện, một dạng thử nghiệm đơn vị bạn có thể làm, sẽ kiểm tra cách trình xử lý sự kiện của bạn phản hồi các sự kiện khác nhau. Vì vậy, kiểm tra đơn vị của bạn có thể đặt một khía cạnh của chương trình của bạn thành một trạng thái cụ thể, sau đó gọi trực tiếp phương thức nghe sự kiện và cuối cùng kiểm tra trạng thái chương trình tiếp theo của bạn.

Nếu bạn dự định thử nghiệm đơn vị hệ thống dựa trên sự kiện, bạn sẽ dễ dàng hơn nếu bạn sử dụng mẫu phun phụ thuộc và lý tưởng sẽ đi toàn bộ và sử dụng đảo ngược điều khiển (xem http://martinfowler.com/articles/injection.htmlhttp://msdn.microsoft.com/en-us/library/aa973811.aspx để biết chi tiết của những mẫu)

(nhờ pc1oad1etter để chỉ ra tôi đã sai lầm liên kết)

+0

Bạn thực sự đã liên kết với cùng một bài viết hai lần ở đó - ý của bạn là gì? – pc1oad1etter

+0

Tôi nghĩ rằng hai khái niệm (DI và IoC) đi qua đầu của tôi. Tôi không nghĩ rằng tôi đã từng học về các mẫu thiết kế trong trường học, hoặc trong bất kỳ công việc nào của tôi. – pc1oad1etter

+3

Tôi cũng chưa học về những người ở trường. Tôi đã học về chúng trong lĩnh vực này. Đừng để nền của bạn hạn chế bạn. Bạn sẽ không nắm bắt được những khái niệm này mà không cho nó một shot (khi thực hiện). –

1

Vấn đề là "lập trình dựa trên sự kiện" liên kết quá nhiều logic đến các sự kiện. Cách hệ thống như vậy nên được thiết kế là phải có một hệ thống con tăng sự kiện (và bạn có thể viết các bài kiểm tra để đảm bảo rằng các sự kiện này được nâng lên theo thứ tự thích hợp). Và cần có một hệ thống con khác chỉ đề cập đến việc quản lý trạng thái của một biểu mẫu. Và bạn có thể viết một bài kiểm tra đơn vị sẽ xác minh rằng các đầu vào chính xác (tức là các sự kiện được nâng lên), sẽ đặt trạng thái biểu mẫu thành các giá trị chính xác.

Ngoài ra, trình xử lý sự kiện thực tế được nâng lên từ thành phần 1 và gọi hành vi trên thành phần 2 chỉ là thử nghiệm tích hợp có thể được thực hiện thủ công bởi người QA.

2

Lúc đầu, tôi sẽ kiểm tra các sự kiện như thế này:

private bool fired; 

private void HandlesEvent(object sender, EventArgs e) 
{ 
    fired = true; 
} 

public void Test() 
{ 
    class.FireEvent += HandlesEvent; 
    class.PErformEventFiringAction(null, null); 

    Assert.IsTrue(fired); 
} 

Và Sau đó, tôi phát hiện ra RhinoMocks. RhinoMocks là một khung công tác tạo ra các đối tượng giả và nó cũng xử lý sự kiện thử nghiệm. Nó có thể có ích cho thử nghiệm thủ tục của bạn.

0

Cách tiếp cận tôi thấy hữu ích cho mã thủ tục là sử dụng TextTest. Nó không quá nhiều về thử nghiệm đơn vị, nhưng nó giúp bạn thực hiện kiểm tra hồi quy tự động. Ý tưởng là bạn có ứng dụng của bạn viết một bản ghi sau đó sử dụng texttest để so sánh nhật ký trước và sau khi thay đổi của bạn.

0

Xem oft-liên kết Working Effectively with Legacy Code. Xem các phần có tiêu đề "Ứng dụng của tôi là tất cả các cuộc gọi API" và "Dự án của tôi không hướng đối tượng. Làm cách nào để tôi thực hiện các thay đổi an toàn?".

Trong thế giới C/C++ (kinh nghiệm của tôi) giải pháp tốt nhất trong thực tế là sử dụng "đường nối" liên kết và liên kết với kiểm tra tăng gấp đôi cho tất cả các chức năng được gọi bởi hàm đang kiểm tra. Bằng cách đó bạn không thay đổi bất kỳ mã kế thừa nào, nhưng bạn vẫn có thể kiểm tra nó trong sự cô lập.

+0

Tôi đã ra lệnh cho cuốn sách - Tôi hy vọng nó là tốt như mọi người nói. – pc1oad1etter

2

Trả lời câu hỏi của riêng tôi ở đây, nhưng tôi đã xem một bài viết giải thích vấn đề và thực hiện một bước đi qua một ví dụ đơn giản - Agile User Interface Development. Mã và hình ảnh là rất lớn, và đây là một đoạn trích cho thấy ý tưởng:

guru Agile như Kent Beck và David Astels đề nghị xây dựng GUI bằng cách giữ các đối tượng xem rất mỏng, và thử nghiệm các lớp "bên dưới bề mặt ". Mô hình "đối tượng thông minh/mỏng " này tương tự như chế độ xem tài liệu quen thuộc và mô hình máy khách-máy chủ, nhưng áp dụng cho sự phát triển của các yếu tố GUI riêng lẻ. Việc tách nội dung và bản trình bày sẽ cải thiện thiết kế của mã, làm cho nó trở nên mô-đun hơn và có thể kiểm tra. Mỗi thành phần của giao diện người dùng được triển khai dưới dạng đối tượng thông minh , chứa hành vi ứng dụng cần được kiểm tra nhưng không có mã trình bày GUI. Mỗi đối tượng thông minh có lớp xem mỏng tương ứng chỉ chứa hành vi chung của GUI. Với kiểu thiết kế này, mô hình , xây dựng GUI trở thành amenable đến TDD.

1

Câu hỏi của bạn không nêu ngôn ngữ lập trình bạn chọn, nhưng của tôi là C# vì vậy tôi sẽ minh họa bằng cách sử dụng điều đó. Tuy nhiên, đây chỉ là một sự tinh tế đối với Gilligans bằng cách sử dụng các đại biểu ẩn danh để nội tuyến mã kiểm thử của bạn. Tôi tất cả đều có lợi cho việc kiểm tra càng dễ đọc càng tốt, và với tôi điều đó có nghĩa là tất cả các mã thử nghiệm trong phương pháp thử nghiệm;

// Arrange 
var car = new Car(); 
string changedPropertyName = ""; 
car.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e) 
         { 
          if (sender == car) 
            changedPropertyName = e.PropertyName; 
         }; 

// Act 
car.Model = "Volvo"; 

// Assert 
Assert.AreEqual("Model", changedPropertyName, 
    "The notification of a property change was not fired correctly."); 

Lớp tôi đang thử nghiệm ở đây thực hiện các giao diện INotifyPropertyChanged và do đó một sự kiện NotifyPropertyChanged nên được nâng lên bất cứ khi nào giá trị của một tài sản đã thay đổi.

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