Một yếu tố quan trọng làm cho các bài kiểm tra đơn vị cực kỳ hữu ích là phản hồi nhanh .
Xem xét những gì xảy ra khi ứng dụng của bạn được bảo vệ đầy đủ với các bài kiểm tra tích hợp / Hệ thống / chức năng (vốn đã là một tình huống lý tưởng, khác xa với thực tế ở hầu hết các cửa hàng phát triển). Chúng thường được điều hành bởi một nhóm thử nghiệm chuyên dụng.
- Bạn cam kết thay đổi repo SCM,
- đôi khi (có thể vài ngày) sau đó, những người thử nghiệm có được một bản phát hành nội bộ mới và bắt đầu thử nghiệm nó,
- họ tìm thấy một lỗi và nộp báo cáo lỗi,
- (trong trường hợp lý tưởng) ai đó gán lại báo cáo lỗi cho bạn.
Tất cả điều này có thể mất vài ngày hoặc thậm chí vài tuần. Vào thời điểm này, bạn đã thực hiện các nhiệm vụ khác, vì vậy bạn không có chi tiết nhỏ về mã được viết trước đó trong tâm trí. Hơn nữa, bạn thường không có bất kỳ bằng chứng trực tiếp nào về lỗi thực sự ở đâu, vì vậy cần có thời gian đáng kể để tìm và sửa lỗi.
Trong khi đó trong thử nghiệm đơn vị (TDD)
- bạn viết một bài kiểm tra,
- bạn viết một số mã để đáp ứng bài kiểm tra,
- bài kiểm tra vẫn thất bại
- bạn nhìn vào mã và thông thường bạn có trải nghiệm "oops" trong vài giây (như "oops, tôi quên kiểm tra tình trạng đó!"), sau đó
- sửa lỗi ngay lập tức.
Tất cả điều này xảy ra trong vài phút .
Điều này không có nghĩa là các bài kiểm tra tích hợp / hệ thống không hữu ích; họ chỉ phục vụ các mục đích khác nhau. Với các bài kiểm tra đơn vị được viết tốt, bạn có thể bắt được một tỷ lệ lớn các lỗi trong mã trước khi chúng đến giai đoạn tích hợp, nơi nó đã tốn kém hơn đáng kể để tìm và sửa chúng. Bạn đúng rằng các bài kiểm tra tích hợp là cần thiết để bắt những loại lỗi khó hoặc không thể bắt được bằng các bài kiểm tra đơn vị. Tuy nhiên, theo kinh nghiệm của tôi thì đó là những loại hiếm hơn; hầu hết các lỗi tôi đã thấy là do một số thiếu sót đơn giản hoặc thậm chí tầm thường ở đâu đó bên trong một phương thức.
Chưa kể rằng kiểm thử đơn vị cũng kiểm tra các giao diện của bạn về tính khả dụng / an toàn, v.v., do đó cung cấp cho bạn phản hồi cực kỳ quan trọng để cải thiện thiết kế và API của bạn. IMHO nào có thể làm giảm đáng kể khả năng xảy ra lỗi tích hợp mô-đun / hệ thống susbs: API càng dễ dàng và sạch sẽ thì càng ít có khả năng hiểu nhầm hoặc bỏ sót.
Bạn có kinh nghiệm gì với thử nghiệm đơn vị tự động, thử nghiệm tích hợp tự động và thử nghiệm chấp nhận tự động và theo kinh nghiệm của bạn, điều gì đã mang lại ROI cao nhất? và tại sao?
ROI phụ thuộc vào rất nhiều yếu tố, có lẽ điều quan trọng nhất trong số đó là liệu dự án của bạn là lĩnh vực xanh hay di sản. Với sự phát triển của Greenfield, lời khuyên của tôi (và kinh nghiệm cho đến nay) là thực hiện thử nghiệm đơn vị theo kiểu TDD ngay từ đầu. Tôi tự tin rằng đây là phương pháp hiệu quả nhất trong trường hợp này.
Tuy nhiên, trong một dự án cũ, xây dựng phạm vi kiểm tra đơn vị đủ là một công việc khổng lồ sẽ rất chậm để mang lại lợi ích. Sẽ hiệu quả hơn khi cố gắng bao gồm các chức năng quan trọng nhất bằng các kiểm tra hệ thống / chức năng thông qua UI nếu có thể. (các ứng dụng GUI trên máy tính để bàn có thể khó kiểm tra tự động thông qua GUI, mặc dù các công cụ hỗ trợ kiểm tra tự động đang dần cải thiện ...). Điều này cung cấp cho bạn một mạng lưới an toàn thô nhưng hiệu quả nhanh chóng. Sau đó, bạn có thể bắt đầu dần dần xây dựng các bài kiểm tra đơn vị xung quanh các phần quan trọng nhất của ứng dụng.
Nếu bạn phải chọn chỉ một hình thức thử nghiệm để tự động hóa trong dự án tiếp theo của bạn, thì đó sẽ là gì?
Đó là một câu hỏi lý thuyết và tôi thấy nó vô nghĩa. Tất cả các loại thử nghiệm đều được sử dụng trong hộp công cụ của một kỹ sư SW giỏi và tất cả các thử nghiệm này đều có các tình huống không thể thay thế.