2009-03-22 23 views
9

Giả sử rằng tôi đã có cơ sở mã của mình ở mức độ bao phủ thử nghiệm đơn vị cao như ý nghĩa. (Ngoài một điểm nhất định, tăng mức độ phù hợp không có ROI tốt.)Cách thực hiện thử nghiệm đơn vị "dựa trên hiệu suất" (benchmark) trong Python

Tiếp theo, tôi muốn kiểm tra hiệu suất. Để chuẩn mực mã để đảm bảo rằng các cam kết mới không làm chậm những thứ xuống không cần thiết. Tôi đã rất hấp dẫn bởi số zero tolerance policy của Safari vì sự chậm trễ từ các cam kết. Tôi không chắc rằng mức độ cam kết về tốc độ có ROI tốt cho hầu hết các dự án, nhưng tôi ít nhất cũng muốn được cảnh báo rằng hồi quy tốc độ đã xảy ra và có thể thực hiện một cuộc gọi phán đoán về nó.

Môi trường là Python trên Linux và một đề xuất cũng có thể thực hiện được đối với các tập lệnh BASH sẽ làm tôi rất vui. (Nhưng Python là trọng tâm chính.)

Trả lời

7

Bạn sẽ muốn thực hiện kiểm tra hiệu năng ở cấp hệ thống nếu có thể - kiểm tra toàn bộ ứng dụng của bạn, với dữ liệu và hành vi gần nhất với việc sử dụng sản phẩm.

Điều này không dễ, và sẽ khó khăn hơn để tự động hóa và nhận được kết quả nhất quán. Ngoài ra, bạn không thể sử dụng máy ảo để kiểm tra hiệu năng (trừ khi môi trường sản xuất của bạn chạy trong máy ảo, và thậm chí sau đó, bạn cần chạy VM trên máy chủ không có gì khác).

Khi bạn nói thực hiện thử nghiệm đơn vị, có thể có giá trị, nhưng chỉ khi nó đang được sử dụng để chẩn đoán một vấn đề thực sự tồn tại ở mức hệ thống (không chỉ trong đầu của nhà phát triển).

Ngoài ra, hiệu suất của các đơn vị trong thử nghiệm đơn vị đôi khi không phản ánh hiệu suất của chúng trong ngữ cảnh, vì vậy nó có thể không hữu ích chút nào.

+0

+1: VÀ ... Thử nghiệm hiệu suất chỉ có ý nghĩa khi bạn có mục tiêu hiệu suất tuyệt đối. Hiếm gặp nói chung; cần thiết trong các hệ thống điều khiển quân sự và ebedded. –

+1

Xin lỗi @ S.Lott - Tôi rất không đồng ý với bạn về điều đó. Bất cứ lúc nào có hơn 2 hoặc 3 người đang làm việc trên một dự án và có một người dùng cuối với mong đợi phản hồi, các nhóm sẽ làm tốt để tự động giám sát hiệu suất của họ chống lại các mục tiêu. Nếu không, tính năng sau khi tính năng được thêm mà không có sự hiểu biết đúng về hiệu ứng của nó về hiệu suất và trải nghiệm của khách hàng. –

2

MarkR là đúng ... thực hiện thử nghiệm hiệu suất trong thế giới thực là chìa khóa, và có thể hơi né tránh trong các bài kiểm tra đơn vị. Có nói rằng, có một cái nhìn tại các mô-đun cProfile trong thư viện chuẩn. Nó sẽ ít hữu ích nhất để cho bạn một cảm giác tương đối từ cam kết cam kết về việc mọi thứ đang chạy nhanh như thế nào, và bạn có thể chạy nó trong một thử nghiệm đơn vị, mặc dù tất nhiên bạn sẽ nhận được kết quả trong các chi tiết bao gồm chi phí của bản thân khung kiểm thử đơn vị. Tuy nhiên, trong tất cả, nếu mục tiêu của bạn là không khoan nhượng, bạn sẽ cần thứ gì đó mạnh mẽ hơn thế này ... cProfile trong một thử nghiệm đơn vị sẽ không cắt nó chút nào, và có thể gây hiểu lầm.

2

Khi tôi thực hiện kiểm tra hiệu suất, tôi thường có bộ kiểm tra đầu vào dữ liệu và đo thời gian chương trình xử lý từng dữ liệu.

Bạn có thể đăng nhập hiệu suất hàng ngày hoặc hàng tuần, nhưng tôi không thấy nó đặc biệt hữu ích khi lo lắng về hiệu suất cho đến khi tất cả chức năng được triển khai.

Nếu hiệu suất quá kém, sau đó tôi thoát ra khỏi cProfile, chạy nó với cùng dữ liệu đầu vào và cố gắng xem vị trí nút cổ chai.

5

Mặc dù tôi đồng ý rằng hiệu suất thử nghiệm ở cấp hệ thống cuối cùng có liên quan hơn, nếu bạn muốn thực hiện kiểm tra tải kiểu UnitTest cho Python, thì FunkLoad http://funkload.nuxeo.org/ thực hiện chính xác điều đó.

Điểm chuẩn vi mô có vị trí của chúng khi bạn đang cố gắng tăng tốc một hành động cụ thể trong cơ sở mã của mình. Và việc thực hiện các bài kiểm tra đơn vị hiệu suất tiếp theo được thực hiện là một cách hữu ích để đảm bảo rằng hành động này mà bạn vừa tối ưu hóa không vô tình quay trở lại hiệu suất khi các cam kết trong tương lai.

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