bạn dành bao nhiêu thời gian cho bài kiểm tra đơn vị?


27

Trong một công ty tôi từng làm việc cho, các giám đốc điều hành nhấn mạnh rằng phạm vi bảo hiểm mã với các bài kiểm tra đơn vị phải từ 99% trở lên. Điều này dẫn đến việc viết nhiều bài kiểm tra hơn mã. Chúng tôi mất 3 ngày để viết bài kiểm tra cho một lớp duy nhất mất một ngày để thực hiện.

Kết quả là, tuy nhiên, tôi đã học được rất nhiều về TDD, các công cụ kiểm tra, thực hành, v.v.

Trong công ty tôi làm việc sau đó, thử nghiệm đơn vị là một điều chưa biết. Đó là điều mà ai đó có thể nghe thấy trước đây. Tôi đấu tranh để giới thiệu cho họ khái niệm về thử nghiệm đơn vị, nhưng không có hiệu quả.

Bây giờ, là một người tự làm chủ, tôi tự hỏi - bao nhiêu thời gian thực sự cần thiết để thử nghiệm đơn vị? Chủ yếu là nhà phát triển iPhone / Android, phần nào của mã cần được đề cập trong các thử nghiệm?


Trong công ty trước đây của tôi, đó là Java EE, khung sọc và thanh chống. Như tôi đã nói, bây giờ chủ yếu là phát triển iPhone và Android.
Maggie

TDD có nghĩa là bạn viết các bài kiểm tra trước mã. Có vẻ như đây là thử nghiệm "sau thực tế", đó là một cái gì đó khác.

Các nhà quản lý không quan tâm đến kỹ thuật này, trưởng nhóm của tôi đã nhấn mạnh vào TDD. nó đã kết thúc như một sự kết hợp của cả hai :)
Maggie

Maggie, bạn có thể thấy bài viết này thú vị: fastcompany.com/magazine/06/writestuff.html

Có một số metrcis để ước tính thời gian? Các công cụ cho mã JS / .NET?
hellboy

Câu trả lời:


16

Số lượng thử nghiệm đơn vị cần thiết phụ thuộc vào một số yếu tố:

  • Kích thước sản phẩm (Dự án càng lớn, nhu cầu bao gồm ít nhất một số thử nghiệm đơn vị)
  • Mức chất lượng bắt buộc (Nếu bạn nhanh chóng kết hợp các phần mềm cần nhanh nhất có thể và một số lỗi nhỏ có thể chấp nhận được, thì bạn có thể buộc phải bỏ qua một số thử nghiệm như kiểm tra đơn vị)
  • Loại sản phẩm (UI có thể được kiểm tra đơn vị, nhưng đôi khi dễ dàng bỏ qua kiểm tra đơn vị trên các phần GUI nặng của dự án và thay vào đó kiểm tra thủ công)
  • Khả năng / Lịch sử mã hóa của bạn (Bạn thường tạo ra loại lỗi nào? Chúng có phải là những thứ mà Kiểm thử đơn vị thường nắm bắt hoặc những thứ mà loại kiểm thử khác thường thấy. Biết điều này có thể thúc đẩy bạn thực hiện kiểm tra đơn vị nhiều hơn hoặc ít hơn)

10

Trong nhóm sản phẩm của chúng tôi, chúng tôi nhắm mục tiêu bảo hiểm mã 50-70% từ các thử nghiệm đơn vị và 90% + bảo hiểm từ các thử nghiệm đơn vị và tự động hóa thử nghiệm kết hợp. Thời gian thông thường được ngân sách cho các bài kiểm tra đơn vị viết là khoảng 1 ngày cho mỗi tính năng mất 3-4 ngày để mã hóa. Nhưng điều đó có thể thay đổi với rất nhiều yếu tố.

Bảo hiểm mã 99% là tuyệt vời. Bài kiểm tra đơn vị là tuyệt vời. Nhưng bảo hiểm mã 99% chỉ từ thử nghiệm đơn vị? Tôi thấy rằng thật khó để tin rằng bạn có thể nhận được nhiều bảo hiểm như vậy chỉ từ thử nghiệm đơn vị .

Đối với trường hợp bạn đã dành 3 ngày để viết bài kiểm tra cho một lớp mà nếu không thì mất 1 ngày để thực hiện. Bạn đã không giải thích lý do tại sao phải mất nhiều thời gian này hoặc chia sẻ bất kỳ mã nào. Từ suy đoán, tôi đoán bạn không thực sự viết một bài kiểm tra đơn vị thực sự cho lớp của bạn, nhưng thực ra là viết tự động kiểm tra . Và thực tế không có gì sai với điều đó - miễn là bạn nhận ra sự khác biệt giữa hai loại thử nghiệm khác nhau.

Nhưng bạn nói rằng ba ngày viết bài kiểm tra chỉ dành cho một lớp duy nhất. Có lẽ bản thân lớp học không được thiết kế để thử nghiệm đơn vị. Lớp có thực hiện UI không? Mạng? Tập tin I / O? Nếu vậy, có thể bạn đã kết thúc việc viết nhiều mã hơn để kiểm tra thời gian chạy Java hơn là logic nghiệp vụ của bạn tương tác với thời gian chạy.

TDD giúp bạn suy nghĩ về các giao diện và giao diện cho các phụ thuộc. Lớp duy nhất thực hiện UI, mạng và tệp / io cho một tính năng có thể được phân chia tốt hơn thành nhiều lớp - một cho mạng, một cho tệp / io và UI được chia thành thiết kế trình điều khiển trình xem mô hình. Sau đó, bạn có thể thực hiện các thử nghiệm thích hợp cho từng đối tượng với các đối tượng giả đơn giản cho các phụ thuộc. Tất nhiên, tất cả điều này chiếm nhiều thời gian hơn. Vì vậy, thay vì 1 ngày để viết mã và 3 ngày để viết bài kiểm tra, kiểu thiết kế này có thể cần 3 ngày viết mã và 1 ngày viết bài kiểm tra. Nhưng mã sẽ được duy trì tốt hơn và có thể tái sử dụng.


1
Câu trả lời chính xác. Hầu hết nó quá phức tạp để thử nghiệm, bạn đã đúng về điều đó. Và để chia lớp thành nhiều đơn vị nhỏ hơn để phù hợp với các bài kiểm tra đơn vị tốt hơn có vẻ hơi quá mức. Tôi rất thích đính kèm mã cho lớp và các bài kiểm tra bao gồm, và tôi rất muốn nghe ý kiến ​​của bạn, nhưng tôi không chắc liệu tôi có được phép không. Mã này không hoàn toàn thuộc về tôi và tôi không còn làm việc cho công ty đó nữa, vì vậy tôi muốn tránh rắc rối.
Maggie

2
Đó là lý do tại sao bạn nên viết các bài kiểm tra đầu tiên. Sau đó, bạn có thể tìm thấy những nơi tự nhiên nơi logic gắn kết với nhau.

10

Kiểm tra đơn vị trả hết tại thời gian bảo trì. Nếu bạn có kế hoạch để có một ứng dụng sống lâu, bạn sẽ dành nhiều thời gian để duy trì hơn bạn nghĩ bây giờ (nếu bạn chưa thử điều này, bạn sẽ ngạc nhiên khi một dự án thành công có thể tồn tại bao lâu)

Những gì bạn muốn, là nếu bạn vô tình thay đổi chức năng, các bài kiểm tra của bạn bị hỏng để bạn tìm thấy những điều này càng nhanh càng tốt. Khách hàng không thích mạnh mẽ khi chức năng thay đổi bất ngờ.


3
Và bạn trông thật tệ khi sửa lỗi A chỉ để giới thiệu lỗi B & C.
JeffO

phụ thuộc vào việc B và C có bị bắt bởi các bài kiểm tra hay không

"Bạn sẽ dành nhiều thời gian hơn để duy trì hơn bạn nghĩ bây giờ" - thực sự, đặc biệt là xem xét rằng các sản phẩm SW thường tồn tại lâu hơn so với kế hoạch của chúng, thường là cho đến nay.
Péter Török

Bạn thực sự không thể "lên kế hoạch" để có một ứng dụng lâu dài vì bạn không thể biết trước liệu dự án sẽ thành công hay không. Bạn nên luôn luôn cân nhắc rằng khi lập ngân sách thời gian để thử nghiệm
Eran Galperin

1
@Eran, vậy bạn nên lập kế hoạch cho thất bại để bạn không phải dự trù ngân sách cho các bài kiểm tra?

4

Nếu bạn đang thực hiện TDD, bạn sẽ viết các bài kiểm tra cùng lúc với mã, chuyển đổi giữa chúng sau mỗi vài phút (hoặc ít hơn.) Sẽ không có bất kỳ thời gian riêng biệt nào dành cho các bài kiểm tra. Sử dụng TDD giúp dễ dàng hơn nhiều khi biết rằng bạn có phạm vi kiểm tra chắc chắn.

Nếu bạn đang kiểm tra Đơn vị sau khi thực tế, bạn cần phải viết các bài kiểm tra sẽ cho bạn biết nếu mã bị hỏng do thay đổi. Tôi sẽ không dựa vào số liệu bảo hiểm ở đây, nhưng sẽ dựa trên các trường hợp sử dụng và tham số cho các giao diện công cộng. Điều này cuối cùng sẽ được dựa trên hương vị và kinh nghiệm tốt của bạn.


Đúng, đối với tôi điều này là đúng (thực tế tôi thường xoay vòng giữa làm việc với các bài kiểm tra và làm việc với mã sản phẩm cứ sau vài giây chứ không phải vài phút.) Vì vậy, tôi có thể làm việc với các bài kiểm tra 100% thời gian.
Jonathan Hartley

2

Nếu bạn không dành thời gian cho các bài kiểm tra, bạn sẽ dành nhiều thời gian hơn để gỡ lỗi trong mã trực tiếp.
Vì vậy, dành nhiều thời gian cần thiết để kiểm tra, để bao gồm tất cả (hoặc 99% mã).


4
Tại sao mọi người có sự hoang tưởng như vậy của gỡ lỗi? Nếu bạn biết các công cụ, bạn hiếm khi gặp phải sự cố mất hơn 5 phút để gỡ lỗi. Các vấn đề khó gỡ lỗi chủ yếu liên quan đến luồng, nhưng dù sao thì các bài kiểm tra đơn vị cũng vô dụng.
Coder

3
@Coder, bởi vì mọi người có kinh nghiệm và biết rằng các bài kiểm tra là thứ hữu ích hơn nhiều so với gỡ lỗi mù.
OZ_

2
Phụ thuộc. Các bài kiểm tra đơn vị thường phản tác dụng và thêm cảm giác an toàn sai lầm. Và trong mã có cấu trúc tốt, bạn sẽ không gặp phải vấn đề "gỡ lỗi mù". Bạn nhận được một vấn đề, bạn biết nơi để tìm. Nếu bạn không, hãy thực hiện đánh giá mã / thiết kế hoàn chỉnh. Xem thêm: programmers.stackexchange.com/questions/86636/...
Coder

4
Đó là vấn đề với nhiều người đề xuất TDD, họ có lập trường thù địch chống gỡ lỗi và thiết kế, trong khi dựa vào các thử nghiệm để tìm ra tất cả các lỗi. Sau đó, trong mã sản xuất, các ứng dụng rò rỉ bộ nhớ, xử lý và sự cố trên nhiều lõi và chúng giống như? WTH?. TDD chỉ là một công cụ và tùy thuộc vào nhiệm vụ có thể rất hiệu quả hoặc rất phản tác dụng. Cố gắng viết bài kiểm tra đơn vị cho tất cả các trường hợp khó trong bài được liên kết và bạn sẽ không bao giờ gửi sản phẩm.
Coder

1
"Nếu bạn biết các công cụ, bạn hiếm khi gặp phải sự cố mất hơn 5 phút để gỡ lỗi." - @Coder Tôi tự hỏi loại ứng dụng bạn đang xem.
Kirk Broadhurst

2

Như những người khác đã lưu ý, nó phụ thuộc phần lớn vào loại phần mềm. Tỷ lệ thời gian thử nghiệm / phát triển 3: 1 mà bạn đề cập có thể hơi quá đối với các dự án trung bình, nhưng có thể hoàn toàn ổn đối với các ứng dụng quan trọng và thậm chí có thể quá ít cho một hệ thống quan trọng trong cuộc sống.

Phạm vi kiểm tra đơn vị 99 +% tương tự có thể là quá nhiều để mong đợi trong trường hợp một ứng dụng trung bình, nhưng quá ít cho một dự án quan trọng trong cuộc sống.

Theo kinh nghiệm của tôi, xem xét rằng một phần đáng kể của mã sản xuất là mã xử lý lỗi, phạm vi bảo hiểm 80-90% sẽ đủ cho hầu hết các ứng dụng và điều này có thể yêu cầu khoảng thời gian viết các bài kiểm tra đơn vị như mã sản xuất. (Sau đó, một lần nữa, nếu một người làm việc nghiêm túc trong thời trang TDD, cả hai hoàn toàn hòa quyện vào nhau để thực sự trở thành một nhiệm vụ duy nhất, vì vậy người ta chỉ có thể dự đoán tỷ lệ thực tế.)


Bạn có kinh nghiệm trong các ứng dụng di động? tỷ lệ kiểm tra / phát triển chấp nhận được cho một ứng dụng di động đơn giản là gì?
Maggie

@Maggie, tiếc là không. (Vì vậy, nếu tôi cần viết một bài, có lẽ tôi sẽ dành nhiều thời gian hơn bình thường để kiểm tra đơn vị :-)
Péter Török
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.