TDD / Kiểm tra quá nhiều gánh nặng chi phí / bảo trì?


24

Vì vậy, bạn đã nghe nó nhiều lần từ những người không thực sự hiểu các giá trị của thử nghiệm. Chỉ cần bắt đầu mọi thứ, tôi là người theo dõi Agile và Thử nghiệm ...

Gần đây tôi đã có một cuộc thảo luận về việc thực hiện TDD trên một sản phẩm viết lại trong đó nhóm hiện tại không thực hành thử nghiệm đơn vị ở bất kỳ cấp độ nào và có lẽ chưa bao giờ nghe về kỹ thuật tiêm phụ thuộc hoặc mẫu / thiết kế thử nghiệm, v.v. (chúng tôi thậm chí sẽ không nhận được vào để làm sạch mã).

Bây giờ, tôi hoàn toàn chịu trách nhiệm viết lại sản phẩm này và tôi được bảo rằng việc thử nó theo kiểu TDD, sẽ chỉ khiến nó trở thành cơn ác mộng bảo trì và không thể duy trì cho đội. Hơn nữa, vì đây là một ứng dụng ngoại vi (không dựa trên web), việc thêm các bài kiểm tra là vô nghĩa, vì ổ đĩa kinh doanh thay đổi (theo những thay đổi có nghĩa là cải tiến tất nhiên), các thử nghiệm sẽ trở nên lỗi thời, các nhà phát triển khác đã đến dự án trong tương lai sẽ không duy trì chúng và trở thành gánh nặng cho họ sửa chữa, v.v.

Tôi có thể hiểu rằng TDD trong một nhóm hiện không có bất kỳ trải nghiệm thử nghiệm nào nghe có vẻ không tốt, nhưng lập luận của tôi trong trường hợp này là tôi có thể dạy thực hành cho những người xung quanh, nhưng hơn nữa, tôi biết rằng TDD tạo ra TỐT HƠN phần mềm. Ngay cả khi tôi sản xuất phần mềm bằng TDD và vứt bỏ tất cả các bài kiểm tra khi giao nó cho một nhóm bảo trì, chắc chắn đó sẽ là một cách tiếp cận tốt hơn so với việc không sử dụng TDD ngay từ đầu?

Tôi đã bị bắn hạ vì tôi đã đề cập đến việc thực hiện TDD trên hầu hết các dự án cho một nhóm chưa bao giờ nghe nói về nó. Ý nghĩ về "giao diện" và các nhà xây dựng DI trông lạ lùng làm họ sợ ...

Ai đó có thể vui lòng giúp tôi trong một cuộc trò chuyện rất ngắn về việc cố gắng bán TDD và cách tiếp cận của tôi với mọi người không? Tôi thường có một cửa sổ tranh luận rất ngắn trước khi quỳ xuống trước công ty / nhóm.


3
CHẠY! FLEE! Bất cứ ai không thể hiểu tại sao các bài kiểm tra tự động sẽ giúp cuộc sống của họ dễ dàng hơn trong thời gian dài cần phải loại bỏ đầu của họ khỏi nơi bạn biết.
MattC

6
@MattC TDD! = Kiểm tra tự động
Nemanja Trifunovic

@Nemanja Trifunovic: Uhh ... ai thực hành TDD bằng các bài kiểm tra thủ công? "Tôi đã khởi động ứng dụng nhưng không có nút nào để nhấp vào!?" "Yea, đó là màu đỏ trong màu đỏ, màu xanh lá cây, tái cấu trúc!"
Steven Evers

2
@SnOrfus: Có các bài kiểm tra tự động mà không cần TDD. Một số ví dụ: kiểm tra tích hợp tự động, kiểm tra hồi quy, kiểm tra căng thẳng.
Nemanja Trifunovic

2
@Martin, tôi sẽ quan tâm đến một bình luận tiếp theo (hoặc bài đăng trên blog) thảo luận về những gì bạn đã làm và làm thế nào (hoặc không) nó hoạt động tốt cho bạn trong thời gian dài.
StevenV

Câu trả lời:


36

cố gắng theo cách của TDD, sẽ chỉ khiến nó trở thành cơn ác mộng bảo trì và không thể duy trì cho đội.

Bạn không thể thắng được cuộc tranh luận đó. Họ đang làm điều này lên. Đáng buồn thay, bạn cũng không có sự thật. Bất kỳ ví dụ bạn cung cấp có thể bị tranh chấp.

Cách duy nhất để thực hiện điểm này là có mã có chi phí thấp hơn để duy trì.

Hơn nữa, vì đây là một ứng dụng ngoại vi (không dựa trên web), việc thêm các bài kiểm tra là vô nghĩa,

Mọi người đều nói điều này. Nó cũng có thể đúng một phần. Nếu ứng dụng được thiết kế hợp lý, front-end sẽ làm rất ít.

Tuy nhiên, nếu ứng dụng được thiết kế kém, thì front-end làm quá nhiều và khó kiểm tra. Đây là một vấn đề thiết kế, không phải là một vấn đề thử nghiệm.

khi động lực kinh doanh thay đổi (tất nhiên là do cải tiến), các thử nghiệm sẽ trở nên lỗi thời, các nhà phát triển khác đến dự án trong tương lai sẽ không duy trì chúng và trở thành gánh nặng cho họ để khắc phục, v.v.

Đây là lập luận tương tự như trên.


Bạn không thể thắng được cuộc tranh luận. Vì vậy, đừng tranh luận.

"Tôi hoàn toàn chịu trách nhiệm cho việc viết lại sản phẩm này"

Trong trường hợp đó,

  1. Thêm bài kiểm tra nào. Nhưng thêm các bài kiểm tra khi bạn đi, tăng dần. Đừng mất nhiều thời gian để làm bài kiểm tra viết trước. Chuyển đổi một chút. Kiểm tra một chút. Chuyển đổi thêm một chút. Kiểm tra thêm một chút.

  2. Sử dụng các thử nghiệm đó cho đến khi ai đó nhận ra rằng thử nghiệm đang hoạt động và hỏi tại sao mọi thứ lại diễn ra tốt đẹp như vậy.

Tôi đã có cùng một lập luận về việc viết lại (từ C ++ sang Java) và tôi chỉ đơn giản sử dụng các bài kiểm tra mặc dù họ bảo tôi không làm.

Tôi đã phát triển rất nhanh. Tôi yêu cầu các ví dụ cụ thể về kết quả chính xác, mà họ đã gửi trong bảng tính. Tôi đã biến các bảng tính thành unittest.TestCase (mà không nói với họ) và sử dụng chúng để kiểm tra.

Khi đang trong thử nghiệm chấp nhận của người dùng - và đã tìm thấy lỗi - tôi chỉ yêu cầu các bảng tính với các ví dụ được xem xét, sửa chữa và mở rộng để bao quát các vấn đề được tìm thấy trong quá trình kiểm tra chấp nhận. Tôi đã biến các bảng tính đã sửa thành unittest.TestCase (không nói với họ) và sử dụng các bảng tính này để kiểm tra.

Không ai cần biết chi tiết tại sao bạn thành công.

Chỉ cần thành công.


Phản ứng rất truyền cảm có S.Lott :). Thật khó khăn khi tôi được một kiến ​​trúc sư của công ty nói rằng tôi sẽ "tạo ra chi phí không cần thiết". Tôi không thể được nhìn thấy đang trì hoãn dự án với bất kỳ ẩn số nào đối với họ, rằng cuối cùng nếu dự án đến muộn, họ có thể chỉ cần chỉ tay vào thử nghiệm mà tôi thực hiện và kết thúc hợp đồng. Như bạn nói, lén lút theo dõi chúng sau này giúp nó có lẽ là cách đúng đắn. Bạn hoàn toàn đúng từ quan điểm tranh luận, tôi không có căn cứ và họ cũng không.
Martin Blore

Tại sao front-end không có quá nhiều vấn đề thiết kế? Ngày nay, nhiều công nghệ như AJAX đã làm được nhiều thứ ở phía trước.
声 远 Shengyuan Lu

@ 卢 声 远 Shengyuan Lu: Thật khó để kiểm tra GUI "nhìn". Bạn có thể kiểm tra phông chữ và màu sắc. Tuy nhiên, các yêu cầu của trình duyệt khiến việc kiểm tra vị trí và kích thước chính xác bằng kiểm tra tự động rất khó khăn.
S.Lott

@Martin Blore: "họ cũng không." Đúng. Bất cứ ai nói rằng thử nghiệm bằng cách nào đó sẽ thêm rủi ro một cách kỳ diệu là điên rồ. Dù sao thì bạn cũng phải kiểm tra - không thể hiểu được. Bạn có thể kiểm tra tốt (sử dụng TDD) hoặc bạn có thể kiểm tra kém và không phù hợp. Lập kế hoạch cho thử nghiệm nghèo, haphazard có vẻ nguy hiểm hơn đối với tôi. Nhưng không có cuộc thảo luận cơ bản nào cho đến khi "những người nói nay" có kinh nghiệm thực tiễn.
S.Lott

5

Bạn chỉ có thể thuyết phục những người như vậy (nếu có) từ quan điểm thực tế, chứng minh giá trị của TDD trong cuộc sống thực. Ví dụ: lấy một số lỗi gần đây làm ví dụ và chỉ ra cách xây dựng một bài kiểm tra đơn vị để đảm bảo 100% rằng lỗi này có thể không bao giờ xuất hiện nữa. Và sau đó tất nhiên viết thêm một tá bài kiểm tra đơn vị để ngăn chặn cả lớp lỗi tương tự xuất hiện (và ai biết được, có thể trên đường thậm chí còn phát hiện thêm một vài lỗi không hoạt động trong mã).

Nếu điều này không hoạt động trong thời gian ngắn, bạn cần phải làm việc này lâu hơn, chỉ đơn giản bằng cách thực hiện TDD và viết các bài kiểm tra đơn vị siêng năng về các nhiệm vụ của riêng bạn. Sau đó tổng hợp một số thống kê đơn giản sau nửa năm hoặc lâu hơn (nếu có thể trong môi trường của bạn) để so sánh tỷ lệ lỗi trong mã / nhiệm vụ được thực hiện bởi các nhà phát triển khác nhau (anonimyened để tránh xa lánh đồng đội của bạn). Nếu bạn có thể chỉ ra rằng có ít lỗi đáng kể được tìm thấy trong mã của bạn hơn so với các mã khác, thì bạn có thể có một điểm mạnh để bán cho cả nhà quản lý và nhà phát triển đồng nghiệp.


Đó là một ý tưởng tuyệt vời Peter, cảm ơn vì điều đó. Dự án hiện tại của tôi có một nhóm thử nghiệm vì vậy tôi chắc chắn sẽ rất dễ dàng để nắm bắt các lỗi được tìm thấy trong các bản phát hành quan trọng, v.v.
Martin Blore

3

Bạn phải thực tế về những điều này, TDD là một điều tốt đẹp về lý thuyết, nhưng trừ khi bạn đang cập nhật các bài kiểm tra của mình cho mọi thứ được thêm vào, có một điểm nhỏ trong đó - không ai muốn chạy một bài kiểm tra báo cáo bị hỏng mã khi thử nghiệm đó không được cập nhật! Kết quả là, có thể dễ dàng quá tốn kém để thực hiện chúng - bạn sẽ không phải là nhà phát triển duy nhất làm việc với mã đó.

Khách hàng có một nhóm thử nghiệm .. tốt, không có vấn đề gì trong việc chuyển gánh nặng thử nghiệm từ nhà phát triển sang người thử nghiệm - đó là những gì họ đang ở đó và nếu họ tìm thấy lỗi thông qua các thử nghiệm của họ (có thể họ có rất nhiều công cụ kiểm tra tự động) sau đó có rất ít điểm để viết bài kiểm tra đơn vị ở cấp độ của bạn. Sẽ mất nhiều thời gian hơn để tìm ra các lỗi, nhưng họ sẽ tìm thấy các lỗi "tích hợp" phiền phức mà các bài kiểm tra của bạn sẽ không thực hiện được.

Có thể đây là lý do tại sao họ không quan tâm đến thử nghiệm đơn vị.

Cuối cùng, TDD là một điều mới, khi tôi còn là một chàng trai, chúng tôi chưa bao giờ thử nghiệm và chúng tôi đã viết mã hoạt động. Kiểm thử đơn vị làm cho một số người cảm thấy ấm áp và mờ, nhưng nó hoàn toàn không phải là một yêu cầu cho mã chính xác.

Tái bút Tôi thấy một câu hỏi khác của bạn khi bạn chỉ trích các lớp trừu tượng, và ở đây bạn chỉ trích việc thiếu các hàm tạo DI! Làm cho tâm trí của bạn lên :)


2

Vì mọi thứ thay đổi quá nhanh khi bạn đặt nó, hãy giải thích cho họ rằng nó sẽ được sử dụng cho Kiểm tra hồi quy. Điều này sẽ giúp tiết kiệm rất nhiều vấn đề đau đầu khi các lỗi mới được đưa ra do ai đó đã phá vỡ một dòng mã được viết cách đây 10 năm để giải quyết vấn đề xảy ra 1 trên 10.000.000 lần thực thi một chức năng cụ thể chỉ được gọi nếu đồng hồ hệ thống bật máy khách chênh lệch lớn hơn 3 phút so với đồng hồ hệ thống máy chủ. Chỉ cần hỏi họ có bao nhiêu khách hàng họ có thể đủ khả năng để mất vì phần mềm lỗi.


2

Chỉ ra rằng việc tìm ra lỗi trong quá trình phát triển có chi phí X, trong quá trình thử nghiệm 10X và sau khi triển khai 100X. Xem liệu họ ít nhất sẽ cho phép bạn tiến hành thử nghiệm thí điểm khi bạn triển khai TDD trong một mô-đun cụ thể, sau đó theo dõi so sánh với các mô-đun khác khi chúng được phát triển, thử nghiệm, triển khai và hỗ trợ. Được cung cấp dữ liệu đầy đủ, bạn sẽ có thể chứng minh mức độ sử dụng ít hơn để tạo mã trong mô-đun TDD. Chúc may mắn.


2

Vâng, duy trì các bài kiểm tra là một gánh nặng. Cập nhật chúng, cập nhật dữ liệu thử nghiệm của bạn: tất cả điều này làm mất thời gian của bạn.

Cách khác - kiểm tra thủ công mọi thứ, trộn lại các lỗi đã thoái lui, không thể nói trong vài giây rằng mã của bạn hoạt động - chi phí cao hơn nhiều.


2
Tôi nghĩ rằng đây là một trong những điểm quan trọng nhất đối với những người nói nay, những người tuyên bố TDD là một sự lãng phí thời gian và chi phí không cần thiết. Không phải là TDD không tốn thời gian. Đó là thực tế rằng đó là một khoản đầu tư ngăn chặn chi phí trong tương lai là các đơn đặt hàng lớn hơn
sara

2

Kiểm tra tốt là gánh nặng nhưng nó là gánh nặng tốt để thực hiện. Tốt hơn là thực hiện một số công việc trả trước sẽ giúp tiết kiệm thời gian tốt khi có một số vấn đề sản xuất hoặc trong quá trình di chuyển. Tôi sẽ luôn muốn có bài kiểm tra mặc dù đó là một chút gánh nặng nhưng tôi muốn mang gánh nặng đó.

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.