Là 100% mã bảo hiểm là một giấc mơ ống?


28

Có khả thi để mong đợi phạm vi bảo hiểm 100% mã trong các ứng dụng web jquery / backbonejs nặng không? Có hợp lý không khi chạy nước rút do phạm vi bảo hiểm 100% không được đáp ứng khi phạm vi bảo hiểm mã thực tế dao động khoảng 92% -95% trong javascript / jquery?


7
Một lần thất bại trong cuộc đua nước rút Nghe có vẻ đáng ngại kỳ lạ
Donal Fellows

5
Đó là một tiệm cận.
Robert Harvey

12
ngay cả khi bạn có phạm vi bảo hiểm đầy đủ, một số lỗi sẽ không được tìm thấy, vì vậy đừng dựa vào số đó để khắc phục mọi thứ
ratchet freak

11
Mọi thứ đều có thể. Câu hỏi thực sự là liệu giá trị của bảo hiểm mã 100% có xứng đáng với chi phí về thời gian và tài nguyên hay không.
JohnFx

5
Tại sao bạn lại lo lắng về điều này, khi giả định cơ bản - rằng phạm vi kiểm tra tự động 100% (hoặc bất kỳ số nào khác) sẽ làm cho mã của bạn trở nên tốt hơn - chính là một giấc mơ ống?
Mason Wheeler

Câu trả lời:


30

Nó là thực tế không kém vì nó là không thực tế.

Thực tế
Nếu bạn có kiểm tra tự động đã được hiển thị để bao gồm toàn bộ cơ sở mã, thì việc nhấn mạnh vào phạm vi bảo hiểm 100% là hợp lý.
Nó cũng phụ thuộc vào mức độ quan trọng của dự án. Càng quan trọng, càng hợp lý để mong đợi / yêu cầu bảo hiểm mã hoàn chỉnh.
Làm điều này dễ dàng hơn cho các dự án nhỏ và vừa.

Không thực tế
Bạn đang bắt đầu ở mức bảo hiểm 0% ...
Dự án rất quái dị với nhiều, nhiều đường dẫn lỗi khó tạo lại hoặc kích hoạt.
Ban quản lý không sẵn sàng cam kết / đầu tư để đảm bảo bảo hiểm có ở đó.

Tôi đã làm việc trong toàn bộ các dự án từ không có bảo hiểm đến phong nha. Không bao giờ là một dự án với 100%, nhưng chắc chắn đã có lúc tôi ước chúng tôi có phạm vi bảo hiểm gần hơn 100%.
Cuối cùng câu hỏi là nếu phạm vi bảo hiểm hiện có đáp ứng đủ các trường hợp cần thiết để nhóm có thể thoải mái vận chuyển sản phẩm.

Chúng tôi không biết tác động của sự thất bại đối với dự án của bạn, vì vậy chúng tôi không thể nói nếu 92% hoặc 95% là đủ, hoặc nếu 100% đó thực sự cần thiết. Hoặc đối với vấn đề đó, 100% kiểm tra đầy đủ tất cả mọi thứ bạn mong đợi.


30
... Và chỉ vì bạn có phạm vi bảo hiểm mã 100% không có nghĩa là bạn có phạm vi bảo hiểm 100% chi nhánh, do đó, ngay cả với phạm vi bảo hiểm mã 100%, bạn có thể bị thiếu rất nhiều.
Bryan Oakley

3
+1 cho quy mô dự án. Việc chia nhỏ thành các thành phần nhỏ hơn, có thể tái sử dụng và kiểm tra được đã cho phép chúng tôi đạt được phạm vi bảo hiểm ~ 95%. Bảo hiểm 100% là không cần thiết. Kiểm thử tích hợp nên bao gồm các khoảng trống kiểm tra đơn vị.
Apoorv Khurasia

5
@BryanOakley ... và cả các bài kiểm tra của bạn có thể là vô nghĩa, hoặc thậm chí không kiểm tra bất cứ điều gì
David_001

5
@BryanOakley Và thậm chí với độ bao phủ 100% chi nhánh, có thể một sự kết hợp nhất định của các chi nhánh có thể gây ra sự cố. (ví dụ, hai câu lệnh IF liên tiếp có thể được phân nhánh vào và xung quanh trong các thử nghiệm riêng biệt, nhưng thiếu một thử nghiệm đi vào cả hai . Bảo hiểm toàn nhánh, nhưng một đường dẫn thực hiện bị bỏ qua)
Izkata

4
Ngay cả phạm vi bảo hiểm 100% chi nhánh, bao gồm tất cả các đường dẫn thực hiện là không đủ. Có thể một số lỗi chỉ xảy ra khi bạn lấy một số kết hợp của các nhánh bạn có một số đầu vào bên ngoài, giả sử một ngày không đúng. Không có khả năng tất cả các trường hợp sẽ được bảo hiểm. Đồng thời, người ta có thể có một sự tự tin tốt với phạm vi bảo hiểm dưới 100% nhưng các trường hợp cạnh được chọn phù hợp làm đầu vào.
Andrea

32

Ai kiểm tra các bài kiểm tra?

Nó rất ngây thơ ở mức tốt nhất và không thực tế ngay cả trong ý nghĩa lý thuyết và không thực tế trong ý nghĩa kinh doanh.

  • Nó là không thực tế với mã có độ phức tạp chu kỳ cao. Có quá nhiều biến số để bao quát mọi sự kết hợp.
  • Đó là không thực tế với mã là rất nhiều đồng thời. Mã này không mang tính quyết định, do đó bạn không thể bao gồm mọi điều kiện có thể xảy ra vì hành vi sẽ thay đổi trong mỗi lần chạy thử.
  • Theo nghĩa kinh doanh là không thực tế, nó chỉ thực sự trả cổ tức để viết các bài kiểm tra cho mã là mã đường dẫn quan trọng, đó là mã quan trọng và mã có thể thay đổi thường xuyên.

Kiểm tra mọi dòng mã không phải là mục tiêu tốt

Nó rất tốn kém để viết các bài kiểm tra, nó là mã phải được viết và tự kiểm tra, nó là mã phải được ghi lại trong những gì nó thực sự cố gắng kiểm tra, đó là mã phải được duy trì với những thay đổi logic kinh doanh và các bài kiểm tra thất bại vì chúng đã lỗi thời Duy trì kiểm tra tự động và tài liệu về chúng có thể tốn kém hơn đôi khi duy trì mã.

Điều này không có nghĩa là kiểm tra đơn vị và kiểm tra tích hợp không hữu ích, nhưng chỉ khi chúng có ý nghĩa và bên ngoài các ngành công nghiệp có thể giết người, việc thử và kiểm tra từng dòng mã trong cơ sở mã là vô nghĩa. Bên ngoài những kẻ giết người quan trọng này nhanh chóng tạo ra các căn cứ mã, không thể tính được lợi tức đầu tư tích cực mà bảo hiểm mã 100% sẽ đòi hỏi.

Vấn đề tạm dừng:

Trong lý thuyết tính toán, vấn đề tạm dừng là vấn đề xác định, từ mô tả chương trình máy tính tùy ý và đầu vào, liệu chương trình sẽ kết thúc chạy hay tiếp tục chạy mãi mãi.

Alan Turing đã chứng minh vào năm 1936 rằng một thuật toán chung để giải quyết vấn đề tạm dừng cho tất cả các cặp đầu vào chương trình có thể có thể tồn tại. Một phần quan trọng của bằng chứng là một định nghĩa toán học của máy tính và chương trình, được biết đến như một máy Turing; vấn đề tạm dừng là không thể giải quyết được trên các máy Turing. Đây là một trong những ví dụ đầu tiên của một vấn đề quyết định.

Vì bạn thậm chí không thể chứng minh một cái gì đó hoạt động 100%, tại sao thực hiện mục tiêu đó?

Rõ ràng và đơn giản, trong hầu hết các trường hợp, nó không có ý nghĩa kinh doanh.


7
đây thực sự cần phải là câu trả lời được chấp nhận. Bảo hiểm mã 100% gần như xấu bằng 0%.
Ryathal

1
"Có quá nhiều biến số để bao quát mọi sự kết hợp." Điều này không có gì để làm với bảo hiểm mã 100%. Nếu một dòng mã đủ quan trọng để được viết và nó đủ quan trọng để giữ xung quanh, thì điều đó đủ quan trọng để được bao phủ bởi một bài kiểm tra. Nếu nó không được bao phủ bởi một thử nghiệm, giả định an toàn duy nhất là nó không hoạt động. Đúng là đối với một số mã, nó không có ý nghĩa từ góc độ kinh doanh để kiểm tra nó. Đó là cùng một mã không có ý nghĩa từ quan điểm kinh doanh để viết.
still_dreaming_1

2
Vì vậy, bạn nghĩ rằng viết các trường hợp thử nghiệm để bao quát các hàm tạo getXXX()/setXXX()gán đơn giản đơn giản cho các đối tượng giá trị là một cách sử dụng tốt thời gian và tài nguyên, xin lỗi đó không phải là trường hợp thực tế và một ý kiến ​​cực kỳ ngây thơ thiếu kinh nghiệm trong thế giới thực để sao lưu nó. Hãy nhớ mã kiểm tra vẫn là mã phải được duy trì. Càng ít mã bạn viết để giải quyết vấn đề càng tốt trong mọi trường hợp .

Uhm "Không thực tế với mã có độ phức tạp chu kỳ cao. Có quá nhiều biến để bao quát mọi kết hợp." - tất nhiên, đó là lý do tại sao bạn phải chia mã như vậy thành các phần nhỏ hơn có độ phức tạp chu kỳ nhỏ và do đó dễ kiểm tra hơn. Tái cấu trúc theo cách đó là điều cần thiết để thử nghiệm - nó làm cho thử nghiệm dễ dàng hơn.
Predrag Stojadinović

17

Trong hầu hết các trường hợp, bảo hiểm mã 100% có nghĩa là bạn đã "lừa dối" một chút:

  • Các bộ phận phức tạp, thường xuyên thay đổi của hệ thống (như gui) đã được chuyển sang các mẫu khai báo hoặc DSL khác.
  • Tất cả các mã chạm vào các hệ thống bên ngoài đã được các thư viện cách ly hoặc xử lý.
  • Điều tương tự cũng xảy ra đối với bất kỳ sự phụ thuộc nào khác, đặc biệt là những trường hợp cần tác dụng phụ.

Về cơ bản, các phần khó kiểm tra đã được chuyển sang các khu vực mà chúng không nhất thiết được tính là "mã". Điều này không phải lúc nào cũng thực tế, nhưng lưu ý rằng độc lập với việc giúp bạn kiểm tra, tất cả các thực tiễn này làm cho cơ sở mã của bạn dễ dàng hoạt động hơn.


Làm thế nào là di chuyển mọi thứ để DSL gian lận?
back2dos

2
@ back2dos - Mặc dù bạn có thể kiểm tra đơn vị nói, các tập lệnh python được nhúng của bạn, bạn có thể không đơn vị kiểm tra các mẫu html hoặc CSS của bạn hoặc đếm các dòng trong chúng theo hướng ước tính phạm vi bảo hiểm.
Dan Monego

12

Để có một ví dụ ấn tượng, trong thế giới thực về độ bao phủ 100% chi nhánh , hãy xem Cách SQLite được kiểm tra .

Tôi nhận ra câu hỏi của bạn đặc biệt hỏi về javascript, một loại sản phẩm phần mềm hoàn toàn khác, nhưng tôi muốn mang lại nhận thức về những gì có thể được thực hiện với đủ động lực.


9

Bảo hiểm mã 100% cho các bài kiểm tra đơn vị cho tất cả các phần của một ứng dụng cụ thể là một giấc mơ xa vời, ngay cả với các dự án mới. Tôi ước nó là như vậy, nhưng đôi khi bạn không thể bao gồm một đoạn mã, bất kể bạn cố gắng trừu tượng hóa các phụ thuộc bên ngoài đến mức nào. Ví dụ: giả sử mã của bạn phải gọi một dịch vụ web. Bạn có thể ẩn các cuộc gọi dịch vụ web phía sau một giao diện để bạn có thể giả định phần đó và kiểm tra logic nghiệp vụ trước và sau dịch vụ web. Nhưng phần thực tế cần gọi dịch vụ web không thể được kiểm tra đơn vị (dù sao cũng rất tốt). Một ví dụ khác là nếu bạn cần kết nối với máy chủ TCP. Bạn có thể ẩn mã kết nối với máy chủ TCP phía sau giao diện. Nhưng mã kết nối vật lý với máy chủ TCP không thể được kiểm tra đơn vị, bởi vì nếu nó không hoạt động vì bất kỳ lý do gì thì điều đó sẽ khiến bài kiểm tra đơn vị thất bại. Và các bài kiểm tra đơn vị phải luôn luôn vượt qua, bất kể khi nào chúng được gọi.

Một nguyên tắc nhỏ là tất cả logic kinh doanh của bạn phải có phạm vi bảo hiểm 100% mã. Nhưng các phần phải gọi các thành phần bên ngoài, nó phải có độ bao phủ gần 100% mã nhất có thể. Nếu bạn không thể với tới thì tôi sẽ không đổ mồ hôi quá nhiều.

Quan trọng hơn nhiều, các bài kiểm tra có đúng không? Họ có phản ánh chính xác doanh nghiệp của bạn và các yêu cầu? Có phạm vi bảo hiểm mã chỉ để có phạm vi bảo hiểm mã không có nghĩa gì nếu tất cả những gì bạn làm là kiểm tra không chính xác hoặc kiểm tra mã không chính xác. Điều đó đang được nói, nếu các bài kiểm tra của bạn là tốt, thì có phạm vi bảo hiểm 92-95% là nổi bật.


1
Kiểm tra những gì xảy ra khi bạn nhận được các kết hợp lạ của các trường hợp lỗi và phản hồi không thành công có thể đặc biệt khó khăn.
Donal Fellows

Không hiểu hệ thống của bạn sẽ làm gì khi được trình bày với những vấn đề khó khăn này là một phần của sự hấp dẫn của thử nghiệm đơn vị? Ngoài ra, có một chút nhầm lẫn ở đây giữa kiểm tra đơn vị và kiểm tra tích hợp.
Peter Smith

liên kết này unit testingvới integration testing, mã kiểm tra mà bạn không viết là integrationkiểm tra. Ngăn xếp TCP nằm trong HĐH mà bạn không nên kiểm tra, bạn nên cho rằng nó đã được kiểm tra bởi ai đã từng viết nó.

4

Tôi muốn nói trừ khi mã được thiết kế với mục tiêu cụ thể là cho phép bảo hiểm thử nghiệm 100%, 100% có thể không đạt được. Một trong những lý do là nếu bạn viết mã phòng thủ - mà bạn nên - đôi khi bạn nên có mã xử lý các tình huống mà bạn chắc chắn không nên xảy ra hoặc không thể xảy ra do hiểu biết về hệ thống. Để bao gồm mã như vậy với các bài kiểm tra sẽ rất khó theo định nghĩa. Để không có mã như vậy có thể nguy hiểm - điều gì xảy ra nếu bạn sai và tình huống này xảy ra một lần trong số 256? Điều gì xảy ra nếu có một sự thay đổi ở nơi không liên quan khiến điều không thể thành có thể? Vv và viết một bài kiểm tra trả về "hết bộ nhớ", bao gồm mã đó có thể khó khăn. Đối với ứng dụng JS, nó có thể là mã hóa phòng thủ xung quanh các quirks DOM có thể có trong các trình duyệt khác nhau, các lỗi có thể xảy ra của các dịch vụ bên ngoài, v.v.

Vì vậy, tôi sẽ nói rằng một người nên cố gắng đạt gần 100% nhất có thể và có lý do chính đáng cho đồng bằng, nhưng tôi sẽ không thấy không nhận được chính xác 100% là thất bại. 95% có thể tốt trên một dự án lớn, tùy thuộc vào 5% là gì.


Chỉ vì mã không được chạy trong sản xuất trong các trường hợp thông thường không có nghĩa là nó không thể được viết theo cách để được chạy bởi các bài kiểm tra. Làm thế nào quan trọng là nó cho mã bất thường để chạy chính xác? Là nó đủ quan trọng để bao gồm nó bằng các bài kiểm tra? Tôi sẽ lập luận rằng nếu nó không đủ quan trọng để bao quát bằng các bài kiểm tra, thì nó không đủ quan trọng để xử lý trường hợp đó. Mã không cần kiểm tra là mã không cần tồn tại và cần được xóa.
still_dreaming_1

2

Nếu bạn đang bắt đầu với một dự án mới và bạn đang sử dụng một phương pháp thử nghiệm đầu tiên, thì việc bảo hiểm 100% mã theo nghĩa là tất cả mã của bạn sẽ được gọi vào một lúc nào đó đã bị xử tử. Tuy nhiên, bạn có thể không trực tiếp kiểm tra từng phương pháp hoặc thuật toán riêng lẻ do khả năng hiển thị của phương thức và trong một số trường hợp, bạn có thể không kiểm tra một số phương pháp thậm chí gián tiếp.

Việc kiểm tra 100% mã của bạn có khả năng là một bài tập tốn kém, đặc biệt nếu bạn chưa thiết kế hệ thống của mình để cho phép bạn đạt được mục tiêu này và nếu bạn đang tập trung nỗ lực thiết kế của mình vào khả năng kiểm tra, có lẽ bạn không đủ chú ý để thiết kế ứng dụng của bạn để đáp ứng các yêu cầu cụ thể của nó, đặc biệt khi dự án là một dự án lớn. Tôi xin lỗi, nhưng bạn đơn giản là không thể có cả hai cách mà không có gì bị xâm phạm.

Nếu bạn đang giới thiệu các thử nghiệm cho một dự án hiện có, nơi thử nghiệm chưa được duy trì hoặc bao gồm trước đó, thì không thể có được phạm vi bảo hiểm 100% mà không có chi phí của bài tập vượt quá nỗ lực. Điều tốt nhất bạn có thể hy vọng là cung cấp phạm vi kiểm tra cho các phần quan trọng của mã được gọi là nhiều nhất.

Có hợp lý không khi chạy nước rút do phạm vi bảo hiểm 100% không được đáp ứng khi phạm vi bảo hiểm mã thực tế dao động khoảng 92% -95% trong javascript / jquery?

Trong hầu hết các trường hợp, tôi sẽ nói rằng bạn chỉ nên xem nước rút của mình là "thất bại" nếu bạn chưa đạt được mục tiêu của mình. Trên thực tế, tôi không nghĩ rằng chạy nước rút là thất bại trong những trường hợp như vậy bởi vì bạn cần có khả năng học hỏi từ những lần chạy nước rút không đáp ứng mong đợi để có được kế hoạch của bạn ngay khi bạn xác định lần chạy nước rút. Bất kể, tôi không nghĩ rằng hợp lý khi coi phạm vi bảo hiểm là một yếu tố trong thành công tương đối của một lần chạy nước rút. Mục tiêu của bạn là chỉ cần làm đủ để mọi thứ hoạt động như được chỉ định và nếu bạn đang mã hóa thử nghiệm trước, thì bạn sẽ có thể cảm thấy tự tin rằng các thử nghiệm của mình sẽ hỗ trợ cho mục tiêu này. Bất kỳ thử nghiệm bổ sung nào bạn cảm thấy có thể cần thêm là phủ đường một cách hiệu quả và do đó, một chi phí bổ sung có thể giúp bạn hoàn thành việc chạy nước rút một cách thỏa đáng.


"Tôi xin lỗi, nhưng bạn đơn giản là không thể có cả hai cách mà không có gì bị xâm phạm." Điều đó không đúng. Bạn luôn có thể thu nhỏ lại các tính năng hoặc đi chậm hơn. Nếu một cái gì đó không đáng để thử nghiệm thì nó không đáng để viết. Nếu một dòng mã đủ quan trọng để giữ xung quanh, thì nó đủ quan trọng để kiểm tra. Nếu nó không đủ quan trọng để kiểm tra, nó không đủ quan trọng để giữ xung quanh. Giả định an toàn duy nhất của một dòng mã không được kiểm tra là nó không hoạt động.
still_dreaming_1

@ still_dreaming_1, bạn dường như đã ủng hộ tuyên bố của tôi và mâu thuẫn với chính mình. Thu nhỏ lại các tính năng hoặc thay đổi thời hạn của bạn là những thỏa hiệp, mỗi trong số đó có thể ảnh hưởng đến chi phí dự án và kỳ vọng của các bên liên quan. Việc kiểm tra mã kế thừa trước đây chưa được kiểm tra đầy đủ là vô cùng khó khăn, vì bạn phải hiểu không chỉ mã khi nó chạy, mà cả ý định của người tạo ban đầu và viết các bài kiểm tra nắm bắt hành vi mã kế thừa hiện tại không nhất thiết phải hiển thị mã này hoạt động hoàn toàn như nó được yêu cầu.
S.Robins

Tôi đoán quan điểm của tôi là thứ gì đó đã bị xâm phạm, các tính năng hoặc thay đổi chưa được tạo vì phát triển nhanh hơn, không phải là thỏa hiệp thực sự bởi vì nếu bạn mất bảo hiểm để di chuyển nhanh hơn, các tính năng và thay đổi đó có thể chỉ được giả định là không hoạt động đúng cách. Vậy thì điểm quan trọng của việc thực hiện những thay đổi đó hoặc thêm các tính năng đó là gì nếu việc chúng hoạt động đúng hay không không quan trọng? Nếu chúng không hoạt động đúng hay không, những thay đổi đó không cần phải được thực hiện và bây giờ sẽ được rút ra khỏi mã.
still_dreaming_1

Tôi không hoàn toàn tin vào điều đó nữa, hoặc ít nhất là tôi nhận ra khía cạnh thực tiễn của sự thật mà bạn đang nói, đặc biệt là trong một cơ sở mã di sản, vì vậy đó chỉ là một lời giải thích về điểm mà tôi đang cố gắng đưa ra vào thời điểm đó. Trên thực tế, bây giờ tôi hoàn toàn mâu thuẫn về việc thậm chí làm TDD mọi lúc trên một cơ sở mã mới, chứ chưa nói đến việc được bảo hiểm 100%. Một mặt, mọi hình thức logic và lý trí cho tôi biết cả hai điều đó đều tốt, nhưng trong thực tế, tôi dường như không thể làm cho nó thực tế. Vì vậy, một cái gì đó rất sai với thế giới lập trình, chúng ta cần một mô hình mới.
still_dreaming_1

1

Tôi không làm điều này như một vấn đề tất nhiên, nhưng tôi đã thực hiện nó trên hai dự án lớn. Nếu bạn đã có một khung cho các bài kiểm tra đơn vị được thiết lập bằng mọi cách, thì điều đó không khó, nhưng nó có thêm rất nhiều bài kiểm tra.

Có một số trở ngại đặc biệt mà bạn đang gặp phải đang ngăn cản bạn chạm vào những dòng cuối cùng? Nếu không, nếu nhận được bảo hiểm từ 95% đến 100% là đơn giản, vì vậy bạn cũng có thể thực hiện nó. Vì bạn đang ở đây hỏi, tôi sẽ giả định rằng có một cái gì đó. Đó là cái gì đó?


Đây là một trong những câu trả lời tốt nhất ở đây. Hỏi những gì đang ngăn chặn một dòng mã có thể dễ dàng che đậy là một câu hỏi hay. Làm cho các dòng được bảo hiểm sẽ buộc bạn phải cải thiện mã để thực hiện nó, vì vậy nó sẽ là một chiến thắng, chiến thắng.
still_dreaming_1

0

92% là tốt. Tôi cảm thấy rằng những câu hỏi thực sự là:

  • Bây giờ 92% là tiêu chuẩn 'mới'? Nếu lần chạy nước rút tiếp theo có 88% thử nghiệm, điều đó có ổn không? Đây thường là sự khởi đầu của các bộ thử nghiệm bị bỏ rơi.

  • Phần mềm hoạt động như thế nào và không có lỗi. Bạn có các bài kiểm tra vì những lý do này, không phải "vì mục đích kiểm tra"

  • Có một kế hoạch để quay trở lại và điền vào các bài kiểm tra còn thiếu?

  • Tại sao bạn thử nghiệm? Có vẻ như trọng tâm là% của dòng không có chức năng


"Phần mềm hoạt động như thế nào và không có lỗi" quan trọng như thế nào? Câu hỏi hay. Định nghĩa của một lỗi là gì? Một cái gì đó không hoạt động như dự định. Nếu một số mã không hoạt động chính xác thì không được viết. Toàn bộ điểm của mã là để nó hoạt động.
still_dreaming_1

0

Martin Fowler viết trong blog của mình :I would be suspicious of anything like 100% - it would smell of someone writing tests to make the coverage numbers happy, but not thinking about what they are doing.

Tuy nhiên, thậm chí có những tiêu chuẩn bắt buộc bảo hiểm 100% ở cấp đơn vị. Ví dụ, đó là một trong những yêu cầu trong các tiêu chuẩn của cộng đồng vũ trụ châu Âu (ECSS, Hợp tác châu Âu về tiêu chuẩn hóa không gian). Bài viết được liên kết ở đây , kể một câu chuyện thú vị về dự án có mục tiêu đạt 100% kiểm tra trong một phần mềm đã hoàn thành. Nó dựa trên các cuộc phỏng vấn với các kỹ sư có liên quan đã phát triển các bài kiểm tra đơn vị.

Một số bài học là:

  • Bảo hiểm 100% là bất thường nhưng có thể đạt được
  • Bảo hiểm 100% đôi khi là cần thiết
  • Bảo hiểm 100% mang lại rủi ro mới
  • Đừng tối ưu hóa cho 100% đối xứng
  • Phát triển một chiến lược phù hợp để tối đa hóa phạm vi bảo hiểm
  • Bảo hiểm 100% không phải là điều kiện đủ cho chất lượng tốt

0

Có lẽ hỏi nếu khả thi và hợp lý không phải là câu hỏi hữu ích nhất để hỏi. Có lẽ câu trả lời thiết thực nhất là câu trả lời được chấp nhận. Tôi sẽ phân tích điều này ở cấp độ triết học hơn.

Bảo hiểm 100% sẽ là lý tưởng, nhưng lý tưởng, nó sẽ không cần thiết, hoặc sẽ dễ dàng hơn để đạt được. Tôi thích nghĩ về việc đó là tự nhiên và con người hơn là khả thi hay hợp lý.

Hành động lập trình chính xác là không thể với các công cụ ngày nay. Rất khó để viết mã hoàn toàn chính xác và không có lỗi. Nó chỉ là không tự nhiên. Vì vậy, không có tùy chọn rõ ràng nào khác, chúng tôi chuyển sang các kỹ thuật như TDD và bảo hiểm mã theo dõi. Nhưng miễn là kết quả cuối cùng vẫn là một quá trình không tự nhiên, bạn sẽ có một thời gian khó khăn để mọi người thực hiện nó một cách nhất quán và hạnh phúc.

Đạt được bảo hiểm mã 100% là một hành động không tự nhiên. Đối với hầu hết mọi người, buộc họ phải đạt được nó sẽ là một hình thức tra tấn.

Chúng ta cần các quy trình, công cụ, ngôn ngữ và mã ánh xạ tới các mô hình tinh thần tự nhiên của chúng ta. Nếu chúng tôi không làm điều này, không có cách nào để kiểm tra chất lượng thành sản phẩm.

Chỉ cần nhìn vào tất cả các phần mềm hiện nay. Hầu hết nó gây rối khá thường xuyên. Chúng tôi không muốn tin điều này. Chúng tôi muốn tin rằng công nghệ của chúng tôi là huyền diệu và làm cho chúng tôi hạnh phúc. Và vì vậy, chúng tôi chọn bỏ qua, xin lỗi và quên hầu hết các lần công nghệ của chúng tôi gây rối. Nhưng nếu chúng ta đánh giá trung thực mọi thứ, hầu hết các phần mềm hiện nay là khá nhảm nhí.

Dưới đây là một vài nỗ lực để làm cho mã hóa tự nhiên hơn:

https://github.com/jcoplien/trygve

https://github.com/still-dreaming-1/PurposefulPhp

Sau này là vô cùng không đầy đủ và thử nghiệm. Thực tế đó là một dự án tôi đã bắt đầu, nhưng tôi tin rằng nó sẽ là một bước tiến lớn cho nghề lập trình nếu tôi có thể tự mình dành thời gian cho nó để hoàn thành nó. Về cơ bản, ý tưởng là nếu các hợp đồng thể hiện các khía cạnh duy nhất của hành vi lớp mà chúng ta quan tâm và chúng ta đã thể hiện hợp đồng dưới dạng mã, tại sao không chỉ có định nghĩa lớp và phương thức cùng với hợp đồng. Theo cách đó, các hợp đồng sẽ là mã và chúng tôi không cần phải thực hiện tất cả các phương thức. Hãy để thư viện tìm ra cách tôn vinh các hợp đồng cho chúng tôi.


-2

Đạt 100% cho mã mới sẽ rất khả thi và nếu bạn đang thực hành TDD, bạn có thể sẽ đạt được điều đó theo mặc định vì bạn đang cố tình viết các bài kiểm tra cho mỗi dòng mã sản xuất.

Trên mã kế thừa hiện có được viết mà không có kiểm tra đơn vị thì có thể khó khăn vì thường mã kế thừa không được viết với kiểm tra đơn vị và có thể yêu cầu rất nhiều phép tái cấu trúc. Mức tái cấu trúc đó thường không thực tế do thực tế của rủi ro và lịch trình để bạn thực hiện đánh đổi.

Trong nhóm của tôi, tôi chỉ định phạm vi bảo hiểm mã 100% và nếu chúng tôi thấy ít hơn trong mã xem xét, chủ sở hữu kỹ thuật của thành phần thảo luận về lý do 100% không đạt được với nhà phát triển và phải đồng ý với lý do của nhà phát triển. Thông thường nếu có sự cố xảy ra 100%, nhà phát triển sẽ nói chuyện với chủ sở hữu kỹ thuật trước khi xem xét mã. Chúng tôi đã phát hiện ra rằng một khi bạn có thói quen và tìm hiểu các kỹ thuật để giải quyết một số vấn đề phổ biến với việc thêm các bài kiểm tra vào mã kế thừa, việc đạt 100% thường xuyên không khó như bạn nghĩ ban đầu.

Cuốn sách " Làm việc hiệu quả với Bộ luật kế thừa " của Michael Feather là vô giá đối với chúng tôi khi đưa ra các chiến lược để thêm các bài kiểm tra vào mã kế thừa của chúng tôi.


-3

Không, nó không thể và nó sẽ không bao giờ. Nếu có thể, tất cả toán học sẽ rơi vào chủ nghĩa hữu hạn. Ví dụ, làm thế nào bạn kiểm tra một hàm lấy hai số nguyên 64 bit và nhân chúng? Đây luôn là vấn đề của tôi khi thử nghiệm so với việc chứng minh một chương trình đúng. Đối với bất cứ điều gì ngoại trừ các chương trình tầm thường nhất, thử nghiệm về cơ bản là vô dụng vì nó chỉ bao gồm một số ít trường hợp. Nó giống như kiểm tra 1.000 số và nói rằng bạn đã chứng minh phỏng đoán Goldbach.


Oh! Vì vậy, ai đó buồn bã rằng tôi đã không trả lời vấn đề trên mặt phẳng của quan niệm của nó; kiểm tra là một sự lãng phí mà tôi không quan tâm nếu nó phổ biến. Nó sẽ không bao giờ hoạt động. Nó không thể. Các nhà khoa học máy tính thông minh nhất đã biết điều này (Dijkstra, Knuth, Hoare et al.). Tôi đoán rằng nếu bạn là một lập trình viên JavaScript đang lập trình eXtreme thì bạn không quan tâm đến những điều đó. Blah, sao cũng được, ai quan tâm thì viết mã crappy. Lãng phí CO ^ 2 chạy thử nghiệm của bạn. - Ý tôi là, ai có thời gian ngồi suy nghĩ nữa? Chúng tôi đã xuất nó sang máy tính.
ngớ ngẩn

3
Câu hỏi được gắn thẻ "TDD". TDD là một công cụ thiết kế và một công cụ thăm dò vấn đề hơn là một thử nghiệm và mỗi "thử nghiệm" chỉ là một ví dụ về cách mã sẽ hoạt động trong một số ngữ cảnh, để mọi người có thể đọc và hiểu những gì đang diễn ra, sau đó thay đổi nó một cách an toàn . TDD thực hiện tốt có xu hướng dẫn đến mã sạch hơn, dễ sử dụng hơn và chạy các bài kiểm tra chỉ kiểm tra xem tài liệu có hiện hành không. Hầu hết các bộ TDD hầu như không bao giờ bắt lỗi; đó không phải là những gì họ đang ở đó. Tôi nghĩ rằng bạn đang bị hạ thấp bởi vì câu trả lời của bạn phản bội sự thiếu hiểu biết và tôi hy vọng nhận xét này sẽ giúp ích cho điều đó.
Lunivore
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.