2010-09-29 31 views
21

Michael Feathers, trong Làm việc hiệu quả với Legacy Mã, trên các trang 13-14 đề cập:Làm thế nào chậm là quá chậm cho các bài kiểm tra đơn vị?

Một thử nghiệm đơn vị đó phải mất 1/10th của một thứ hai để chạy là một thử nghiệm đơn vị chậm ... Nếu [kiểm tra đơn vị] không chạy nhanh, chúng không phải là kiểm tra đơn vị.

Tôi có thể hiểu tại sao 1/10 giây là quá chậm nếu có 30.000 bài kiểm tra, vì sẽ mất gần một giờ để chạy. Tuy nhiên, điều này có nghĩa là 1/11 giây có tốt hơn không? Không, không thực sự (vì nó chỉ nhanh hơn 5 phút). Vì vậy, một quy tắc nhanh chóng có thể không hoàn hảo.

Vì vậy, khi xem xét chậm như thế nào là quá chậm cho một bài kiểm tra đơn vị, có lẽ tôi nên thuật lại câu hỏi. Mất bao lâu để nhà phát triển đợi bộ kiểm tra đơn vị hoàn thành?

Để đưa ra ví dụ về tốc độ thử nghiệm. Hãy xem một số thời gian thử nghiệm đơn vị MSTest:

0.2637638 seconds 
0.0589954 
0.0272193 
0.0209824 
0.0199389 
0.0088322 
0.0033815 
0.0028137 
0.0027601 
0.0008775 
0.0008171 
0.0007351 
0.0007147 
0.0005898 
0.0004937 
0.0004624 
0.00045 
0.0004397 
0.0004385 
0.0004376 
0.0003329 

Mức trung bình cho tất cả 21 thử nghiệm đơn vị này là 0.019785 giây. Lưu ý kiểm tra chậm nhất là do nó sử dụng Microsoft Moles để giả lập/cô lập hệ thống tệp. Vì vậy, với ví dụ này, nếu bộ thử nghiệm đơn vị của tôi tăng lên 10.000 thử nghiệm, nó có thể mất hơn 3 phút để chạy.

+2

Tôi nghĩ rằng mức trung bình của bạn là sai. –

+0

Bạn nói đúng. Tôi đã điều chỉnh nó. 0,019785 thay vì 0.19785 – Matt

Trả lời

18

Tôi đã xem xét một dự án như vậy mà số lượng kiểm tra đơn vị đã khiến hệ thống mất quá nhiều thời gian để kiểm tra mọi thứ. "Quá dài" có nghĩa là bạn về cơ bản đã không làm điều đó như là một phần của thói quen phát triển bình thường của bạn.

Tuy nhiên, những gì họ đã làm là phân loại các bài kiểm tra đơn vị thành hai phần. Kiểm tra quan trọng và "mọi thứ khác".

Các kiểm tra quan trọng chỉ mất vài giây để chạy và chỉ kiểm tra các phần quan trọng nhất của hệ thống, nơi "quan trọng" ở đây có nghĩa là "nếu có gì sai ở đây, mọi thứ sẽ bị sai".

Các thử nghiệm đã thực hiện toàn bộ quá trình chạy quá lâu đã được chuyển xuống phần "mọi thứ khác" và chỉ chạy trên máy chủ xây dựng.

Bất cứ khi nào ai đó đã cam kết mã vào kho kiểm soát nguồn, các kiểm tra quan trọng sẽ chạy lần đầu tiên và sau đó là "chạy toàn bộ" được lên lịch vài phút trong tương lai. Nếu không ai kiểm tra mã trong khoảng thời gian đó, thì các thử nghiệm đầy đủ đã được chạy.Cấp, họ đã không mất 30 phút, giống như 8-10.

Điều này được thực hiện bằng cách sử dụng TeamCity, vì vậy ngay cả khi một đại lý xây dựng bận rộn với bộ thử nghiệm đơn vị đầy đủ, các đại lý xây dựng khác vẫn có thể nhận các cam kết bình thường và chạy thử nghiệm đơn vị quan trọng thường xuyên khi cần.

+0

+1 cho cách bạn đã xác định "quá dài". "Quá dài" thường được xác định cho các lệnh giao diện người dùng trong khoảng 3 giây - lượng thời gian người dùng sẵn sàng chờ trước khi họ từ bỏ hoặc trở nên khó chịu nghiêm trọng. Trong trường hợp này chúng ta phải nhớ rằng chúng ta vẫn là người dùng, và định nghĩa của bạn chỉ là một lời nhắc nhở như vậy. – devgeezer

+0

Tôi thích ý tưởng của bạn về việc sử dụng yếu tố quan trọng làm thứ nguyên để quyết định cách tách các bài kiểm tra. Tuy nhiên, quan trọng là trực giao với tốc độ. Trong trường hợp của chúng tôi, chúng tôi có các thử nghiệm vừa là "nếu có điều gì sai ở đây, mọi thứ sẽ sai" và chậm vì chúng yêu cầu cơ sở dữ liệu SQL chạy. (Có, chúng ta phải có SQL thực thi để xác định tính chính xác. Mocking nó sẽ liên quan đến việc viết lại RDBMS.) Chúng tôi sử dụng sqlite3, nhưng cũng cần hỗ trợ PostgreSQL và MySQL trong dự án Python 3 của chúng tôi. Vẫn đang tìm ra điều này ... –

0

Vậy câu hỏi của bạn là gì? :-) Tôi đồng ý, số liệu thực sự ở đây là các nhà phát triển phải chờ bao lâu để chạy thử nghiệm đơn vị hoàn chỉnh. Quá lâu và họ sẽ bắt đầu cắt góc trước khi cam kết mã. Tôi muốn thấy một bản dựng cam kết hoàn chỉnh chỉ mất chưa đầy một hoặc hai phút, nhưng điều đó không phải lúc nào cũng có thể. Tại công việc của tôi, một cam kết xây dựng được sử dụng để mất 8 phút và mọi người chỉ mới bắt đầu chạy các phần nhỏ của nó trước khi cam kết - vì vậy chúng tôi đã mua các máy móc mạnh hơn :-)

0

Quá lâu để nhà phát triển chờ đợi đơn vị kiểm tra bộ để hoàn thành? Nó thực sự phụ thuộc vào thời gian mà các nhà phát triển vui vẻ chờ phản hồi về sự thay đổi của họ. Tôi muốn nói nếu bạn bắt đầu nói chuyện vài phút quá chậm và có lẽ bạn nên chia bộ thử nghiệm thành các dự án thử nghiệm riêng lẻ và chạy riêng chúng.

2

Tôi đã có các kiểm tra đơn vị mất vài giây để thực thi. Tôi có một phương pháp thực hiện rất tính toán phức tạp và hàng tỷ và hàng tỷ hoạt động. Có một số ít biết giá trị tốt mà chúng tôi sử dụng làm cơ sở cho thử nghiệm đơn vị khi chúng tôi tái cấu trúc phương pháp phức tạp và nhanh chóng này (chúng tôi phải tối ưu hóa crap ra khỏi nó bởi vì, như tôi đã nói, nó đang thực hiện hàng tỷ và hàng tỷ tính toán).

Quy tắc không thích ứng với mọi không gian tên miền/vấn đề. Chúng tôi không thể "phân chia" phương pháp này thành các phương pháp nhỏ hơn mà chúng tôi có thể kiểm tra đơn vị: nó là một phương pháp rất nhỏ nhưng rất phức tạp (sử dụng các bảng precomputed cực kỳ lớn không thể tạo lại đủ nhanh trên các phương pháp này). Các tính năng: bay vv).

Chúng tôi có các bài kiểm tra đơn vị cho phương pháp đó. Họ là những bài kiểm tra đơn vị. Họ mất vài giây để thực hiện. Đó là một điều tốt [TM]. Bây giờ tất nhiên tôi không tranh cãi rằng bạn sử dụng các thư viện kiểm tra đơn vị như JUnit cho những thứ không phải là thử nghiệm đơn vị: ví dụ chúng tôi cũng sử dụng JUnit để kiểm tra kịch bản đa luồng phức tạp. Những cái này không phải là "kiểm tra đơn vị" nhưng bạn đặt cược rằng JUnit vẫn quy tắc ngày :)

5

Tôi đã từng làm việc trên các dự án mà bộ thử nghiệm mất ít nhất mười phút để chạy. Những cái lớn hơn, nó giống như giờ. Và chúng tôi hút nó lên và chờ đợi, bởi vì họ đã được khá nhiều đảm bảo để tìm thấy ít nhất một vấn đề trong bất cứ điều gì bạn ném vào họ. Các dự án lớn và lông.

Tôi muốn biết những dự án này có thể được kiểm tra toàn diện trong vài giây.

(Bí quyết để hoàn thành công việc khi kiểm tra đơn vị dự án của bạn mất hàng giờ là có bốn hoặc năm thứ bạn đang làm việc cùng lúc. Bạn ném một bộ bản vá vào bộ thử và bạn chuyển công việc và khi bạn hoàn thành công việc mà bạn đã chuyển sang, có thể kết quả của bạn đã trở lại.)

+1

Có vẻ như bạn không hiểu sự khác biệt giữa kiểm tra UNIT và thử nghiệm INTEGRATION. Theo định nghĩa, một bài kiểm tra đơn vị nên kiểm tra một đơn vị (gọn gàng như thế nào tên cho biết mục đích của nó) của mã. Sử dụng một ví dụ MVC, nếu bạn có một kiểm tra điều khiển mà instantiates một đối tượng (hoặc nhiều hơn) trong lớp kinh doanh của bạn mà lần lượt instantiates một hoặc nhiều đối tượng trong lớp kho lưu trữ của bạn, bạn không có một bài kiểm tra UNIT. Bạn có bài kiểm tra tích hợp. Trong khi instantiating một đối tượng giả không phải là "miễn phí", khuôn khổ giả tốt vẫn còn cách nhanh hơn so với nhấn kho của bạn. –

+2

Nếu bạn có một bộ thử nghiệm thực sự chỉ bao gồm các bài kiểm tra UNIT và vẫn mất nhiều giờ để chạy, thì kiến ​​trúc sư doanh nghiệp của bạn đã thất bại vì chúng cho phép bạn tạo một hệ thống nguyên khối nghiêm túc. như dịch vụ. –

+7

Tôi đoán bạn đã không bao giờ làm việc trên, ví dụ, một trình duyệt web. Xác thực trình phân tích cú pháp CSS trong Firefox, * tất cả - * không có chức năng liên quan, chỉ cần "phân tích cú pháp này và kiểm tra cấu trúc dữ liệu kết quả là nó cần" - liên quan đến thứ tự 100.000 bài kiểm tra, tổng cộng, mất khoảng năm phút để chạy. Đó là ngữ pháp CSS lớn và phức tạp như thế nào. – zwol

2

Trước tiên, hãy xem nhận xét của tôi về câu trả lời của Zack về sự khác biệt giữa các bài kiểm tra UNIT và INTEGRATION.

Tiếp theo, sử dụng một công cụ như Might-Moose (http://continuoustests.com/) chỉ chạy các thử nghiệm bị ảnh hưởng bởi thay đổi mã của bạn (thay vì toàn bộ thư viện kiểm tra) mỗi khi bạn đăng ký một tệp. Trước khi bạn bắt đầu rên rỉ về "Mất bao lâu", hãy xem các video trên trang web của họ. Oh, nhân tiện, nó miễn phí.

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