Tôi có nên viết bài kiểm tra khi tôi có thể chứng minh tính chính xác của mã không?


8

Mọi người nói rằng "nói về TDD hầu như không hoạt động, nếu bạn muốn thuyết phục ai đó về TDD, hãy cho họ thấy kết quả". Tuy nhiên, tôi đã nhận được kết quả tuyệt vời mà không cần TDD. Cho tôi thấy rằng những người sử dụng TDD có kết quả tốt sẽ không thuyết phục, tôi muốn thấy rằng những người viết cả TDD và không TDD đều có kết quả tốt hơn với TDD.

Bất chấp tất cả những điều này, tôi muốn thử TDD. Tuy nhiên tôi không tin rằng tôi sẽ đạt được bất cứ điều gì từ điều này. Nếu nó hữu ích, tôi sẽ cố gắng đẩy nó về phần còn lại của đội mình.

Câu hỏi chính của tôi là: TDD sẽ phục vụ bất kỳ mục đích nào cho mã, nếu tôi đã có thể chứng minh tính chính xác của mã?

Rõ ràng, không ai là viên đạn bạc. Bằng chứng của bạn có thể sai vì bạn đã bỏ lỡ một chi tiết và bài kiểm tra của bạn có thể không phát hiện ra lỗi mà bạn không kiểm tra được. Cuối cùng, chúng ta là con người, không ai có thể tạo mã miễn phí 100% mãi mãi. Chúng tôi chỉ có thể phấn đấu để đến gần nhất có thể.

Tuy nhiên, TDD có thực sự tiết kiệm bất kỳ thời gian nào đối với mã đã được chứng minh tính đúng đắn của nó không? tức là mã, trong máy trạng thái mà mã hoạt động, tất cả các trạng thái có thể hợp lệ và phạm vi của chúng được nhà phát triển nhận ra, tất cả đều được tính và mã được thiết kế theo kiểu kiểm tra lỗi theo danh sách trắng vượt qua mọi ngoại lệ một trình xử lý phía trên để đảm bảo không có bất kỳ rò rỉ bất ngờ nào -> mà không hiển thị cả thông báo có liên quan (trong lý do-) cho khách hàng và gửi thông báo nhật ký cho quản trị viên.

Câu trả lời với các ví dụ thực tế sẽ tốt hơn.


Một số làm rõ:

  • Câu hỏi này không phải là về việc bạn có thể chứng minh tính chính xác của mã hay không. Theo mặc định, giả sử rằng không phải tất cả các mã đều có thể được chứng minh là đúng trong khung thời gian hợp lý, nhưng một số đoạn mã có thể được. Ví dụ, rất dễ chứng minh tính đúng đắn của mô-đun FizzBuzz. Không dễ dàng cho một dịch vụ đồng bộ hóa dữ liệu dựa trên đám mây.

  • Trong giới hạn này, câu hỏi đặt ra như sau: Bắt đầu với giả định rằng một cơ sở mã được chia thành 2 phần: [I] các phần đã được chứng minh là đúng [II] các phần chưa được chứng minh là đúng, nhưng được kiểm tra thủ công để hoạt động.

  • Tôi muốn áp dụng các thực tiễn TDD cho cơ sở mã này mà không có chúng cho đến bây giờ. Câu hỏi đặt ra như sau: TDD có nên được áp dụng cho mọi mô-đun không, hoặc liệu có đủ để áp dụng chúng cho chỉ các mô-đun không được chứng minh là đúng?

  • "Đã được chứng minh chính xác" có nghĩa là bạn có thể xem mô-đun này hoàn toàn theo kiểu chức năng, nghĩa là nó không dựa vào bất kỳ trạng thái toàn cầu hoặc bên ngoài nào bên ngoài và hoàn toàn có API riêng cho I / O mà các mô-đun khác tương tác với nó phải tuân theo . Không thể "phá vỡ mô-đun này" bằng cách thay đổi mã bên ngoài mô-đun, tệ nhất là bạn có thể sử dụng sai và nhận các thông báo lỗi được định dạng trả lại cho bạn.

  • Rõ ràng, mọi quy tắc đều có ngoại lệ, lỗi trình biên dịch trong các phiên bản trình biên dịch mới có thể đưa ra lỗi cho mô-đun này, nhưng các lỗi tương tự có thể được đưa vào các thử nghiệm đã kiểm tra nó và dẫn đến cảm giác an toàn sai từ các thử nghiệm không còn hoạt động như dự định. Điểm mấu chốt là các thử nghiệm không phải là một giải pháp kỳ diệu, chúng là một lớp bảo vệ khác và câu hỏi này thảo luận về vấn đề liệu lớp bảo vệ này có xứng đáng với nỗ lực trong trường hợp cụ thể của một mô-đun đã được chứng minh là đúng hay không (giả sử rằng nó đã thực sự).


10
Chứng minh "tính chính xác của mã" có thể trở nên khó hơn mà bạn nghĩ là như vậy.
πά

34
Mặc dù tôi rất thích tìm hiểu về nơi làm việc và lịch sử công việc của bạn, tôi gần như đã ngừng đọc nhiều lần bởi vì, đôi khi điều thực sự quan trọng là, như một cách tối đa hóa kết quả của bạn, và, để giữ sự chú ý của người đọc để họ có thể, trong nỗ lực củng cố kiến ​​thức của bạn cũng như của cộng đồng, giúp bạn, bạn phải ... đi đến điểm chính . Vui lòng xem xét rút ngắn câu hỏi của bạn đến các điểm nổi bật nhất của nó.
MetaFight

10
Những gì bạn mô tả không phải là quá trình "chứng minh tính đúng đắn" của mã. Đó là loại quá trình khác nhau mạnh mẽ. Ngoài ra, tôi thấy khó chấp nhận rằng bạn có thể xây dựng mã theo cách có thể "được chứng minh là đúng" chỉ bằng cách nhìn vào nó. Tôi đã thấy rất nhiều mã có vẻ tầm thường và "chính xác", chỉ bị nghiền nát hoàn toàn khi được đưa vào thử nghiệm tự động mạnh mẽ.
Euphoric

8
"Hãy coi chừng các lỗi trong đoạn mã trên; tôi chỉ chứng minh nó đúng, không thử nó." -Donald Knuth.
Neil

6
Câu hỏi của bạn không có nghĩa. TDD có nghĩa là các bài kiểm tra thúc đẩy sự phát triển. Nói cách khác, bạn không có thiết kế, không có kiến ​​trúc, không có mã, trừ khi bạn có một bài kiểm tra cho nó. Vì vậy, làm thế nào trên thế giới bạn "áp dụng TDD cho mã đã được chứng minh là đúng" khi theo định nghĩa của TDD, không có mã nào để chứng minh đúng ?
Jörg W Mittag

Câu trả lời:


20

Đúng.

Bằng chứng là tốt khi chúng có sẵn, nhưng ngay cả ở thời điểm tốt nhất, chúng chỉ chứng minh rằng một bit mã sẽ hoạt động như mong đợi (đối với tất cả các đầu vào? Kế toán cho các gián đoạn ở giữa bất kỳ hoạt động nào? Điều gì về việc hết bộ nhớ ? Lỗi đĩa? lỗi mạng?).

Điều gì xảy ra khi nó thay đổi?

Các thử nghiệm là tuyệt vời vì chúng phục vụ như một hợp đồng ngụ ý về những gì mã nên làm. Họ cung cấp một số giàn giáo để thực tập sinh mới của bạn có thể đi vào và thực hiện các thay đổi với một mức độ tự tin. Tất cả thông qua kết quả nhanh chóng, rõ ràng: vượt qua hoặc thất bại.

Và thẳng thắn, tôi có thể huấn luyện một thực tập sinh để viết bài kiểm tra đơn vị khả thi trong một vài tháng. Tôi nghi ngờ rằng bất kỳ ai trong nhóm của tôi (bao gồm cả tôi) có thể tạo ra bằng chứng đảm bảo mọi thứ có ý nghĩa đối với mã không tầm thường; hãy để một mình làm điều đó một cách nhanh chóng và chính xác.


Mã tương tự sẽ không tầm thường để chứng minh cũng sẽ không tầm thường để kiểm tra. Lỗi mạng hoặc lỗi đĩa có thể có rất nhiều dạng, làm thế nào bạn có thể tự tin rằng các bài kiểm tra của bạn bao gồm mọi tình huống có thể xảy ra? Chúng rất có thể sẽ bao gồm mọi kịch bản duy nhất bạn có thể nghĩ ra, nhưng không nhất thiết là mọi kịch bản trong cuộc sống thực. Bạn không thể mù quáng cho rằng mọi thay đổi sẽ không phá vỡ chỉ vì bạn đã có các bài kiểm tra. Nó chỉ là một lớp bảo vệ khác. Các xét nghiệm rất quan trọng, nhưng chúng không phải là viên đạn bạc.
Kylee

6
@Kylee - không có ý xúc phạm, nhưng bạn dường như đang đánh giá thấp nỗ lực và kỹ năng cần thiết để làm bằng chứng về sự đúng đắn (hoặc đánh giá quá cao nỗ lực và kỹ năng cần thiết để vượt qua một số bài kiểm tra tự động).
Telastyn

Có lẽ bạn đã đúng, và rất có thể tôi đã đánh giá quá cao nỗ lực trong việc kết hợp các bài kiểm tra do thiếu kinh nghiệm với nó (thành thật mà nói, đó không phải là "kết hợp các bài kiểm tra" mà tôi quan tâm, và nhiều hơn về việc thực sự chạy các bài kiểm tra. Đối với các dự án lớn và thay đổi nhanh chóng, bản thân nó không phải là một khoảng thời gian không đáng kể). Dù bằng cách nào, điều này không liên quan gì đến câu hỏi. Câu hỏi nêu rõ, giả sử rằng bạn có mã đã được chứng minh là đúng, liệu vẫn còn một điểm để viết bài kiểm tra đơn vị cho nó?
Kylee

1
For large & rapidly changing projectsCác thử nghiệm càng dễ thay đổi thì càng cần thiết, vì một mã thay đổi có nhiều cơ hội thất bại hơn do các lỗi mới hoặc hành vi bất ngờ, hơn là mã hầu như không thay đổi. Đó là một vấn đề xác suất. Ngay cả khi nó không thay đổi thường xuyên, sau một thời gian, kiến ​​thức thu được trong quá trình phát triển có thể bị mất hoặc rơi vào quên lãng. Các bài kiểm tra cũng là kiến ​​thức cụ thể hóa, có thể cắt giảm, đáng kể, đường cong học tập. Là kiểm tra mã hóa tốn thời gian? Đúng. Liệu nó làm cho dự án đắt hơn? Không, về lâu dài làm cho nó rẻ hơn .
Laiv

3
@Kylee Ngay cả khi bạn có thể chứng minh rằng một đoạn mã là chính xác, tốt nhất bạn sẽ ở trong tình huống không ai được phép thay đổi mã đó hoặc thêm các tính năng cho nó; làm như vậy sẽ làm mất hiệu lực bằng chứng của bạn. Như đã được nhấn mạnh trong câu trả lời này, các bài kiểm tra cho phép bạn tự tin thay đổi mã của mình. Ngay cả khi người thay đổi nó là một thực tập viên thiếu kinh nghiệm. Nhân tiện, ngay cả khi một số khối mã đúng 100% không có nghĩa là bạn sẽ không bao giờ cần phải thay đổi nó (ví dụ: để thêm một tính năng mới cần thiết cho khách hàng hoặc để đáp ứng một số ràng buộc trong thế giới thực không được xem xét trong bằng chứng của bạn).
Brandin

5

Chúng tôi không biết. Chúng tôi không thể trả lời câu hỏi của bạn.

Trong khi bạn dành nhiều thời gian để giải thích quá trình mà bây giờ bạn có vẻ làm việc để làm hài lòng tất cả mọi người, bạn chỉ nói với chúng tôi những điều nhỏ nhặt về những gì đang thực sự xảy ra.

Từ kinh nghiệm của tôi, những gì bạn đang mô tả là rất hiếm và tôi nghi ngờ rằng đó thực sự là quá trình và cách tiếp cận của bạn để mã hóa thực sự là nguyên nhân của số lượng lỗi thấp trong các ứng dụng của bạn. Có thể có nhiều yếu tố khác ảnh hưởng đến ứng dụng của bạn và bạn không cho chúng tôi biết gì về những yếu tố đó.

Vì vậy, chúng tôi không biết, trước khi không biết môi trường và văn hóa phát triển chính xác của bạn, liệu TDD có giúp bạn hay không. Và chúng ta có thể dành nhiều ngày để thảo luận và tranh luận về nó.

Chỉ có một đề nghị chúng tôi có thể cung cấp cho bạn: hãy thử. Thí nghiệm. Học nó. Tôi biết bạn đang cố gắng dành ít nỗ lực nhất để quyết định, nhưng điều đó là không thể. Nếu bạn thực sự muốn biết liệu TDD có hoạt động trong ngữ cảnh của bạn hay không, cách duy nhất để tìm hiểu là thực sự làm TDD. Nếu bạn thực sự học nó và áp dụng nó vào ứng dụng của mình, bạn có thể so sánh nó với quy trình không TDD của bạn. Có thể TDD thực sự có lợi thế và bạn quyết định giữ nó. Hoặc có thể phát hiện ra rằng TDD không mang lại điều gì mới và chỉ làm bạn chậm lại. Trong trường hợp đó, bạn có thể quay lại quy trình trước đó của bạn.


5

Mục đích chính của các bài kiểm tra (đơn vị) là bảo vệ mã, đảm bảo nó sẽ không bị phá vỡ vì những thay đổi sau này. Khi mã được viết lần đầu tiên, nó sẽ được chú ý rất nhiều và nó sẽ được xem xét kỹ lưỡng. Và bạn có thể có một số hệ thống ưu việt cho điều đó.

Sáu tháng sau, khi một người khác đang làm việc với một thứ gì đó dường như không liên quan, nó có thể bị phá vỡ và người cung cấp mã chính xác siêu lừa đảo của bạn sẽ không nhận thấy điều đó. Một bài kiểm tra tự động sẽ.


1
Đây là một cái gì đó là quá thường xuyên bị bỏ qua. Có, có đau đớn để đi qua để đảm bảo mã có các bài kiểm tra đơn vị ngay bây giờ. Nhưng điều này sẽ tự trả nhiều lần khi một nhà phát triển cơ sở thực hiện một thay đổi đơn giản và đơn vị kiểm tra ngay lập tức gắn cờ rằng họ đã phá vỡ thứ khác. Tôi đã là đàn em hàng chục năm trước đã phá vỡ một cái gì đó và toàn bộ bản phát hành đã bị trì hoãn. Trong khi các đồng nghiệp của tôi rất khoan dung vào thời điểm đó và đã quay lưng lại khi các nhà quản lý bắt đầu nhảy lên nhảy xuống, toàn bộ kịch bản có thể, đã được tránh, nếu các bài kiểm tra đơn vị đã được thực hiện.
Robbie Dee

5

Tôi muốn áp dụng các thực tiễn TDD cho cơ sở mã này mà không có chúng cho đến bây giờ.

Đây là cách khó nhất để học TDD. Bạn kiểm tra càng muộn thì càng tốn nhiều chi phí để viết bài kiểm tra và bạn càng ít thoát khỏi việc viết chúng.

Tôi không nói rằng không thể trang bị thêm các bài kiểm tra vào một cơ sở mã hiện có. Tôi đang nói làm như vậy không có khả năng biến bất kỳ ai thành tín đồ TDD. Đây là công việc khó khăn.

Thực sự tốt nhất để thực hành TDD lần đầu tiên trên một cái gì đó mới và ở nhà. Bằng cách đó bạn học được nhịp điệu thực sự. Làm điều này đúng và bạn sẽ thấy nó gây nghiện.

Câu hỏi đặt ra như sau: TDD có nên được áp dụng cho mọi mô-đun không,

Đó là tư duy cấu trúc. Bạn không nên nói những thứ như kiểm tra mọi chức năng, hoặc lớp hoặc mô-đun. Những ranh giới đó không quan trọng để thử nghiệm và dù sao họ cũng có thể thay đổi. TDD là về việc thiết lập một nhu cầu hành vi có thể kiểm chứng và không quan tâm đến việc nó hài lòng như thế nào. Nếu không, chúng tôi không thể tái cấu trúc.

hoặc nó sẽ là đủ để áp dụng chúng cho chỉ các mô-đun không được chứng minh là đúng?

Thế là đủ để áp dụng chúng khi bạn thấy cần chúng. Tôi sẽ bắt đầu với mã mới. Bạn sẽ nhận lại được nhiều hơn từ việc kiểm tra sớm hơn là muộn. Đừng làm điều này tại nơi làm việc cho đến khi bạn thực hành đủ để thành thạo nó ở nhà.

Khi bạn cho thấy TDD có hiệu quả với mã mới tại nơi làm việc và cảm thấy đủ tự tin để tiếp nhận mã cũ tôi sẽ bắt đầu với mã đã được chứng minh. Lý do là vì bạn sẽ có thể nhìn thấy ngay nếu các bài kiểm tra bạn viết đang thực hiện theo hướng tốt.

Câu hỏi chính của tôi là: TDD sẽ phục vụ bất kỳ mục đích nào cho mã, nếu tôi đã có thể chứng minh tính chính xác của mã?

Các xét nghiệm không chỉ chứng minh tính đúng đắn. Họ thể hiện ý định. Họ cho thấy những gì cần thiết. Họ chỉ ra một con đường để thay đổi. Một bài kiểm tra tốt cho biết có một số cách để viết mã này và có được những gì bạn muốn. Họ giúp các lập trình viên mới thấy những gì họ có thể làm mà không phá vỡ mọi thứ.

Chỉ một khi bạn có được điều đó, bạn nên đi lang thang vào mã chưa được chứng minh.

Một cảnh báo chống lại những người quá khích: Bạn có vẻ như bạn đã đạt được thành công và do đó sẽ không thể nhảy vào đầu. Nhưng những người khác đang tìm cách chứng minh bản thân họ sẽ không được bảo lưu như vậy. TDD có thể bị quá liều. Thật dễ dàng để tạo ra một bộ các thử nghiệm thực sự gây tổn hại cho việc tái cấu trúc vì chúng khóa các thứ vô giá trị và vô nghĩa. Làm thế nào điều này xảy ra? Bởi vì những người muốn thể hiện các bài kiểm tra chỉ viết bài kiểm tra và không bao giờ tái cấu trúc. Giải pháp? Làm cho họ tái cấu trúc. Làm cho họ đối phó với các thay đổi tính năng. Càng sớm càng tốt. Điều đó sẽ cho bạn thấy các bài kiểm tra vô dụng một cách nhanh chóng. Bạn chứng minh sự linh hoạt bằng cách uốn cong.

Một cảnh báo chống phân loại cấu trúc: Một số người sẽ nhấn mạnh rằng một lớp là một đơn vị. Một số người sẽ gọi bất kỳ bài kiểm tra nào với hai lớp là bài kiểm tra tích hợp. Một số người sẽ nhấn mạnh rằng bạn không thể vượt qua ranh giới x và gọi đó là bài kiểm tra đơn vị. Thay vì quan tâm đến bất kỳ điều gì tôi khuyên bạn nên quan tâm đến cách kiểm tra của bạn. Nó có thể chạy trong một phần của giây không? Nó có thể được chạy song song với các thử nghiệm khác (tác dụng phụ miễn phí) không? Nó có thể được chạy mà không cần khởi động hoặc chỉnh sửa những thứ khác để đáp ứng các phụ thuộc và điều kiện tiên quyết? Tôi đặt những cân nhắc này lên trước nếu nó nói chuyện với DB, hệ thống tệp hoặc mạng. Tại sao? Bởi vì ba vấn đề cuối cùng chỉ là vấn đề vì chúng gây ra những vấn đề khác. Nhóm các bài kiểm tra của bạn với nhau dựa trên cách bạn có thể mong đợi chúng hành xử. Không phải ranh giới họ xảy ra để vượt qua. Sau đó, bạn biết những gì bạn có thể mong đợi mỗi bộ thử nghiệm để làm.

Tôi đã thấy mọi người nói rằng họ không muốn sử dụng TDD vì nó sẽ có quá nhiều chi phí và những người ủng hộ TDD bảo vệ điều đó bằng cách nói rằng một khi bạn đã quen viết TDD mọi lúc thì không có quá nhiều chi phí.

Câu hỏi đó đã có câu trả lời ở đây .


1

Test Driven Development liên quan nhiều đến việc tạo mẫu và động não một API, hơn là thử nghiệm. Các xét nghiệm được tạo ra thường có chất lượng kém và cuối cùng phải bị loại bỏ. Ưu điểm chính của TDD là xác định cách sử dụng API trước khi viết triển khai API. Lợi thế này cũng có thể có được theo những cách khác, ví dụ bằng cách viết tài liệu API trước khi thực hiện.

Bằng chứng chính xác luôn có giá trị hơn các bài kiểm tra. Các xét nghiệm không chứng minh bất cứ điều gì. Tuy nhiên, để sử dụng bằng chứng chính xác một cách hiệu quả, cần phải có trình kiểm tra bằng chứng tự động và bạn sẽ cần phải sử dụng các hợp đồng thuộc loại nào đó (thiết kế theo hợp đồng hoặc thiết kế dựa trên hợp đồng).

Trước đây, khi làm việc trên các phần quan trọng của mã, tôi sẽ thử bằng chứng chính xác thủ công. Ngay cả bằng chứng không chính thức cũng có giá trị hơn bất kỳ bài kiểm tra tự động nào. Nhưng bạn vẫn cần các bài kiểm tra, trừ khi bạn có thể tự động hóa bằng chứng của mình, vì mọi người sẽ phá mã của bạn trong tương lai.

Kiểm tra tự động không ngụ ý TDD.


Động não một API và thiết kế theo hợp đồng đã là cách tôi tiếp cận vấn đề, vì vậy tôi muốn nói rằng tôi thích câu trả lời của bạn, nhưng các nguồn khác nói "Trong phát triển dựa trên thử nghiệm, mỗi tính năng mới bắt đầu bằng cách viết thử nghiệm". Bạn nói những điều mà tôi đồng ý, nhưng không thuyết phục tôi sử dụng phương pháp TDD. "Các bài kiểm tra tự động không ngụ ý TDD", ok, nhưng sau đó, TDD ngụ ý gì, trái ngược với việc chỉ đơn giản là tuân theo các thực tiễn tốt nhất chung?
Kylee

1
Mặc dù tôi đồng ý rằng TDD thường liên quan đến việc động não một API, IMO, điều này đôi khi là một điều tồi tệ . API không nên được thiết kế (nhất thiết) để kiểm tra, nó nên được thiết kế để khách hàng của bạn sử dụng trơn tru và có ý nghĩa với các lớp / mã liên quan. Rất thường xuyên tôi đã thấy một người viết bài kiểm tra nói "hãy thêm String getSomeValue()vào đây để chúng tôi có thể kiểm tra nó" khi điều đó không có ý nghĩa gì đối với thiết kế tổng thể. Chắc chắn, bạn có thể loại bỏ chức năng đó sau, nhưng, theo kinh nghiệm của tôi, điều đó rất hiếm.
user949300

1
@ user949300, Có một sự chồng chéo lớn giữa việc thiết kế API có thể kiểm tra và một API được thiết kế để khách hàng của bạn sử dụng trơn tru. Thêm mã không cần thiết cho mục đích thử nghiệm cho thấy bạn có một thiết kế xấu. Tất cả quá thường xuyên, người viết API quên mất việc gỡ lỗi những gì đang xảy ra với API. Viết một cái gì đó có thể kiểm tra VÀ hữu ích cho người dùng buộc bạn phải suy nghĩ về những điều đó ... mà không rò rỉ chi tiết triển khai vào giao diện của bạn.
Berin Loritsch

@ user949300 Khiếu nại số một về TDD có lẽ là cách API được sửa đổi cho "khả năng kiểm tra", theo nghĩa đơn vị, sao cho những thứ thường được gói gọn được phơi bày. Khiếu nại số hai có lẽ là nó không mở rộng theo thời gian.
Frank Hileman

@Kylee Các bài kiểm tra tự động cũ hơn từ thông dụng "TDD". Sự khác biệt là các bài kiểm tra tự động chỉ đơn giản là những gì bạn nghĩ nên được kiểm tra - không có giáo điều, cũng không có thứ tự cụ thể mà bạn viết chúng. Cũng không có bất kỳ sự nhấn mạnh về các bài kiểm tra đơn vị so với tích hợp.
Frank Hileman

0

A) Bạn đọc mã và tự thuyết phục bản thân rằng nó chính xác không phải từ xa để chứng minh nó đúng. Nếu không thì tại sao lại viết bài kiểm tra?

B) Khi bạn thay đổi mã bạn muốn chạy thử nghiệm chứng minh mã vẫn đúng hay không.


điều này dường như chỉ lặp lại các điểm được thực hiện (và được giải thích tốt hơn nhiều) trong câu trả lời hàng đầu đã được đăng vài tuần trước
gnat

@gnat Đó là một phản ứng ngắn gọn hơn cho một cái gì đó không cần một cuốn tiểu thuyết viết về nó. Hãy cố gắng đóng góp một cái gì đó ở đây.
Josh

-1

Tôi sẽ cảnh báo bằng cách nói rằng một khi bạn đã quen với việc sử dụng TDD một cách hiệu quả, nó sẽ giúp bạn tiết kiệm thời gian trong trò chơi kết thúc. Cần thực hành để học cách sử dụng TDD một cách hiệu quả và không giúp ích gì khi bạn đang trong thời gian khủng hoảng. Khi tìm hiểu cách sử dụng nó tốt nhất, tôi khuyên bạn nên bắt đầu một dự án cá nhân nơi bạn có nhiều thời gian hơn và ít áp lực lịch trình hơn.

Bạn sẽ thấy rằng tiến trình ban đầu của bạn chậm hơn trong khi bạn đang thử nghiệm nhiều hơn và viết API của bạn. Theo thời gian, tiến trình của bạn sẽ nhanh hơn khi các thử nghiệm mới của bạn bắt đầu trôi qua mà không thay đổi mã và bạn có cơ sở rất ổn định để xây dựng từ đó. Trong trò chơi muộn, mã không được xây dựng bằng TDD yêu cầu bạn phải dành nhiều thời gian hơn cho trình gỡ lỗi khi bạn cố gắng tìm ra điều gì đang xảy ra sai hơn là cần thiết. Bạn cũng có nguy cơ cao hơn trong việc phá vỡ thứ gì đó đã từng làm việc với những thay đổi mới. Đánh giá hiệu quả của TDD so với việc không sử dụng nó theo tổng thời gian để hoàn thành.

Điều đó nói rằng, TDD không phải là trò chơi duy nhất trong thị trấn. Bạn có thể sử dụng BDD sử dụng một cách tiêu chuẩn để thể hiện hành vi của ứng dụng toàn ngăn xếp và đánh giá tính chính xác của API từ đó.

Toàn bộ đối số của bạn xoay quanh "việc chứng minh tính chính xác của mã", vì vậy bạn cần một cái gì đó xác định tính chính xác của mã. Nếu bạn không sử dụng một công cụ tự động để định nghĩa "chính xác" nghĩa là gì, thì định nghĩa này rất chủ quan. Nếu định nghĩa chính xác của bạn dựa trên sự đồng thuận của các đồng nghiệp, điều đó có thể thay đổi vào bất kỳ ngày nào. Định nghĩa của bạn về các nhu cầu chính xác phải cụ thể và có thể kiểm chứng, điều đó cũng có nghĩa là nó sẽ có thể được đánh giá bằng một công cụ. Tại sao không sử dụng một?

Chiến thắng số 1 từ việc sử dụng thử nghiệm tự động dưới bất kỳ hình thức nào, là bạn có thể xác minh mã của mình vẫn chính xác ngay cả khi các bản vá hệ điều hành được áp dụng nhanh chóng và hiệu quả. Chạy bộ phần mềm của bạn để đảm bảo mọi thứ đều trôi qua, sau đó áp dụng bản vá và chạy lại bộ phần mềm. Thậm chí tốt hơn, làm cho nó một phần của cơ sở hạ tầng xây dựng tự động của bạn. Bây giờ bạn có thể xác minh mã của mình vẫn đúng sau khi hợp nhất mã từ nhiều nhà phát triển.

Kinh nghiệm của tôi khi sử dụng TDD đã đưa tôi đến những kết luận sau:

  • Thật tuyệt vời cho mã mới, khó thay đổi hệ thống cũ
  • Bạn vẫn phải biết những gì bạn đang cố gắng thực hiện (tức là có kế hoạch)
  • Bắt đầu chậm, nhưng tiết kiệm thời gian sau
  • Buộc bạn phải suy nghĩ về cách xác thực tính chính xác và gỡ lỗi từ góc độ người dùng

Kinh nghiệm của tôi khi sử dụng BDD đã đưa tôi đến những kết luận sau:

  • Nó hoạt động cho cả di sản và mã mới
  • Nó xác nhận toàn bộ ngăn xếp và xác định đặc tả
  • Chậm hơn để đứng dậy và chạy (giúp có người biết bộ công cụ)
  • Ít hành vi cần được xác định hơn so với kiểm tra đơn vị

Định nghĩa chính xác: Mã của bạn tuân thủ các yêu cầu. Điều này được xác minh tốt nhất với BDD, cung cấp một phương tiện để thể hiện các yêu cầu đó theo cách dễ đọc của con người và xác minh chúng trong thời gian chạy.

Tôi không nói về tính đúng đắn trong các bằng chứng toán học, điều này là không thể. Và tôi mệt mỏi khi có lý lẽ đó.


Một bài đăng tuyệt vời đề cập đến một vấn đề khiến tôi coi TDD bắt đầu bằng: định nghĩa hiện tại về "tính chính xác của mã" thực sự là sự đồng thuận của các đồng nghiệp. Mối quan tâm của tôi là khi nhóm thay đổi trong tương lai, phương pháp này sẽ ngừng hoạt động. Nhưng, TDD sẽ giải quyết vấn đề này như thế nào? Mặc dù các thử nghiệm cũ có thể cứu các thành viên nhóm mới khỏi việc phá vỡ chức năng cũ một cách dễ dàng, họ vẫn có thể viết các thử nghiệm chưa hoàn chỉnh cho các tính năng trong tương lai, điều đó vẫn sẽ dẫn đến các vấn đề. Cuối cùng, cả hai phương pháp đều dựa vào việc tin tưởng vào nhóm của bạn. Tôi chưa nghe nói về BDD trước đây, vì vậy cũng sẽ kiểm tra điều đó. Cảm ơn.
Kylee

2
"Bạn có thể xác minh mã của bạn vẫn đúng" Không. Thậm chí không gần gũi. Nhiều nhất bạn có thể tuyên bố rằng bài kiểm tra mà bạn đã chạy vẫn vượt qua.
Bent

@Kylee, địa chỉ BDD quan tâm tốt hơn. BDD có bạn viết một thông số có thể kiểm chứng được. Thông số kỹ thuật được viết bằng ngôn ngữ tự nhiên của bạn với các phương tiện tạo móc nối với mã kiểm tra thực tế để xác minh thông số kỹ thuật. Đó là cầu nối hai mối quan tâm, truyền đạt các yêu cầu thực tế và thực thi chúng.
Berin Loritsch

1
@Bent, Xin đừng tranh luận về "tính đúng đắn" về mặt bằng chứng toán học. Đó không phải là chủ đề của cuộc trò chuyện hay những gì tôi dự định truyền đạt. Tuy nhiên, dựa trên kinh nghiệm những người đăng bình luận như của bạn có xu hướng có ý nghĩ đó. Bạn hoàn toàn có thể xác minh rằng mã tuân thủ các yêu cầu. Đó là định nghĩa làm việc của chính xác mà tôi đang nói về.
Berin Loritsch

Vấn đề là, bạn đang lái xe đến một định nghĩa "chính xác", trong đó yêu cầu là mã vượt qua các bài kiểm tra bạn đã xác định. Bất kỳ tập hợp đầu vào nào khác là hành vi không xác định và đầu ra là tùy ý. Điều này không thực sự phù hợp với những gì hầu hết người dùng sẽ coi là yêu cầu.
Simon B
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.