Trả lời cho những câu hỏi của bạn
Có một điều như là có quá nhiều bài kiểm tra đơn vị?
Chắc chắn ... Chẳng hạn, bạn có thể có nhiều thử nghiệm thoạt nhìn có vẻ khác nhau nhưng thực sự thử nghiệm cùng một thứ (về mặt logic phụ thuộc vào cùng một dòng mã ứng dụng "thú vị" đang thử nghiệm).
Hoặc bạn có thể kiểm tra phần bên trong mã của mình không bao giờ lộ ra ngoài (nghĩa là không phải là một phần của bất kỳ loại hợp đồng giao diện nào), nơi người ta có thể tranh luận về việc liệu điều đó có hợp lý hay không. Ví dụ, từ ngữ chính xác của thông điệp tường trình nội bộ hoặc bất cứ điều gì.
Tôi đã được giao nhiệm vụ viết bài kiểm tra đơn vị cho một ứng dụng hiện có. Sau khi hoàn thành tệp đầu tiên của tôi, tôi có 717 dòng mã kiểm tra cho 419 dòng mã gốc.
Điều đó đánh tôi là khá bình thường. Các thử nghiệm của bạn dành rất nhiều dòng mã cho thiết lập và phân tích trên đầu các thử nghiệm thực tế. Tỷ lệ có thể cải thiện, hoặc có thể không. Bản thân tôi khá nặng kiểm tra, và thường đầu tư nhiều địa điểm và thời gian vào các bài kiểm tra hơn mã thực tế.
Là tỷ lệ này sẽ trở nên không thể quản lý khi chúng tôi tăng phạm vi bảo hiểm mã của chúng tôi?
Tỷ lệ không có yếu tố rất nhiều. Có những phẩm chất khác của các bài kiểm tra có xu hướng làm cho chúng không thể quản lý được. Nếu bạn thường xuyên phải cấu trúc lại một loạt các bài kiểm tra khi thực hiện các thay đổi khá đơn giản trong mã của mình, bạn nên xem xét kỹ các lý do. Và đó không phải là bạn có bao nhiêu dòng, mà là cách bạn tiếp cận mã hóa các bài kiểm tra.
Sự hiểu biết của tôi về kiểm thử đơn vị là kiểm tra từng phương thức trong lớp để đảm bảo rằng mọi phương thức đều hoạt động như mong đợi.
Điều đó đúng với các bài kiểm tra "đơn vị" theo nghĩa chặt chẽ. Ở đây, "đơn vị" là một cái gì đó giống như một phương thức hoặc một lớp. Điểm kiểm thử "đơn vị" là chỉ kiểm tra một đơn vị mã cụ thể, không phải toàn bộ hệ thống. Lý tưởng nhất là bạn sẽ loại bỏ toàn bộ phần còn lại của hệ thống (sử dụng gấp đôi hoặc không có gì).
Tuy nhiên, trong yêu cầu kéo, lãnh đạo công nghệ của tôi lưu ý rằng tôi nên tập trung vào thử nghiệm cấp cao hơn.
Sau đó, bạn rơi vào cái bẫy giả định rằng mọi người thực sự có nghĩa là kiểm tra đơn vị khi họ nói kiểm tra đơn vị. Tôi đã gặp nhiều lập trình viên nói "kiểm thử đơn vị" nhưng có nghĩa là một cái gì đó khá khác biệt.
Ông đề nghị thử nghiệm 4-5 trường hợp sử dụng thường được sử dụng nhất với lớp đang đề cập, thay vì kiểm tra toàn diện từng chức năng.
Chắc chắn, chỉ tập trung vào 80% mã quan trọng hàng đầu cũng giảm tải ... Tôi đánh giá cao việc bạn nghĩ rất cao về ông chủ của mình, nhưng điều này không đánh tôi là sự lựa chọn tối ưu.
Đối với tôi, phạm vi kiểm tra đơn vị 100% là một mục tiêu cao cả, nhưng ngay cả khi chúng tôi chỉ đạt 50%, chúng tôi sẽ biết rằng 100% trong số 50% đó được bảo hiểm.
Tôi không biết "phạm vi kiểm tra đơn vị" là gì. Tôi giả sử bạn có nghĩa là "phạm vi bảo hiểm mã", tức là sau khi chạy bộ kiểm tra, mọi dòng mã (= 100%) đã được thực thi ít nhất một lần.
Đây là một số liệu sân bóng đẹp, nhưng cho đến nay không phải là tiêu chuẩn tốt nhất người ta có thể bắn. Chỉ thực hiện các dòng mã không phải là toàn bộ hình ảnh; ví dụ, điều này không giải thích cho các đường dẫn khác nhau thông qua các nhánh phức tạp, lồng nhau. Đó là nhiều hơn một số liệu chỉ ngón tay của mình vào các đoạn mã được kiểm tra quá ít (rõ ràng, nếu một lớp có độ bao phủ mã 10% hoặc 5%, thì có gì đó không đúng); mặt khác, phạm vi bảo hiểm 100% sẽ không cho bạn biết bạn đã kiểm tra đủ chưa hay bạn đã kiểm tra đúng chưa.
Thử nghiệm hội nhập
Nó làm tôi khó chịu đáng kể khi mọi người liên tục nói về thử nghiệm đơn vị ngày hôm nay, theo mặc định. Theo tôi (và kinh nghiệm), kiểm thử đơn vị là tuyệt vời cho các thư viện / API; trong các lĩnh vực định hướng kinh doanh nhiều hơn (nơi chúng ta nói về các trường hợp sử dụng như trong câu hỏi), chúng không nhất thiết là lựa chọn tốt nhất.
Đối với mã ứng dụng chung và trong doanh nghiệp trung bình (nơi kiếm tiền, đạt thời hạn và đáp ứng sự hài lòng của khách hàng là điều quan trọng và bạn chủ yếu muốn tránh các lỗi trực tiếp trên mặt người dùng hoặc có thể dẫn đến thảm họa thực sự - chúng tôi không nói NASA phóng tên lửa ở đây), tích hợp hoặc tính năng kiểm tra là nhiều hơn hữu ích.
Những người đi đôi với Phát triển hướng hành vi hoặc Phát triển theo hướng tính năng; những người không làm việc với các bài kiểm tra đơn vị (nghiêm ngặt), theo định nghĩa.
Để giữ cho nó ngắn (ish), một bài kiểm tra tích hợp / tính năng thực hiện toàn bộ ngăn xếp ứng dụng. Trong một ứng dụng dựa trên web, nó sẽ hoạt động giống như một trình duyệt nhấp qua ứng dụng (và không, rõ ràng không cần phải đơn giản như vậy, có những khung rất mạnh để thực hiện điều đó - hãy xem http: // dưa chuột. io cho một ví dụ).
Ồ, để trả lời các câu hỏi cuối cùng của bạn: bạn khiến cả nhóm của bạn có phạm vi kiểm tra cao bằng cách đảm bảo rằng một tính năng mới chỉ được lập trình sau khi thử nghiệm tính năng của nó đã được triển khai và thất bại. Và vâng, điều đó có nghĩa là mọi tính năng. Điều này đảm bảo cho bạn phạm vi bảo hiểm 100% (tích cực). Theo định nghĩa, nó đảm bảo rằng một tính năng của ứng dụng của bạn sẽ không bao giờ "biến mất". Nó không đảm bảo phạm vi bảo hiểm 100% mã (ví dụ: trừ khi bạn chủ động lập trình các tính năng tiêu cực, bạn sẽ không thực hiện xử lý lỗi / xử lý ngoại lệ).
Nó không đảm bảo cho bạn một ứng dụng không có lỗi; tất nhiên bạn sẽ muốn viết các bài kiểm tra tính năng cho các tình huống lỗi rõ ràng hoặc rất nguy hiểm, nhập sai người dùng, hack (ví dụ: quản lý phiên xung quanh, bảo mật và như vậy), v.v .; nhưng ngay cả chỉ lập trình các bài kiểm tra tích cực cũng mang lại lợi ích to lớn và hoàn toàn khả thi với các khung hiện đại, mạnh mẽ.
Các thử nghiệm tính năng / tích hợp rõ ràng có các con giun riêng (ví dụ: hiệu năng; thử nghiệm dự phòng khung bên thứ 3; vì bạn thường không sử dụng gấp đôi nên chúng cũng có xu hướng khó viết hơn, theo kinh nghiệm của tôi ...), nhưng tôi d dùng ứng dụng được kiểm tra tính năng tích cực 100% so với ứng dụng được kiểm tra đơn vị 100% mã (không phải thư viện!) mỗi ngày.